webdriver.firefox.marionette& webdriver.gecko.driver

时间:2017-04-07 08:07:14

标签: selenium selenium-webdriver selenium-firefoxdriver geckodriver firefox-marionette

我现在正在学习Selenium并遇到了一个问题。

我知道Selenium默认支持旧的Firefox版本,没有驱动程序。对于最新版本的Firefox,我们必须下载驱动程序并使用System.setProperty定义它。

根据这个link,对于Firefox 45和46,启动驱动程序代码可能如下所示:

WebDriver driver = new FirefoxDriver();

我的Firefox是版本45.5.1。但是上面的代码仍然不起作用。所以根据这个link,我添加了:

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");

它有效。

然后我意识到我没有在我的计算机上安装geckodriver.exe。为了了解它如何发展,我已经改为以下代码:

System.setProperty("webdriver.firefox.marionette","");

它仍然有效。

所以,这是我的第一个问题:发生了什么?我确信我的环境中不存在geckodriver.exe。如果没有指出位置,那我为什么要设置属性?

另外,我看过代码如下:

System.setProperty("webdriver.gecko.driver", "/tools/marionette/wires.exe");

我的第二个问题是webdriver.gecko.driverwebdriver.firefox.marionettewires.exegeckodriver.exe之间有什么区别?

2 个答案:

答案 0 :(得分:39)

最高版本45(推送到版本47),用于自动化Firefox的驱动程序是每个客户端附带的扩展。但是这个扩展被删除了,可能是由于政策的变化,现在要求所有扩展都由Mozilla签名。

Marionette 是Firefox附带的新驱动程序。 该驱动程序具有自己的协议,与Selenium / WebDriver协议不直接兼容。

Gecko驱动程序(以前称为wire)是实现Selenium / WebDriver协议的应用程序服务器。 它翻译Selenium命令并将它们转发给 Marionette驱动程序

对于Java客户端,默认行为是使用Gecko驱动程序,但可以重写它以将旧版扩展名用作webdriver.firefox.marionette属性的驱动程序:

System.setProperty("webdriver.firefox.marionette", "false");

marionette能力通过FirefoxOptions

FirefoxOptions options = new FirefoxOptions()
  .setLegacy(true);

WebDriver driver = new FirefoxDriver(options);
// or with a remote server
WebDriver driver = new RemoteWebDriver(remoteUrl, options.toDesiredCapabilities());

或直接使用DesiredCapabilities

DesiredCapabilities capa = DesiredCapabilities.firefox();
capa.setCapability("marionette", false);

WebDriver driver = new FirefoxDriver(capa);
// or with a remote server
WebDriver driver = new RemoteWebDriver(remoteUrl, capa);

要定义Gecko驱动程序的位置,请将驱动程序放在PATH环境变量中的文件夹中,或者在属性webdriver.gecko.driver中定义位置:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");

或使用命令行中指定的属性启动远程服务器:

java -Dwebdriver.gecko.driver="C:\\geckodriver.exe" -jar selenium-server-standalone-3.4.0.jar

答案 1 :(得分:5)

Marionette是最新Firefox版本附带的新驱动程序。

但是,Geckodriver是使用W3C WebDriver兼容客户端与基于Gecko的浏览器进行交互的代理。 Geckodriver提供WebDriver协议描述的HTTP API,用于与Gecko浏览器进行通信,例如47以上的Firefox版本。

System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
WebDriver driver = new FirefoxDriver();

如果您仍然遇到问题(由于FF版本不兼容),您可以使用以下功能:

DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);