webdriver.firefox.marionette和webdriver.gecko.driver的区别

51

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

我知道Selenium默认支持旧版Firefox而不需要驱动程序。而对于最近的Firefox版本,我们必须下载驱动程序并使用System.setProperty进行定义。

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

WebDriver driver = new FirefoxDriver();

我的Firefox版本是45.5.1,但以上代码仍然无法工作。根据这个链接,我添加了:

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.marionette或者wires.exegeckodriver.exe有什么不同?

3个回答

43
从版本45到47(现在的版本)之前,用于自动化Firefox的驱动程序是随每个客户端提供的扩展。但这个扩展被删除了,可能是由于政策的改变,现在需要所有扩展都由Mozilla签名。 Marionette 是新的驱动程序,它与Firefox一起提供/包含。 该驱动程序具有其自己的协议,不能直接与Selenium/WebDriver协议兼容。 Gecko driver(以前称为wires)是一个应用服务器,实现Selenium/WebDriver协议。 它将Selenium命令进行转换并将其转发到 Marionette driver
对于Java客户端,默认行为是使用Gecko驱动程序,但可以通过webdriver.firefox.marionette属性重写,使用传统扩展作为驱动程序。
System.setProperty("webdriver.firefox.marionette", "false");

或者通过 FirefoxOptionsmarionette 功能:

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
Gecko驱动程序(之前称为wires)-非常感谢这个解释。它解答了一些误解。 - Peter M. - stands for Monica
我似乎找不到geckodriver的官方下载页面。你有链接存储在某个地方吗? - oldboy

30

在Firefox 47.x之前的版本中,传统的驱动程序被实现为Firefox扩展程序。每当WebDriver启动Firefox时,该扩展程序将安装在驱动程序使用的配置文件中。

因此,我们使用了以下内容:

WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

自Firefox 48版本起,浏览器扩展已被禁用并引入了WebDriver。自此,由Mozilla开发和维护的基于Marionette解决方案的GeckoDriver可用于自动化Mozilla Firefox浏览器。

Marionette

根据Mozilla官方文档关于developer.mozilla.org上的说明,Marionette是一个自动化驱动程序。它使用Firefox的远程协议来控制用户界面。Marionette接受请求并在Gecko中执行它们。它也有一个客户端。客户端向服务器发送指令,服务器在浏览器内执行这些指令。

因此,我们开始使用Marionette:

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");

电线

有些参考资料建议将可执行文件重命名为“wires.exe”并将其添加到您的路径中。因此,以下内容被使用:

System.setProperty("webdriver.firefox.marionette","C:\\wires.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");

GeckoDriver

GeckoDriver是可执行文件,我们需要在系统中下载它,并在执行测试用例时在脚本/程序中指定其位置。GeckoDriver将启动Mozilla Firefox浏览器。

这些摘录来自Jim Evan对问题使用马里奥内特FirefoxDriver与旧版Selenium FirefoxDriver相比的好处是什么?的详细回答,该回答为我们提供了关于GeckoDriverMarionette如何进入实践的详细理解。

因此,我们开始使用geckodriver.exe:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

当前情况下,您仍然可以通过Firefox 47.x浏览器的传统版本和最近的Firefox 53.x浏览器版本来执行自动化。

用例1:

如果使用传统的Firefox 47.x浏览器,则必须通过DesiredCapabilities类显式将“marionette”设置为false,如下所示:

DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability("firefox_binary", "C:\\Program Files\\Mozilla Firefox47\\firefox.exe");
dc.setCapability("marionette", false);
WebDriver driver =  new FirefoxDriver(dc);
driver.navigate().to("https://gmail.com");

使用案例 2:

如果您使用遗留的 Firefox 47.x 浏览器,如果您跳过将“marionette”设置为 false,或者将“marionette”设置为 true,您将会出现一个 IllegalStateException 异常。

使用案例 3:

如果您使用 Firefox 53.x 浏览器,您可以选择如下跳过将“marionette”设置为 true,这将显示 Marionette INFO 日志,例如:Marionette INFO Listening on port 11105

System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");

使用案例 4:

如果您使用 Firefox 53.x 浏览器,您可以通过 DesiredCapabilities 类明确将 "marionette" 设置为 true,这将显示 Marionette WARN 日志,例如:WARN TLS 证书错误将在此会话中被忽略

System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability("marionette", true);
WebDriver driver =  new FirefoxDriver(dc);
driver.navigate().to("https://gmail.com");

使用案例5:

如果在Firefox 53.x浏览器中通过DesiredCapabilities类强制将"marionette"设置为false,你将会看到一个UnreachableBrowserException异常。


1
非常感谢!我找到了很多文章,说将Marionette设置为“true”或“false”可以解决问题。这是第一篇解释为什么而不仅仅是盲目的编程解决方案的文章。 - Peter M. - stands for Monica

5

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

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

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

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

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

那么,Marionette驱动程序是为了支持Geckodriver中不可用的功能而设计的吗? - Thomas Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接