In the previous post I went a bit about the details as to why the older FirefoxDriver will no longer work with Firefox 48 and beyond.
In this one I’ll go deeper into the new Geckodriver usage.
#Mozilla recommends creating a new virtual #enviroment before installing Selenium virtualenv env_name source env_name/bin/activate
Then, just install Selenium using a pip command. Note that the minimum version of Selenium required is 2.46.1
pip install selenium
To be able to install Selenium, you will need to get the Ruby Gem.
gem install selenium-webdriver
npm install selenium-webdriver
Easiest way to install Selenium is by using Maven
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.0.0-beta2</version> </dependency>
Here you have 2 options, one by using a nuGet package or by downloading the .dlls from the Selenium site and adding them as a reference to the project.
At the time of this post writing, the nuGet package only has 2.53.1 as latest version, while by downloading the .dlls you’ll get 3.0.0-beta2.
Set up the Marionette executable
Just like Chrome, Opera, Internet Explorer or Microsoft Edge, from now Firefox will also require an executable that will run alongside the browser.
It can be downloaded from the Geckodriver Github release page, and Mozilla recommends that even though the project has been renamed to ‘geckodriver’, many of the Selenium users look for the old name ‘wires’. Because of that, the executable may need to be renamed to ‘wires’ in order to have it picked up automatically.
Add Marionette executable to system path
The Selenium client bindings will try to locate the geckodriver (or wires) executable from the system path therefore you will need to add the directory containing it to the system path.
Add Marionette executable to Windows system path
To add the Marionette executable to Windows system path you need update the Path system variable and add the full directory to the executable.
To do this, right-click on the Start menu and select System. On the left-side panel click Advanced system settings and then Environment Variables button from System Properties window. Now the only step left to do is to edit Path system variable and add the full directory to your geckodriver (you may need to add a semi-colon before doing this, if not already present) and you’re good to go.
Add Marionette executable to Unix system path
On Unix systems, you can just append the geckodriver to your system’s search path using bash command:
And now, for the fun part, to update the existing tests using Marionette.
Updating your existing Selenium tests to use the Marionette-based Geckodriver
To be able to use Marionette in your tests you will need to update your desired capabilities to use it.
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities firefoxCap = DesiredCapabilities.FIREFOX #we need to explicitly specify to use Marionette firefoxCap["marionette"] = True #and the path to firefox firefoxCap["binary"] = "path/to/firefox" driver = webdriver.Firefox(capabilities = firefoxCap)
#Selenium 3 uses Marionette by default when firefox is specified #To use it for Selenium 2, pass it by using marionette: true Selenium::WebDriver::Firefox::Binary.path = "path/to/firefox" driver = Selenium::WebDriver.for :firefox, marionette: true
const webdriver = require('selenium-webdriver'); const Capabilities = require('selenium-webdriver/lib/capabilities').Capabilities; var firefoxCap = Capabilities.firefox(); //for now it's required to tell the Node.js binding //to use Marionette firefoxCap.set('marionette', true); var driver = new webdriver.Builder().withCapabilities(firefoxCap).build();
DesiredCapabilities firefoxCap = DesiredCapabilities.firefox(); firefoxCap.setCapability("marionette", true); WebDriver driver = new FirefoxDriver(firefoxCap);
var driver = new FirefoxDriver(new FirefoxOptions());
Using RemoteWebDriver in your Selenium tests
If you want to use RemoteWebDriver in any language, the following will allow you to use Marionette in Selenium Grid.
firefoxCap = DesiredCapabilities.FIREFOX #we need to explicitly specify to use Marionette firefoxCap["marionette"] = True driver = webdriver.Firefox(capabilities = firefoxCap)
#Selenium 3 uses Marionette by default when firefox is specified #To use it for Selenium 2, pass it by using marionette: true firefoxCap = Selenium::WebDriver::Remote::Capabilities.firefox marionette: true, firefox_binary: "path/to/firefox" driver = Selenium::WebDriver.for :remote, desired_capabilities: firefoxCap
DesiredCapabilities firefoxCap = DesiredCapabilities.firefox(); firefoxCap.setCapability("marionette", true); WebDriver driver = new RemoteWebDriver(firefoxCap);
DesiredCapabilities firefoxCap = DesiredCapabilities.Firefox(); firefoxCap.SetCapability("marionette", true); var driver = new RemoteWebDriver(firefoxCap);