42 votes

Comment utiliser l'exécutable gecko avec Selenium

J'utilise Firefox 47.0 avec Selenium 2.53. Récemment, il y a eu un bug entre Selenium et Firefox qui fait que le code ne fonctionne pas. Une des solutions est d'utiliser le pilote Marionnette.

J'ai suivi les instructions de ce site pour utiliser ce nouveau pilote avec un RemotWebDriver mais je continue à avoir l'erreur :

WARN - Exception : Exception dans le thread "main" org.openqa.selenium.WebDriverException : Le chemin vers l'exécutable du pilote doit être défini par la propriété système webdriver.gecko.driver ; pour plus d'informations, voir https://github.com/jgraham/wires . La dernière version peut être téléchargée à partir de ....

Le code que j'ai essayé jusqu'à présent est très simple :

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

Je suis sûr que le chemin vers le geckodriver.exe est correct et je ne vois pas où j'ai fait l'erreur.

EDIT 1 : J'ai essayé le code suivant :

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

et ça marche, il semble que le problème vienne du RemoteWebDriver et du pilote gecko, quelqu'un a-t-il des nouvelles à ce sujet ?

34voto

Mukesh otwani Points 638

Récemment, Selenium a lancé Selenium 3 et si vous essayez d'utiliser la dernière version de Firefox, vous devez utiliser GeckoDriver :

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

Vous pouvez consulter la documentation complète ici

5 votes

Cette solution est clairement liée à Windows (à cause du chemin). Existe-t-il un moyen indépendant de la plate-forme pour faire cela, ou faut-il le définir pour chaque machine qui va exécuter le code Selenium 3 ?

1 votes

Ce que nous avons tendance à faire est d'avoir un fichier de conf. qui est spécifique à l'environnement (IP de la machine de test, divers ports, chemins, etc.) et de l'utiliser comme tel, mais non, je n'étais pas très heureux de devoir spécifier un chemin vers un exécutable pour pouvoir exécuter un test. Si quelqu'un a une meilleure idée, j'apprécierais d'être éclairé.

0 votes

Pour mac, vous pouvez télécharger webdriver depuis ici : github.com/mozilla/geckodriver/releases . Définissez également une propriété comme ceci System.setProperty("webdriver.gecko.driver", "/Users/gecko/geckodriver") ;

12voto

Purendra Points 21

Je suis également confronté au même problème et j'ai obtenu la résolution après un jour :

L'exception survient parce que le système a besoin de Geckodriver pour exécuter le scénario de test Selenium. Vous pouvez essayer ce code sous la méthode main en Java

    System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
    DesiredCapabilities capabilities=DesiredCapabilities.firefox();
    capabilities.setCapability("marionette", true);
    WebDriver driver = new FirefoxDriver(capabilities);

Pour plus d'informations, vous pouvez consulter le site suivant https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver lien.

Veuillez me faire savoir si le problème n'est pas résolu.

0 votes

Merci... Je reçois Caused by: java.net.ConnectException: Connection refused: connect sur votre 4ème ligne ici... une idée de ce que cela pourrait être ?

0 votes

D'après ce que j'ai compris, l'exception ConnectException survient lorsque la connexion a été refusée à distance. Avez-vous donné le chemin correct pour le geckodriver dans la ligne 1 ?

0 votes

Hah ! Merci... ça a fini par marcher. Merci d'avoir passé un jour de votre précieuse vie sur ce sujet... Je me demande à quoi rime toute cette histoire de "gecko", "marionnette" et "capacité" ? Et pourquoi c'est si vital que vous deviez sauter à travers ce cerceau pour utiliser Selenium 3.0.0. ?

12voto

Boni García Points 2982

Vous pouvez gérer le pilote Firefox automatiquement en utilisant WebDriverManager .

Cette bibliothèque télécharge le binaire approprié ( geckodriver ) pour votre plateforme (Mac, Windows, Linux) et exporte ensuite la valeur appropriée de la variable d'environnement Java requise ( webdriver.gecko.driver ).

Jetez un coup d'œil à un exemple complet en tant que scénario de test 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
  }
}

Si vous utilisez Maven, vous devez mettre à votre pom.xml :

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.0.1</version>
</dependency>

WebDriverManager fait la magie pour vous :

  1. Il vérifie la dernière version du binaire WebDriver.
  2. Il télécharge le binaire WebDriver s'il n'est pas présent sur votre système.
  3. Il exporte les variables d'environnement Java WebDriver nécessaires à Selenium.

Jusqu'à présent, WebDriverManager supporte Chrome , Opera , Internet Explorer , Microsoft Edge , PhantomJS y Firefox .

9voto

Les solutions ci-dessus fonctionnent très bien pour les tests locaux et le lancement de navigateurs à partir du code Java. Si vous souhaitez lancer votre grille Selenium ultérieurement, ce paramètre est indispensable pour indiquer à la grille Selenium qu'elle doit être activée. noeud distant où trouver le geckodriver :

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

Le nœud ne peut pas trouver le pilote gecko lorsqu'il est spécifié dans le code Java d'automatisation.

Ainsi, la commande complète pour le nœud devrait être (en supposant que le nœud et le concentrateur à des fins de test se trouvent sur la même machine) :

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

Et vous devriez vous attendre à voir dans le journal du nœud :

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

1 votes

La syntaxe donnée lève une exception avec les nouvelles versions de selenium-server (comme 3.2.0) : Exception dans le thread "main" com.beust.jcommander.ParameterException : Unknown option : -Dwebdriver.gecko.driver=geckodriver.exe at com.beust.jcommander.JCommander.parseValues(JCommander.java:742) ... Pour éviter cela, vous devez changer l'ordre des arguments (déclaration de propriété en premier, jar, et args. de programme après). Exemple : java -Dwebdriver.gecko.driver="./geckodriver.exe" -jar selenium-server-standalone-3.2.0.jar -role node -hub 10.64.201.100:4444/grid/register

3voto

dovy Points 358

Je crée une application Java simple par archétype maven-archetype-quickstar puis réviser le fichier 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>

et

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

}

Vous pouvez également l'utiliser sur Mac OS X, Linux : https://github.com/mozilla/geckodriver/releases

et

// On Mac OS X.
System.setProperty("webdriver.gecko.driver", "/Users/donhuvy/Downloads/geckodriver");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X