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

LU *_*Cai 51 selenium selenium-firefoxdriver selenium-webdriver firefox-marionette geckodriver

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

我知道Selenium默认支持旧的Firefox版本,没有驱动程序.对于最新版本的Firefox,我们必须下载驱动程序并使用它来定义它System.setProperty.

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

WebDriver driver = new FirefoxDriver();
Run Code Online (Sandbox Code Playgroud)

我的Firefox版本为45.5.1.但是上面的代码仍然不起作用.所以根据这个链接,我添加了:

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");

它奏效了.

然后我意识到我没有安装geckodriver.exe在我的电脑上.要了解它是如何进行的,我已经更改为以下代码:

System.setProperty("webdriver.firefox.marionette","");
Run Code Online (Sandbox Code Playgroud)

它仍然有效.

所以,这是我的第一个问题:发生了什么?我确信geckodriver.exe在我的环境中不存在.如果没有指出位置,那我为什么要设置属性?

另外,我见过的代码如下:

System.setProperty("webdriver.gecko.driver", "/tools/marionette/wires.exe");
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是,是什么样的区别webdriver.gecko.driverwebdriver.firefox.marionettewires.exegeckodriver.exe

Flo*_* B. 42

最高版本45(推送到版本47),用于自动化Firefox的驱动程序是每个客户端附带的扩展.但是这个扩展被删除了,可能是由于策略的改变,现在要求所有扩展都由Mozilla签名.

Marionette是Firefox发布/附带的新驱动程序.该驱动程序具有自己的协议,与Selenium/WebDriver协议不直接兼容.

壁虎驱动器(以前称为导线)是实施硒/ webdriver的协议的应用服务器.它翻译Selenium命令并将它们转发给Marionette驱动程序.

对于Java客户端,默认行为是使用Gecko驱动程序,但可以重写它以使用旧版扩展作为具有该webdriver.firefox.marionette属性的驱动程序:

System.setProperty("webdriver.firefox.marionette", "false");
Run Code Online (Sandbox Code Playgroud)

或通过以下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());
Run Code Online (Sandbox Code Playgroud)

或直接与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);
Run Code Online (Sandbox Code Playgroud)

要定义Gecko驱动程序的位置,请将驱动程序放在PATH环境变量中的文件夹中,或者在属性中定义位置webdriver.gecko.driver:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
Run Code Online (Sandbox Code Playgroud)

或者使用命令行中指定的属性启动远程服务器:

java -Dwebdriver.gecko.driver="C:\\geckodriver.exe" -jar selenium-server-standalone-3.4.0.jar
Run Code Online (Sandbox Code Playgroud)


Deb*_*anB 29

直到Firefox 47.x版本,旧版驱动程序被实现为Firefox扩展.每当WebDriver启动Firefox时,此扩展都安装在驱动程序使用的配置文件中.

因此我们使用了:

WebDriver driver =  new FirefoxDriver();
driver.navigate().to("https://gmail.com");
Run Code Online (Sandbox Code Playgroud)

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

木偶

根据Mozilladeveloper.mozilla.org的官方文档.Marionette自动化驱动程序.它使用Firefox的远程协议来控制UI.Marionette接受请求并在Gecko中执行它们.它也有一个客户.客户端向服务器发送指令,服务器在浏览器中执行指令.

因此我们开始使用Marionette:

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

电线

有一些引用将可执行文件重命名为'wires.exe'并将其添加到您的路径中.因此使用了以下内容:

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

GeckoDriver

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

这些摘录取自Jim Evan对问题的史诗回答.使用Marionette FirefoxDriver而不是旧的Selenium FirefoxDriver对Selenium测试仪有什么好处?这让我们详细了解了GeckoDriverMarionette如何付诸实践.

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

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

现在,在当前场景中,您仍然可以选择通过旧版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");
Run Code Online (Sandbox Code Playgroud)

用例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");
Run Code Online (Sandbox Code Playgroud)

用例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");
Run Code Online (Sandbox Code Playgroud)

用例5:

如果您通过DesiredCapabilities类强制将"marionette"设置为false,则使用Firefox 53.x浏览器时,您将观察到UnreachableBrowserException.


小智 5

Marionette是最新Firefox版本附带的新驱动程序.

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

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

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

DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);
Run Code Online (Sandbox Code Playgroud)