【问题标题】:The path to the driver executable must be set by the webdriver.gecko.driver system property;驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置;
【发布时间】:2017-09-11 02:19:46
【问题描述】:

我正在使用 Selenium 3.3.1,我正在测试下面的代码。

运行后显示如下错误:

线程“主”java.lang.IllegalStateException 中的异常:路径 驱动程序可执行文件必须由 webdriver.gecko.driver 设置 系统属性;有关详细信息,请参阅 https://github.com/mozilla/geckodriver。最新版本可以 从https://github.com/mozilla/geckodriver/releases下载 com.google.common.base.Preconditions.checkState(Preconditions.java:738) 在 org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:111) 在 org.openqa.selenium.firefox.GeckoDriverService.access$100(GeckoDriverService.java:38) 在 org.openqa.selenium.firefox.GeckoDriverService$Builder.findDefaultExecutable(GeckoDriverService.java:112) 在 org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:302) 在 org.openqa.selenium.firefox.FirefoxDriver.toExecutor(FirefoxDriver.java:233) 在 org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:125) 在 org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:121) 在 Selenium_login.(Selenium_login.java:13) 在 Selenium_login.main(Selenium_login.java:70) /home/ali/.cache/netbeans/dev/executor-sn-ps/run.xml:53:Java 返回:1 BUILD FAILED(总时间:0 秒)

Java 代码:

import java.io.*;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Selenium_login {

    public WebDriver driver = new FirefoxDriver();

    /**
     * Open the test website.
     */
    public void openTestSite() {
        driver.navigate().to("http://testing-ground.scraping.pro/login");
    }

    /**
     * 
     * @param username
     * @param Password
     * 
     *            Logins into the website, by entering provided username and
     *            password
     */
    public void login(String username, String Password) {

        WebElement userName_editbox = driver.findElement(By.id("usr"));
        WebElement password_editbox = driver.findElement(By.id("pwd"));
        WebElement submit_button = driver.findElement(By.xpath("//input[@value='Login']"));

        userName_editbox.sendKeys(username);
        password_editbox.sendKeys(Password);
        submit_button.click();

    }

    /**
     * grabs the status text and saves that into status.txt file
     * 
     * @throws IOException
     */
    public void getText() throws IOException {
        String text = driver.findElement(By.xpath("//div[@id='case_login']/h3")).getText();
        Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("status.txt"), "utf-8"));
        writer.write(text);
        writer.close();

    }

    /**
     * Saves the screenshot
     * 
     * @throws IOException
     */
    public void saveScreenshot() throws IOException {
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File("screenshot.png"));
    }

    public void closeBrowser() {
        driver.close();
    }

    public static void main(String[] args) throws IOException {
        Selenium_login webSrcaper = new Selenium_login();
        webSrcaper.openTestSite();
        webSrcaper.login("admin", "12345");
        webSrcaper.getText();
        webSrcaper.saveScreenshot();
        webSrcaper.closeBrowser();
    }
}

【问题讨论】:

    标签: java selenium firefox


    【解决方案1】:

    以 selenium 中的驱动构造函数为例

    WebDriver driver = new FirefoxDriver();
    

    搜索驱动程序可执行文件,在本例中,firefox 驱动程序搜索 gecko 驱动程序可执行文件。如果服务找不到可执行文件,则会引发异常

    这就是异常的来源(注意检查状态方法)

     /**
       *
       * @param exeName Name of the executable file to look for in PATH
       * @param exeProperty Name of a system property that specifies the path to the executable file
       * @param exeDocs The link to the driver documentation page
       * @param exeDownload The link to the driver download page
       *
       * @return The driver executable as a {@link File} object
       * @throws IllegalStateException If the executable not found or cannot be executed
       */
      protected static File findExecutable(
          String exeName,
          String exeProperty,
          String exeDocs,
          String exeDownload) {
        String defaultPath = new ExecutableFinder().find(exeName);
        String exePath = System.getProperty(exeProperty, defaultPath);
        checkState(exePath != null,
            "The path to the driver executable must be set by the %s system property;"
                + " for more information, see %s. "
                + "The latest version can be downloaded from %s",
                exeProperty, exeDocs, exeDownload);
    
        File exe = new File(exePath);
        checkExecutable(exe);
        return exe;
      }
    

    以下是抛出异常的检查状态方法

      /**
       * Ensures the truth of an expression involving the state of the calling instance, but not
       * involving any parameters to the calling method.
       *
       * <p>See {@link #checkState(boolean, String, Object...)} for details.
       */
      public static void checkState(
          boolean b,
          @Nullable String errorMessageTemplate,
          @Nullable Object p1,
          @Nullable Object p2,
          @Nullable Object p3) {
        if (!b) {
          throw new IllegalStateException(format(errorMessageTemplate, p1, p2, p3));
        }
      }
    

    解决方案:在创建驱动对象之前设置系统属性如下

    System.setProperty("webdriver.gecko.driver", "./libs/geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    

    以下是代码 sn-p(用于 firefox 和 chrome),驱动程序服务在其中搜索驱动程序可执行文件:

    火狐:

    @Override
     protected File findDefaultExecutable() {
          return findExecutable(
            "geckodriver", GECKO_DRIVER_EXE_PROPERTY,
            "https://github.com/mozilla/geckodriver",
            "https://github.com/mozilla/geckodriver/releases");
        }
    

    铬:

       @Override
        protected File findDefaultExecutable() {
          return findExecutable("chromedriver", CHROME_DRIVER_EXE_PROPERTY,
              "https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver",
              "http://chromedriver.storage.googleapis.com/index.html");
        }
    

    其中 GECKO_DRIVER_EXE_PROPERTY = "webdriver.gecko.driver" 和 CHROME_DRIVER_EXE_PROPERTY = "webdriver.chrome.driver"

    其他浏览器也是如此,以下是可用浏览器实现列表的快照

    【讨论】:

      【解决方案2】:

      自 Selenium 3.0 起,您需要使用 geckodriver 与 Firefox 交互。根据您的操作系统从github 下载geckodriver,然后将geckodriver.exe 解压缩到一个文件夹中。

      在初始化WebDriver之前添加以下行:

      System.setProperty("webdriver.gecko.driver","c:/your/path/to/geckodriver.exe");
      WebDriver driver = new FirefoxDriver();
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-21
        • 2017-03-16
        • 1970-01-01
        • 2017-02-04
        • 2016-12-05
        • 2020-03-14
        • 2017-09-07
        • 1970-01-01
        相关资源
        最近更新 更多