Selenium Server
New software release, selenium server, which expose a http server to which clients can connect using webdriver.Remote
and then use standard webdriver API to control the browser.
The server is made of :
- the "hub" to which webdriver connects
- a Xvfb server
- some nodes, for different browsers:
- Firefox 52
- Firefox 60
- Chrome 69
- an IPv6 https frontend, exposing the admin interface and the hub. Note that python's webdriver binding before 3.14.0 refuse to connect to a hub with a non verified SSL certificate, so for now clients must either use the published
backend-url
(which is IPv4) or use a version of selenium eggs >= 3.14. In the future we'll see how caucase can solve this. Also, this behavior might also change with future version of selenium, because it's wrong that it does not verify SSL certificates. - a ssh server, to which you can connect to establish a ssh tunnel with port forward and register more nodes to the hub. This can be used to connect a browser running on your desktop and see the test running, run unsupported browsers, maybe also appium to run tests on mobile. This is a kind of "extra feature" that seems working, but I'm not sure we can support it.
To achieve this, we had to :
- update Xorg components and build gtk with a X11 gdk backend to be able to run firefox 60. Updating xorg/gdk also fixed a bug in firefox 52, before this, firefox 52 was not able to get the screen size and
window.screen.width
was 0. Now firefox 52 can get the screen size properly but resizing window does not work. - update chrome 69 and fix a few missing
$LD_LIBRARY_PATH
in the wrapper.
Everything seems working, including taking screenshots, uploading files and resizing window - except resizing window does not work on firefox 52.
See the included test suite for some example usage. Basically it's same as what we're doing today, but instead of:
driver = webdriver.Firefox(path_to_firefox)
we use:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub', # the url or backend-url parameter published by the instance.
desired_capabilities={
'browserName': 'firefox', # or chrome
'version': '60', # or don't set a version if you want any version (browserName, on the other hand, is required)
})