Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium ChromeDriver - Run in background but not headless

I am looking for a way to run selenium tests with a chrome driver, in the background. With the background I mean as in, not the foreground focussed window. I can actually do this, but as soon as actions like opening a new tab or switching between windows (so basically switching window handles) happen in the chrome driver, the browser window gets pushed to the foreground.

So my question is, how can I prevent this from happening without running the test headless?

Any suggestions are appreciated, open for discussion.


EDIT

As a somewhat temporary solution I came up with the following.

Using the Windows 10 Virtual Desktops feature, I run the test and thus the chrome browser window in a seperate virual desktop. I then switch back to my main virtual desktop to continue with other tasks. This prevents the chrome browser window from being forced to the foreground.

Note that this still makes a flashing chrome icon appear in the taskbar when any of the actions described above appear.

Still looking for a more solid solution, so any suggestions are still appreaciated.


To hopefully open new perspectives and discussion points, and ultimately a solution, I will provide some more detailed info of what my code is doing.

I have 5 chrome webdrivers, and each of these webdrivers contains 6 tabs (WindowHandles). The idea is that a certain process has to be repeated continuously on each tab. So we loop over each webdriver, and within that webdriver over each tab and set this tab as the webdrivers current WindowHandle. This makes the chrome window visibly switch to the assigned tab.

After that switch has taken place, so basic selenium automation is performed on the content of the tab, after wich we repeat the whole process.

The actual issue seems to take place when a chrome webdriver switches to a new tab (WindowHandle), at this moment the chrome window containing the tab is pushed to the foreground and steals focus. Note that this does not always takes place, often it can switch tabs without any issues. So it is unclear wether there is another factor which would cause the window to steal focus.


EDIT 2

After doing the following:

I overloaded the selenium method which is used to switch between tabs (WindowHandles), and called SetWindoPos each time. Unfortunately this did not solve this issue either. I will try to look deeper into what might be causing this and will report back. – S. Van den Wyngaert

I went out for a few hours while running the tests, and came back to see that surprisingly I was still on my main Virtual Desktop (win10 feature). This means that the issue didn't occur during the time I was gone. I started working again, opened a chrome window and noticed that shortly after I did this, focus was stolen by one of the chrome driver's windows again.

What I conclude from this is that the issue only occurs when another chrome window (not opened by a chrome driver from code) is opened. I will keep investigating and will report back with updates.

After investigating this behavior for a few more hours I noticed that when another chrome window is open, as long as this has focus, the issue doesn't take place. So to quickly summarize this:

The issue doesn't take place when:

  • No other chrome windows (not selenium driven) are opened or minimised
  • Another chrome window (not selenium driven) is opened and has focus
  • Another application running fullscreen mode has focus

The issue does take place when:

  • Another chrome window (not selenium driven) is opened and has no focus

Note that when I talk about another chrome window I specificly mean a chrome window that is not driven by selenium, so a regular chrome window opened by the user.

like image 457
S. Van den Wyngaert Avatar asked Mar 13 '18 17:03

S. Van den Wyngaert


People also ask

Can you make Selenium run in the background?

Selenium Webdriver can run in the background, i.e. without opening a browser window, by running it in Headless mode. To do this you need to add the required capability to the set-up code for the driver.

How do I use Chrome driver in headless mode?

ChromeOptions options = new ChromeOptions() options. addArgument("headless"); ChromeDriver driver = new ChromeDriver(options); In the above code, the browser is instructed to run in the headless mode using the addArgument() method of the ChromeOptions class provided by the Selenium WebDriver.

How do I get rid of Chrome headless?

Be sure to remove headless from the User-Agent, use this site to determine your user agent. Use excludeSwitches to remove the "Chrome is being controlled by automated test software" if needed. Set resolution ("--window-size=1920,1080") or start maximized to set the same resolution you use on normal Chrome.


2 Answers

Easiest way would be to run a local selenium grid. Start your node(s) as a windows service. This way the test will run in the background, without being headless.

like image 67
Agent Shoulder Avatar answered Sep 18 '22 17:09

Agent Shoulder


Another good option to scale your solution, and if your machine has the capacity to run docker, is to use zalenium

It's a docker based, auto scaling, selenium-grid solution that works pretty quick out of the box.

You can watch your tests live via the management pages, watch a recording after the fact, pause/debug with live interaction via VNC. Also something to be said for not having the worry about changing browser versions.

Last time i used it, it had the odd bug and throws an end of stream error every now and then - but that was a good year ago.

like image 21
RichEdwards Avatar answered Sep 18 '22 17:09

RichEdwards