Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ElementNotVisibleException when use headless Chrome browser

When I run test script in headless mode chrome browser, element link is not visible, is not able to do linkElement.click(). in head mode is everything OK. All other info are in stacktrace. Anyone knows what to do, please?

StackTrace:

ERROR occurred: Message: element not visible
(Session info: headless chrome=60.0.3112.90)
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.1.7601 SP1 x86_64)
Traceback (most recent call last):
File "C:\nik-x.py", line 148, in main
func(nik)
File "C:\lib\support.py", line 121, in wrapper
raise ret
File "C:\lib\support.py", line 108, in newFunc
res[0] = func(*args, **kwargs)
File "C:\testcases\nik-1003.py", line 37, in testcase
i.click()
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webelement.py", line 7
7, in click
self._execute(Command.CLICK_ELEMENT)
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webelement.py", line 4
93, in _execute
return self._parent.execute(command, params)
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 25
6, in execute
self.error_handler.check_response(response)
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line
194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: headless chrome=60.0.3112.90)
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.1.7601 SP1 x86_64)

Here is my piece of code:
icons = nik.elementLeftmenuSportIcons() for i in icons[:-1]: try: i.click()

HTML from testing page: <a href="#" class="default b_futbal gaPageEventElement" data-ga-cat="Sporty" data-ga-action="futbal"> <span class="left-menu-only-large-res">Futbal</span> </a>

like image 273
Ghost Avatar asked Aug 08 '17 08:08

Ghost


People also ask

What is happening when the browser is running in headless mode?

A headless browser is a web browser without a graphical user interface. Headless browsers provide automated control of a web page in an environment similar to popular web browsers, but they are executed via a command-line interface or using network communication.

What is the use of headless Chrome?

It provides the ability to control Chrome via external programs. The headless mode can run on servers without the need for dedicated display or graphics. It gets the name headless because it runs without the Graphical User Interface (GUI). The GUI of a program is referred to as the head.

Does headless Chrome run faster?

Headless Browsers are Faster than Real Browsers But you will typically see a 2x to 15x faster performance when using a headless browser. So if performance is critical for you, headless browsers may be a way to go.

Why do we use headless browser?

The reason behind using a headless browser or carrying out headless testing is that they are faster than the normal browsers. Since you are not opening the browser GUI, you can ignore the time taken by a normal browser to load CSS, JavaScript and render HTML.


2 Answers

Adding this here as a reference for the future, as I faced the same problem. The problem was that the website I was trying to access banned my IP and I was using PROXY_TOOL to access it.

In Full mode, it worked fine, but in Headless mode, it showed that it was unable to find an element. So, I took a screenshot with this function before it showed that it was unable to find an element. (Python 3.9.5)

    def get_screenshot(self, filename):
    screenshot_bytes = self.driver.get_screenshot_as_png()
    with open(filename, "wb") as file:
        file.write(screenshot_bytes)

After saving the screenshot I saw that site was giving an IP blocked error. So, I used PROXY_IP="127.0.0.1", PROXY_PORT=9666 as arguments. On which PROXY_TOOL was serving the proxy access. And it worked.

options.add_argument("--proxy-server=socks5://" + str(PROXY_IP) + ":" + str(PROXY_PORT))

Use the screenshot function to see what is visible on the website in headless mode. See what kind of problem there is if the element is not visible use window size adjustment to make it visible. And adjust according. This might not be the right answer but it is directed to the same problem.

like image 59
Fahim Chohan Avatar answered Oct 21 '22 05:10

Fahim Chohan


I think the problem is, that the Element is really not visible in the default viewbox (600x800) of Headless Chrome.

The window size of the Headless Browser must be set as a Argument when starting chrome. I'm using javascript (I think the API looks similar under python):

var Options = require('selenium-webdriver/chrome').Options;
var options = new Options();
options.addArguments('headless');
options.addArguments('disable-gpu');
options.addArguments('window-size=1200,1100');

browser = builder.forBrowser('chrome').setChromeOptions(options).build();

Additional Info

I'm setup up the window size also by webdriver with browser.manage().window().setSize(1200,1100); But this command is not sufficient in headless chrome. In the non headless variant this is working.

like image 31
powerpete Avatar answered Oct 21 '22 04:10

powerpete