41

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

我按照该站点的说明将这个新驱动程序与 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 和壁虎驱动程序,你们有任何消息吗?

4

10 回答 10

33

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

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

您可以从此处查看完整文档

于 2016-08-05T05:11:24.643 回答
12

您可以使用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.1.0</version>
</dependency>

WebDriverManager 为您创造奇迹:

  1. 它检查最新版本的 WebDriver 二进制文件
  2. 如果您的系统上不存在 WebDriver 二进制文件,它会下载它
  3. 它导出 Selenium 所需的 WebDriver Java 环境变量

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

于 2016-11-15T10:27:27.077 回答
12

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

异常即将到来,因为 System 需要 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链接。

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

于 2016-08-05T03:51:20.390 回答
9

上面的解决方案适用于本地测试和从 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
于 2016-09-27T21:49:06.623 回答
3

我试着让它变得简单。使用 Selenium 3+ 时有两个选择:

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

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

于 2016-11-15T06:34:36.440 回答
3

I create a simple Java application by archetype maven-archetype-quickstar, then revise 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>

and

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);
    }

}

You also use on Mac OS X, Linux: https://github.com/mozilla/geckodriver/releases

and

// On Mac OS X.
System.setProperty("webdriver.gecko.driver", "/Users/donhuvy/Downloads/geckodriver");
于 2016-09-21T09:50:54.650 回答
2

这可能是由于系统无法在路径上找到 Firefox 安装位置。

尝试以下代码,它应该可以工作。

System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe"); 
System.setProperty("webdriver.gecko.driver","<location of geckodriver>\\geckodriver.exe");
于 2017-01-03T12:30:49.063 回答
2

启动 Selenium 服务器节点时,您需要使用 .exe 的路径指定系统属性。另请参阅使用 Chrome 驱动程序对 Selenium 网格的接受的 anwser(WebDriverException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置)

于 2016-06-26T13:57:40.920 回答
1

重要的是要记住驱动程序(文件)必须具有执行权限(linux chmod +x geckodriver)。

总结一下:

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

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

  4. 实例化和使用类

    WebDriver driver = new FirefoxDriver();

  5. 做你想做的

  6. 关闭驱动程序

    driver.close;

于 2017-02-19T13:24:26.073 回答
-1

我正在使用 FirefoxOptions 类来设置带有 Firefox 52.0、GeckoDriver v0.15.0 和 Selenium 3.3.1 的二进制位置,如本文所述 - http://www.automationtestinghub.com/selenium-3-0-launch-firefox-与-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");
于 2017-03-27T12:06:56.133 回答