必须通过webdriver.gecko.driver系统属性设置驱动程序可执行文件的路径;

时间:2017-04-14 19:29:14

标签: java selenium firefox

我正在使用Selenium 3.3.1而我正在测试以下代码。

运行后会显示以下错误:

  

线程中的异常" main" 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)at   Selenium_login.main(Selenium_login.java:70)   /home/ali/.cache/netbeans/dev/executor-snippets/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 webSrcapper = new Selenium_login();
        webSrcapper.openTestSite();
        webSrcapper.login("admin", "12345");
        webSrcapper.getText();
        webSrcapper.saveScreenshot();
        webSrcapper.closeBrowser();
    }
}

2 个答案:

答案 0 :(得分:6)

自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();
...

答案 1 :(得分:2)

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

以下是驱动程序服务搜索驱动程序可执行文件的代码段(对于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 =&#34; webdriver.gecko.driver&#34; 和CHROME_DRIVER_EXE_PROPERTY =&#34; webdriver.chrome.driver&#34;

其他浏览器的情况类似,以下是可用浏览器实现列表的快照

selenium browser support