Différence entre webdriver.firefox.marionette et webdriver.gecko.driver

J’apprends maintenant le selenium et j’ai rencontré un problème.

Je suis conscient que Selenium supporte l’ancienne version de Firefox par défaut sans pilote. Et pour les versions récentes de Firefox, nous devons télécharger le pilote et le définir à l’aide de System.setProperty .

Selon ce lien , pour Firefox 45 et 46, le code du pilote de démarrage pourrait ressembler à ceci:

 WebDriver driver = new FirefoxDriver(); 

Mon Firefox est la version 45.5.1., Mais le code ci-dessus ne fonctionne toujours pas. Donc, selon ce lien , j’ai ajouté

System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");

Et ça a marché.

Ensuite, j’ai réalisé que je n’avais pas installé geckodriver.exe sur mon ordinateur. Pour voir comment ça se passe, j’ai changé pour le code ci-dessous.

 System.setProperty("webdriver.firefox.marionette",""); 

Ça fonctionne encore.

Alors, voici mon premier problème: que s’est-il passé? Je suis sûr qu’aucun geckodriver.exe n’existe sur mon environnement. Si aucun endroit n’a été désigné, alors pourquoi devrais-je définir la propriété?

J’ai aussi vu du code comme

 System.setProperty("webdriver.gecko.driver", "/tools/marionette/wires.exe"); 

Ma deuxième question est la suivante: quelle est la différence entre webdriver.gecko.driver et webdriver.firefox.marionette ou wires.exe et geckodriver.exe ?

Jusqu’à la version 45 (poussée à la version 47), le pilote utilisé pour automatiser Firefox était une extension incluse avec chaque client. Mais cette extension a été abandonnée, probablement à cause du changement de politique qui nécessite désormais que toutes les extensions soient signées par Mozilla.

Marionette est le nouveau pilote fourni avec Firefox. Ce pilote a son propre protocole qui n’est pas directement compatible avec le protocole Selenium / WebDriver.

Le pilote Gecko (précédemment nommé câbles) est un serveur d’applications implémentant le protocole Selenium / WebDriver. Il traduit les commandes de selenium et les transmet au pilote de marionnette .

Pour le client Java, le comportement par défaut consiste à utiliser le pilote Gecko, mais il peut être remplacé par l’extension héritée en tant que pilote avec la propriété webdriver.firefox.marionette :

 System.setProperty("webdriver.firefox.marionette", "false"); 

ou avec la capacité de marionette via FirefoxOptions :

 FirefoxOptions options = new FirefoxOptions() .setLegacy(true); WebDriver driver = new FirefoxDriver(options); // or with a remote server WebDriver driver = new RemoteWebDriver(remoteUrl, options.toDesiredCapabilities()); 

ou directement avec le DesiredCapabilities :

 DesiredCapabilities capa = DesiredCapabilities.firefox(); capa.setCapability("marionette", false); WebDriver driver = new FirefoxDriver(capa); // or with a remote server WebDriver driver = new RemoteWebDriver(remoteUrl, capa); 

Et pour définir l’emplacement du pilote Gecko, placez le pilote dans un dossier présent dans la variable d’environnement PATH ou définissez l’emplacement dans la propriété webdriver.gecko.driver :

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

ou lancez un serveur distant avec la propriété affectée dans la ligne de commande:

 java -Dwebdriver.gecko.driver="C:\\geckodriver.exe" -jar selenium-server-standalone-3.4.0.jar 

Jusqu’à ce que Firefox 47.x lance le pilote hérité a été implémenté en tant qu’extension Firefox. Cette extension a été installée dans le profil utilisé par le pilote chaque fois que WebDriver a lancé Firefox.

Nous avons donc utilisé:

 WebDriver driver = new FirefoxDriver(); driver.navigate().to("https://gmail.com"); 

Firefox 48 a désactivé l’extension du navigateur et introduit WebDriver. Depuis, GeckoDriver la solution basée sur Marionette, développée et maintenue par Mozilla, est destinée à l’automatisation du navigateur Mozilla Firefox.

Marionnette

