Подтвердить что ты не робот

Как использовать исполняемый файл gecko с Selenium

Я использую Firefox 47.0 с Selenium 2.53. Недавно между Selenium и Firefox произошла ошибка, из-за которой код не работал. Одним из решений является использование драйвера Marionnette.

Я следовал инструкциям этого сайта, чтобы использовать этот новый драйвер с RemotWebDriver, но у меня все еще есть ошибка:

WARN - Исключение: Исключение в потоке "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 и драйвера Gecko, у кого-нибудь есть новости по этому поводу?

4b9b3361

Ответ 1

Недавно Selenium запустил Selenium 3, и если вы пытаетесь использовать последнюю версию Firefox, вы должны использовать GeckoDriver:

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

Вы можете проверить полную документацию здесь

Ответ 2

Я также столкнулся с той же проблемой и получил разрешение через день:

Исключение приходит, потому что System требует Geckodriver для запуска тестового теста Selenium. Вы можете попробовать этот код под основным методом в Java

    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 ссылке.

Пожалуйста, дайте мне знать, если проблема не будет решена.

Ответ 3

Вы можете обрабатывать драйвер Firefox автоматически, используя WebDriverManager.

Эта библиотека загружает соответствующий двоичный файл (geckodriver) для вашей платформы (Mac, Windowns, Linux) и затем экспортирует правильное значение требуемой переменной среды 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>3.7.1</version>
</dependency>

WebDriverManager делает магию для вас:

  1. Он проверяет наличие последней версии двоичного файла WebDriver
  2. Он загружает двоичный файл WebDriver, если его нет в вашей системе
  3. Он экспортирует необходимые переменные среды WebDriver Java, необходимые для Selenium

Пока что WebDriverManager поддерживает Chrome, Opera, Internet Explorer, Microsoft Edge, PhantomJS и Firefox.

Ответ 4

Вышеприведенные решения отлично подходят для локального тестирования и запуска браузеров из java-кода. Если вы хотите запустить свою селеновую сетку позже, этот параметр должен иметь, чтобы сообщить удаленный node где найти geckodriver:

-Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe"

node не может найти драйвер gecko, если он указан в коде Java Automation.

Итак, полная команда для node, которая должна быть (при условии, что node и концентратор для целей тестирования живут на одном компьютере):

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

И вы должны ожидать увидеть в журнале node:

00:35:44.383 INFO - Launching a Selenium Grid node
Setting system property webdriver.gecko.driver to C:\geckodriver\geckodriver.exe

Ответ 5

Я пытаюсь сделать это простым. У вас есть два варианта при использовании Selenium 3 +:

  • Либо обновите свой Firefox до 47.0.1, либо используйте geckodriver of Selenium3.

  • Или отключите использование geckodriver, указав marionette на false и использовать устаревший драйвер Firefox. простая команда запуска селена : java -Dwebdriver.firefox.marionette=false -jar selenium-server-standalone-3.0.1.jar. Вы также можете отключить использование geckodriver из других команд, упомянутых в других ответах.

Ответ 7

Я создаю простое приложение Java по архетипу maven-archetype-quickstar, затем пересматриваю 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");

Ответ 8

Это может быть связано с тем, что система не может найти установленное Firefox место на пути.

Попробуйте выполнить следующий код, который должен работать.

System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe"); 
System.setProperty("webdriver.gecko.driver","<location of geckodriver>\\geckodriver.exe");

Ответ 9

Важно помнить, что драйвер (файл) должен иметь разрешение на выполнение (linux chmod + x geckodriver).

Подводя итог:

  • Загрузите драйвер gecko
  • Добавить разрешение выполнения
  • Добавить системное свойство:

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

  • Создайте и используйте класс

    WebDriver driver = new FirefoxDriver();

  • Сделайте все, что захотите

  • Закройте драйвер

    driver.close;

Ответ 10

Я использую класс FirefoxOptions для установки двоичного местоположения с Firefox 52.0, GeckoDriver v0.15.0 и Selenium 3.3.1, как упоминалось в этой статье - http://www.automationtestinghub.com/selenium-3-0-launch-firefox-with-geckodriver/

Явный код, который я использовал -

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