【问题标题】:How to use the gecko executable with Selenium如何将 gecko 可执行文件与 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 和壁虎驱动程序,你们有任何消息吗?

【问题讨论】:

    标签: java selenium firefox geckodriver


    【解决方案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 为您创造奇迹:

    1. 它检查最新版本的 WebDriver 二进制文件
    2. 如果您的系统上没有 WebDriver 二进制文件,它会下载它
    3. 它导出 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)。

      总结一下:

      1. 下载壁虎驱动
      2. 添加执行权限
      3. 添加系统属性:

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

      4. 实例化并使用类

        WebDriver driver = new FirefoxDriver();

      5. 随心所欲

      6. 关闭驱动

        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)

          的已接受答案

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-26
            • 2022-06-27
            • 1970-01-01
            • 1970-01-01
            • 2018-02-01
            • 2017-07-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多