Selon la documentation officielle de Mozilla sur developer.mozilla.org . Marionette est le pilote d’automatisation . Il utilise le protocole distant de Firefox qui peut contrôler l’interface utilisateur. Marionette accepte les demandes et les exécute à Gecko. Il a aussi un client. Le client envoie des instructions au serveur et le serveur exécute les instructions dans le navigateur.

Nous avons donc commencé à utiliser Marionette:

 System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.navigate().to("https://gmail.com"); 

Fils

Il existe des références pour renommer le fichier exécutable en “wires.exe” et l’append à votre chemin. Par conséquent, les éléments suivants ont été utilisés:

 System.setProperty("webdriver.firefox.marionette","C:\\wires.exe"); WebDriver driver = new FirefoxDriver(); driver.navigate().to("https://gmail.com"); 

GeckoDriver

GeckoDriver est le fichier exécutable que nous devons télécharger dans notre système et mentionner son emplacement dans nos scripts / programmes lors de l’exécution de nos tests. GeckoDriver lance à son tour le navigateur Mozilla Firefox.

Ces extraits ont été extraits de la réponse épique de Jim Evan à la question. Quels sont les avantages de l’utilisation de Marionette FirefoxDriver au lieu de l’ancien Selenium FirefoxDriver pour un testeur Selenium? ce qui nous fournit une compréhension détaillée de la façon dont GeckoDriver et Marionette sont entrées en pratique.

Nous avons donc commencé à utiliser geckodriver.exe:

 System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.navigate().to("https://gmail.com"); 

Maintenant, dans le scénario actuel, vous avez toujours la possibilité d’exécuter votre Automation via le navigateur Firefox 47.x et les versions récentes du navigateur Firefox 53.x.

Cas 1:

En cas d’utilisation des anciens navigateurs Firefox 47.x, vous devez définir explicitement “marionette” sur false via la classe DesiredCapabilities, comme suit:

 DesiredCapabilities dc = DesiredCapabilities.firefox(); dc.setCapability("firefox_binary", "C:\\Program Files\\Mozilla Firefox47\\firefox.exe"); dc.setCapability("marionette", false); WebDriver driver = new FirefoxDriver(dc); driver.navigate().to("https://gmail.com"); 

Usecase 2:

Si vous utilisez les anciens navigateurs Firefox 47.x, si vous ignorez la définition de “marionette” sur false ou si vous définissez “marionette” sur true, vous observerez une IllegalStateException

Usecase 3:

En cas d’utilisation des navigateurs Firefox 53.x, vous pouvez choisir de ne pas définir le paramètre “marionnette” sur true comme suit, ce qui affichera les journaux Marionette INFO Listening on port 11105 par exemple Marionette INFO Listening on port 11105 :

 System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.navigate().to("https://gmail.com"); 

Cas 4:

En cas d’utilisation des navigateurs Firefox 53.x, vous pouvez définir explicitement “marionette” sur true via la classe DesiredCapabilities qui affichera les journaux de Marionette WARN, par exemple WARN TLS certificatee errors will be ignored for this session

 System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); DesiredCapabilities dc = DesiredCapabilities.firefox(); dc.setCapability("marionette", true); WebDriver driver = new FirefoxDriver(dc); driver.navigate().to("https://gmail.com"); 

Usecase 5:

Si vous utilisez les navigateurs Firefox 53.x si vous définissez forcément “marionette” sur false via la classe DesiredCapabilities, vous observerez une UnreachableBrowserException .

Marionette est le nouveau pilote fourni avec les dernières versions de Firefox.

Cependant, Geckodriver est un proxy permettant d’utiliser des clients compatibles WDr3 WebDriver pour interagir avec les navigateurs basés sur Gecko. Geckodriver fournit une API HTTP décrite par le protocole WebDriver pour communiquer avec les navigateurs Gecko, tels que la version de Firefox supérieure à 47.

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

Si vous rencontrez toujours des problèmes (en raison d’une incompatibilité des versions FF), vous pouvez utiliser les fonctionnalités suivantes:

 DesiredCapabilities capabilities=DesiredCapabilities.firefox(); capabilities.setCapability("marionette", true); WebDriver driver = new FirefoxDriver(capabilities);