获取“驱动程序可执行文件的路径必须由webdriver.gecko.driver设置”,同时尝试使用Gecko驱动程序运行selenium Grid代码

时间:2017-06-07 12:16:45

标签: java selenium selenium-webdriver selenium-grid geckodriver

我在 selenium Grid 的帮助下运行基本的 selenium 代码。

以下是步骤:

第1步: - 下载最新版本的 selenium独立服务器(3.4.0);

第2步: - 使用命令java - jar <path of selenium standalone server>\\selenium-server-standalone-3.4.0.jar -role hub创建 HUB - &gt; 成功运行;

第3步: - 使用命令java -jar selenium-server-standalone-3.4.0.jar -role hub -node http://localhost:4444/grid/register创建节点 - &gt; 成功运行;

第4步: - 使用以下代码创建了一个简单的 selenium 程序:

public class ClassName {

  public static void main(String args[]) throws InterruptedException, MalformedURLException {
    System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe");
    DesiredCapabilities cap=DesiredCapabilities.firefox();
    cap.setPlatform(Platform.WINDOWS);
    cap.setBrowserName("firefox");
    URL url = new URL("http://localhost:4444/wd/hub");

    WebDriver wd1 = new RemoteWebDriver(url, cap);
    wd1.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    wd1.manage().window().maximize();

    wd1.get("http://www.clickindia.com/");
    wd1.findElement(By.linkText("Post Free Ad")).click();
    Thread.sleep(3000);
    wd1.findElement(By.linkText("Select category manually")).click();
    Thread.sleep(3000);
    WebElement country = wd1.findElement(By.id("combo_0"));
    Select sel = new Select(country);
    sel.selectByVisibleText("Jobs");
  }
}

在代码上面运行时抛出以下异常:

Exception Image

注意:如果我在没有 remoteDriver 的情况下运行上面的代码,并且作为常见的 WebDriver 程序运行,那么它正常运行并正常运行。

selenium独立服务器和Gecko文件的位置相同。

Gecko版本是v0.16.0

提前致谢

2 个答案:

答案 0 :(得分:1)

您已将默认配置的节点注册为java -jar selenium-server-standalone-3.4.0.jar -role hub -node http://localhost:4444/grid/register。因此,您的节点无法处理请求。

您可以考虑使用以下配置注册节点:

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

您的代码块在我的最后工作正常。

答案 1 :(得分:1)

错误消息表明Selenium无法在以下位置找到GeckoDriver二进制文件:

  1. 属于PATH环境变量和
  2. 的任何位置
  3. 它无法通过代表geckodriver二进制文件位置的JVM参数(System.getProperty("webdriver.gecko.driver"))找到任何有效值。
  4. 该行

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

    确保只有当前JVM(执行ClassName.main()方法的JVM)才知道geckodriver二进制文件的位置。这就是您使用FirefoxDriver时代码运行正常的原因。

    但是当您使用RemoteWebDriver时,即在网格模式下,您尝试针对网格设置运行,通过JVM参数"webdriver.gecko.driver"设置geckodriver位置将不会产生任何影响在其他JVM上(请记住,负责支持浏览器交互的节点使用命令java -jar selenium-server-standalone-3.4.0.jar -role hub -node http://localhost:4444/grid/register(您的第3步)在单独的JVM下分离。

    要解决此问题,您有两种选择。

    1. 当您产生节点并指定geckodriver的位置时,您使用JVM参数-Dwebdriver.gecko.driver
    2. 您将geckodriver二进制文件下载到一个文件夹中,并将其位置作为PATH变量的一部分包含在内(例如,将C:\\geckodriver.exe添加到PATH变量中)