如何将 gecko 可执行文件与 Selenium 一起使用

Posted

技术标签:

【中文标题】如何将 gecko 可执行文件与 Selenium 一起使用【英文标题】:How to use the gecko executable with Selenium 【发布时间】:2016-10-13 15:10:06 【问题描述】:

我正在使用带有 Selenium 2.53 的 Firefox 47.0。最近,它们成为 Selenium 和 Firefox 之间的一个错误,导致代码无法正常工作。一种解决方案是使用Marionnette 驱动程序。

我按照site 的说明将这个新驱动程序与 RemotWebDriver 一起使用,但我一直遇到错误:

警告 - 异常:线程“main”中的异常 org.openqa.selenium.WebDriverException:驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置;有关详细信息,请参阅https://github.com/jgraham/wires。最新版本可以从....下载。

到目前为止我尝试过的代码非常简单:

public class Test 
    static WebDriver driver;
    static Wait<WebDriver> wait;
    public static void main(String[] args) throws MalformedURLException 
        System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
        DesiredCapabilities cap = DesiredCapabilities.firefox();
        cap.setCapability("marionette", true);
        cap.setBrowserName("firefox");
        driver = new RemoteWebDriver(new URL("http://192.168.117.135:5555/wd/hub"), cap);//true to enable the JS
        wait = new WebDriverWait(driver, 3000);
        final String url = "https://www.google.com/";

        javascriptExecutor js = (JavascriptExecutor) driver;

        try 
            driver.navigate().to(url);
         finally 
            driver.close();
        
    

我确定 geckodriver.exe 的路径是正确的,但我看不出我在哪里做错了。

编辑 1: 我尝试了以下代码:

public class Test 
    static WebDriver driver;
    static Wait<WebDriver> wait;
    public static void main(String[] args) throws MalformedURLException 
        System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");

        driver = new MarionetteDriver();
        wait = new WebDriverWait(driver, 3000);
        final String url = "https://www.google.com/";

        JavascriptExecutor js = (JavascriptExecutor) driver;

        try 
            driver.navigate().to(url);
         finally 
            driver.close();
        
    

而且它正在工作,问题似乎来自 RemoteWebDriver 和壁虎驱动程序,你们有任何消息吗?

【问题讨论】:

【参考方案1】:

您可以使用 WebDriverManager 自动处理 Firefox 驱动程序。

此库会为您的平台(Mac、Windows、Linux)下载正确的二进制文件 (geckodriver),然后导出所需 Java 环境变量 (webdriver.gecko.driver) 的正确值)。

看一个完整的例子作为JUnit测试用例:

public class FirefoxTest 

  private WebDriver driver;

  @BeforeClass
  public static void setupClass() 
    WebDriverManager.firefoxdriver().setup();
  

  @Before
  public void setupTest() 
    driver = new FirefoxDriver();
  

  @After
  public void teardown() 
    if (driver != null) 
      driver.quit();
    
  

  @Test
  public void test() 
    // Your test code here
  

如果您使用的是 Maven,则必须输入您的 pom.xml:

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.0.1</version>
</dependency>

WebDriverManager 为您创造奇迹:

    它检查最新版本的 WebDriver 二进制文件 如果您的系统上没有 WebDriver 二进制文件,它会下载它 它导出 Selenium 所需的 WebDriver Java 环境变量

到目前为止,WebDriverManager 支持ChromeOperaInternet ExplorerMicrosoft EdgePhantomJSFirefox

【讨论】:

【参考方案2】:

最近 Selenium 推出了 Selenium 3,如果您尝试使用 Firefox 最新版本,那么您必须使用 GeckoDriver:

System.setProperty("webdriver.gecko.driver","G:\\Selenium\\Firefox driver\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();

You can check full documentation from here

【讨论】:

这个解决方案显然与 Windows 相关联(因为路径)。是否有独立于平台的方法来执行此操作,或者是否需要为每台运行 Selenium 3 代码的机器进行设置? 我们倾向于做的是有一个conf。特定于环境的文件(测试机器 IP、各种端口、路径等)并按原样使用它,但是不,我对必须指定可执行文件的路径才能运行测试感到不满意。如果有人有更好的想法,我将不胜感激。 对于 mac,您可以从这里下载 webdriver:github.com/mozilla/geckodriver/releases。还设置像这样的属性 System.setProperty("webdriver.gecko.driver", "/Users/gecko/geckodriver");【参考方案3】:

如本文所述,我正在使用 FirefoxOptions 类设置 Firefox 52.0、GeckoDriver v0.15.0 和 Selenium 3.3.1 的二进制位置 - http://www.automationtestinghub.com/selenium-3-0-launch-firefox-with-geckodriver/

我使用的java代码-

FirefoxOptions options = new FirefoxOptions();
options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); //location of FF exe

FirefoxDriver driver = new FirefoxDriver(options);
driver.get("http://www.google.com");

【讨论】:

没有一个关于geckodriver.exe 的字眼,应该像 Mukesh otwani 的回答所暗示的那样使用它。 不推荐使用3.3.1 Selenium 驱动,因为specific issues。为了避免更好地使用3.4.0【参考方案4】:

上述解决方案适用于本地测试和从 java 代码启动浏览器。如果您想稍后启动 selenium 网格,那么这个参数是必须的,以便告诉 远程节点在哪里可以找到 geckodriver:

-Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe"

在自动化 Java 代码中指定时,节点找不到 gecko 驱动程序。

因此,节点的完整命令应该是(假设用于测试目的的节点和集线器位于同一台机器上):

java -Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe" -jar selenium-server-standalone-2.53.0.jar -role node -hub http://localhost:4444/grid/register

您应该会在节点日志中看到:

00:35:44.383 INFO - Launching a Selenium Grid node
Setting system property webdriver.gecko.driver to C:\geckodriver\geckodriver.exe

【讨论】:

给定的语法在较新的 selenium-server 版本(如 3.2.0)中抛出异常:线程“main”中的异常 com.beust.jcommander.ParameterException:未知选项:-Dwebdriver.gecko.driver =geckodriver.exe at com.beust.jcommander.JCommander.parseValues(JCommander.java:742) ...为避免这种情况,您需要更改参数顺序(首先是属性声明,jar 和程序参数。之后)。示例:java -Dwebdriver.gecko.driver="./geckodriver.exe" -jar selenium-server-standalone-3.2.0.jar -role node -hub 10.64.201.100:4444/grid/register【参考方案5】:

请务必记住,驱动程序(文件)必须具有执行权限(linux chmod +x geckodriver)。

总结一下:

    下载壁虎驱动 添加执行权限

    添加系统属性:

    System.setProperty("webdriver.gecko.driver", "FILE PATH");

    实例化并使用类

    WebDriver driver = new FirefoxDriver();

    随心所欲

    关闭驱动

    driver.close;

【讨论】:

【参考方案6】:

这可能是由于系统在路径上找不到 firefox 安装位置。

试试下面的代码,应该可以的。

System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe"); 
System.setProperty("webdriver.gecko.driver","<location of geckodriver>\\geckodriver.exe");

【讨论】:

【参考方案7】:

我尽量简化。使用 Selenium 3+ 时有两种选择:

将 Firefox 升级到 47.0.1 或更高版本并使用默认 Selenium3 的 geckodriver。

或通过将 marionette 指定为 false 来禁用 geckodriver 并使用旧版 Firefox 驱动程序。运行 selenium 的简单命令 是:java -Dwebdriver.firefox.marionette=false -jar selenium-server-standalone-3.0.1.jar。您也可以禁用使用 geckodriver 来自其他答案中提到的其他命令。

【讨论】:

谢谢,这对我尝试在 Debian 上设置 codeception 并安装了 iceweasel 很有用。【参考方案8】:

我通过archetype ma​​ven-archetype-quickstar创建了一个简单的Java应用,然后修改pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>bar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bar</name>
    <description>bar</description>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>bar</finalName>
    </build>
</project>

package bar;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class AppTest 

    /**
     * Web driver.
     */
    private static WebDriver driver = null;

    /**
     * Entry point.
     * 
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException 
        // Download "geckodriver.exe" from https://github.com/mozilla/geckodriver/releases
        System.setProperty("webdriver.gecko.driver","F:\\geckodriver.exe");
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://localhost:8080/foo/");
        String sTitle = driver.getTitle();
        System.out.println(sTitle);
    


您还可以在 Mac OS X、Linux 上使用:https://github.com/mozilla/geckodriver/releases

// On Mac OS X.
System.setProperty("webdriver.gecko.driver", "/Users/donhuvy/Downloads/geckodriver");

【讨论】:

我已尝试使用给定的 set 属性行,但我无法在 mac 机器上启动 Firefox 浏览器。【参考方案9】:

我也面临同样的问题,一天后得到了解决:

异常即将到来,因为系统需要 Geckodriver 来运行 Selenium 测试用例。 您可以在 Java 中的 main 方法下尝试此代码

    System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
    DesiredCapabilities capabilities=DesiredCapabilities.firefox();
    capabilities.setCapability("marionette", true);
    WebDriver driver = new FirefoxDriver(capabilities);

有关更多信息,您可以访问此https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver 链接。

如果问题没有得到解决,请告诉我。

【讨论】:

谢谢...我在您的第 4 行收到Caused by: java.net.ConnectException: Connection refused: connect...知道这可能是什么吗? 据我了解,远程拒绝连接时会出现 ConnectException。您是否在 line1 中为 geckodriver 提供了正确的路径? 哈!谢谢...终于让它工作了。谢谢你把宝贵的一天花在这上面……我想知道“壁虎”、“木偶”和“能力”的全部内容是什么?以及为什么使用 Selenium 3.0.0 如此重要?【参考方案10】:

在启动 Selenium 服务器节点时,您需要使用 .exe 的路径指定系统属性。另请参阅Selenium grid with Chrome driver (WebDriverException: The path to the driver executable must be set by the webdriver.chrome.driver system property)

的已接受答案

【讨论】:

以上是关于如何将 gecko 可执行文件与 Selenium 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

selenium+火狐浏览器如何关闭执行日志啊

如何在 selenium 3 中关闭 Marionette/gecko 驱动程序日志

java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置

如何通过 Java 使用 Selenium 将功能和选项传递给 Firefoxdriver

使用 BrowserMobProxy、Selenium、Firefox、marionette/gecko 获取请求和响应

使用 Gecko 驱动程序运行我的 Selenium 脚本时出现“org.openqa.selenium.WebDriverException: Unsupported Marionette prot