为什么 Firefox 需要 GeckoDriver?

Why Firefox requires GeckoDriver?

我今天有一个简单的问题:

我用这段代码创建了一个新的 selenium 项目:

FirefoxDriver driver = new FirefoxDriver();
//ChromeDriver driver = new ChromeDriver();
//InternetExplorerDriver driver = new InternetExplorerDriver();

使用 Chrome 和 IE 开箱即用,但使用 Firefox 会抛出:

The geckodriver.exe file does not exist in the current directory or in a directory on the PATH environment variable. The driver can be downloaded at https://github.com/mozilla/geckodriver/releases.

为什么只有 Firefox 我们必须 download/configure 这个驱动程序?

FireFox 基于 Mozilla,selenium 需要驱动程序与基于 gecko 的驱动程序交互 - 请参阅 geckodriver

处的自述文件

你的说法确实不正确,chromedriver也需要放在路径中。我认为您之前已经设置了 chromedriver,所以它似乎开箱即用。

geckodriver / chromedriver 的路径也可以在您的代码中设置

我们需要这个的原因,AFAIK 因为 firefox > 47,浏览器不附带 firefox webdriver 插件,因此它应该从 geckodriver 和 selenium 3+

一一解决您的问题:

  1. 为什么 Firefox 需要 GeckoDriver? - 对于版本 47.x 之前的 Mozila Firefox,它是旧版浏览器,我们不需要 gecko 驱动程序. Mozila Firefox 从版本 47.x 开始附带 Marionette,它是 Mozilla 的 Gecko 引擎的自动化驱动程序。它可以远程控制 Gecko 平台的 UI 或内部 JavaScript,例如 Firefox。

  2. 使用 Chrome 并且 IE 开箱即用 - 理想情况下 Chrome 和 IE 都不应该工作。但是由于您在环境变量 knowingly/unknowingly 中添加了二进制文件的位置,而 Google Chrome 的 installation/configuration 和 MS Internet Explorer 或其他相关软件,这些二进制文件很容易找到& 自动使用。

  3. 为什么只有 Firefox 我们必须 download/configure 这个驱动程序? - 不仅是 Firefox,而且 Google Chrome & MS Internet Explorer 要使用 Selenium 3.4.0,您需要从 this location 或 Chrome 驱动程序或 IEDriverServer 强制下载 gecko 驱动程序 v0.16.0(或更高版本)并将其保存在您的机器。将您的 Mozila Firefox 或 Google Chrome 或 MS Internet Explorer 升级到最新的稳定版本。在代码中使用 geckodriver/chromedriver/iedriver while System.setProperty 的绝对路径,如下所示:

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

Marionette 作为 Firefox 中的自动化驱动程序支持自定义套接字协议,该协议与 WebDriver 规范不兼容。因此需要使用 geckodriver 作为 Selenium 和 Firefox 之间的代理。作为小型 HTTP 服务器实现,它接受符合 WebDriver 规范的命令,并将这些命令转发给 Marionette。这同样适用于来自 Marionette 的响应,这些响应正在转换回 WebDriver 兼容的 HTTP 响应。

随着 Quantum(Rust 组件)即将在 Firefox 中集成,geckodriver 将不再需要,因为它将默认集成。