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

Difference between webdriver.firefox.marionette & webdriver.gecko.driver

我现在正在学习 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有什么区别?

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

Marionette 是 Firefox shipped/included 的新驱动程序。 此驱动程序有自己的协议,不直接与 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

在 Firefox 47.x 发布之前,遗留驱动程序是作为 Firefox 扩展实现的。每当 WebDriver 启动 Firefox 时,此扩展就会安装在驱动程序使用的配置文件中。

因此我们使用了:

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

Firefox 48 禁用了浏览器扩展并引入了 WebDriver。从那时起 GeckoDriver Mozilla 开发和维护的 Marionette-based 解决方案用于自动化 Mozilla Firefox 浏览器。

Marionette

根据 Mozilla 的官方文档 developer.mozilla.orgMarionette 自动化驱动程序 。它使用Firefox的远程协议,可以控制UI。 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 是我们需要在系统中下载并在执行测试用例时在 scripts/programs 中提及其位置的可执行文件。 GeckoDriver 将启动 Mozilla Firefox 浏览器。

这些摘录摘自 Jim Evan 对问题 的史诗般的回答,让我们详细了解 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 class 将 "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 class 将 "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 class 强制将 "marionette" 设置为 false,您将观察到 UnreachableBrowserException.

Marionette 是 shipped/included 最新版 Firefox 的新驱动程序。

但是,Geckodriver 是使用 W3C WebDriver 兼容客户端与基于 Gecko 的浏览器进行交互的代理。 Geckodriver提供WebDriver协议描述的HTTPAPI与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);