How to Run Selenium in Xvfb

What is difference between Xvfb and Chromedriver and when to use them

  1. chromedriver - to run tests on chrome browser (with GUI).
  2. Xvfb - to run tests in headless mode. can be any browser including chrome (Browser GUI won't be displayed, so you can use the machine for some other operations).

code snippets (python):

Chrome Driver (download here):

browser = webdriver.Chrome() // to launch tests in Chrome browser.

Xvfb - using pyvirtualdisplay (python wrapper for Xvfb) :

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

# now Chrome will run in a virtual display.
# you will not see the browser.
browser = webdriver.Chrome()
browser.get('http://www.google.com')
print browser.title
browser.quit()

display.stop()

References:

  1. How do I run Selenium in Xvfb?

How do I run Selenium in Xvfb?

open a terminal and run this command xhost +. This commands needs to be run every time you restart your machine. If everything works fine may be you can add this to startup commands

Also make sure in your /etc/environment file there is a line

export DISPLAY=:0.0 

And then, run your tests to see if your issue is resolved.

All please note the comment from sardathrion below before using this.

Using Selenium with Chrome 87 and xvfb causing a crooked screen

Ok, I figured this out. For some reason the new version of Chrome didn't like running in 16 bit color mode in XVFB.

I changed the color bit depth to 24 and the windows in the videos are showing correctly. Yay no more crooked screens!

How to properly configure the Selenium Maven Plugin to work with Xvfb to run headless

It turns out the 'start-server' and 'stop-server' goals are for starting/stopping SeleniumRC servers. This is NOT what I wanted, as all my tests use the WebDriver API instead.

Apparently the 'xvfb' goal in the pom DOES start an Xvfb session during the specified lifecycle phase - I guess I just didn't see it before. And in it's configuration, you specify where to write a props file detailing which display Xvfb is running on. In the Java code, this file can be read and the value passed to the FirefoxBinary used when creating the WebDriver.

The relevant pom.xml bits are as follows:

<properties>
<displayProps>target/selenium/display.properties</displayProps>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<display.props>${displayProps}</display.props>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>selenium-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>xvfb</id>
<phase>test-compile</phase>
<goals>
<goal>xvfb</goal>
</goals>
<configuration>
<displayPropertiesFile>${displayProps}</displayPropertiesFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

This starts Xvfb on the first free display (:20 or above) and writes the value to the props file that I read and use later in my Java code.

String xvfbPropsFile = System.getProperty("display.props");

FirefoxBinary ffox = new FirefoxBinary();
ffox.setEnvironmentProperty("DISPLAY", /*read value from xvfbPropsFile*/);
WebDriver driver = new FirefoxDriver(ffox);

Now the driver will be in control of the Firefox instance spun up in the appropriate display. Voila!

Can Xvfb be enabled in Jenkins declarative pipeline in order to execute Selenium headless tests

Yes you can, every job which is pipeline have a link on left side of job page "Pipeline Syntax" when you go there it will help you a lot for some non obvious cases. So, for your case: check this out



Related Topics



Leave a reply



Submit