webdriver.firefox.marionette 和 webdriver.gecko.driver 的区别
Posted
技术标签:
【中文标题】webdriver.firefox.marionette 和 webdriver.gecko.driver 的区别【英文标题】:Difference between webdriver.firefox.marionette & webdriver.gecko.driver 【发布时间】:2017-09-02 12:44:55 【问题描述】:我现在正在学习 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.driver
和webdriver.firefox.marionette
或wires.exe
和geckodriver.exe
之间有什么区别?
【问题讨论】:
【参考方案1】:直到版本 45(推送到版本 47),用于自动化 Firefox 的驱动程序是每个客户端都包含的扩展。但是这个扩展被放弃了,可能是由于政策的变化,现在要求所有的扩展都必须由 Mozilla 签名。
Marionette 是 Firefox 附带/包含的新驱动程序。 该驱动有自己的协议,与 Selenium/WebDriver 协议不直接兼容。
Gecko 驱动程序(以前称为 wires)是一个实现 Selenium/WebDriver 协议的应用服务器。 它翻译 Selenium 命令并将它们转发给 Marionette 驱动程序。
对于 Java 客户端,默认行为是使用 Gecko 驱动程序,但可以使用旧版扩展作为具有webdriver.firefox.marionette
属性的驱动程序来覆盖它:
System.setProperty("webdriver.firefox.marionette", "false");
或通过FirefoxOptions
使用marionette
功能:
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
【讨论】:
“Gecko 驱动程序(以前称为电线)” - 谢谢。它解释了一些误解。 我好像找不到geckodriver的官方下载页面。你有链接存储在某个地方吗??【参考方案2】:在 Firefox 47.x 发布之前,旧版驱动程序被实现为 Firefox 扩展。每当 WebDriver 启动 Firefox 时,此扩展程序都会安装在驱动程序使用的配置文件中。
因此我们使用了:
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");
Firefox 48 禁用了浏览器扩展并引入了 WebDriver。从那时起,GeckoDriver
基于 Marionette 的解决方案由 Mozilla 开发和维护,用于自动化 Mozilla Firefox 浏览器。
木偶
根据developer.mozilla.org 上的Mozilla 官方文档。 Marionette 是自动化驱动器。它使用可以控制 UI 的 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 对问题 What are the benefits of using Marionette FirefoxDriver instead of the old Selenium FirefoxDriver for a Selenium tester? 的史诗般的回答,它让我们详细了解 GeckoDriver 和 Marionette 付诸实践。
因此我们开始使用 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 certificate errors will be ignored for this session
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
。
【讨论】:
非常感谢!我发现很多文章都说将木偶设置为“真”或“假”可以解决问题。这是第一篇解释为什么的文章,而不仅仅是盲目的货物崇拜编程解决方案。【参考方案3】: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();
如果您仍然遇到问题(由于 FF 版本不兼容),您可以使用以下功能:
DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);
【讨论】:
所以木偶驱动是支持geckodriver没有的功能吗?以上是关于webdriver.firefox.marionette 和 webdriver.gecko.driver 的区别的主要内容,如果未能解决你的问题,请参考以下文章