50

我现在正在学习 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.driver 我的第二个问题是andwebdriver.firefox.marionettewires.exeand之间有什么区别geckodriver.exe

4

3 回答 3

42

直到版本 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");

或通过以下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
于 2017-05-10T18:17:43.197 回答
28

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

因此我们使用了:

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

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

木偶

根据Mozilla在developer.mozilla.org上的官方文档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 将依次启动 Mozilla Firefox 浏览器。

这些摘录摘自Jim EvanSelenium 测试人员使用 Marionette 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 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.

于 2017-05-11T16:00:02.213 回答
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();

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

DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);
于 2017-06-19T09:16:04.647 回答