J'apprends maintenant le sélénium et j'ai rencontré un problème.
Je suis conscient que Selenium supportait 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 en utilisant System.setProperty
.
Selon ce lien , pour Firefox 45 et 46, le code de démarrage devrait ressembler à ceci:
WebDriver driver = new FirefoxDriver();
Mon Firefox est la version 45.5.1., Mais le code ci-dessus ne fonctionnera toujours pas. Donc, selon ce lien , j'ai ajouté:
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
Et ça a fonctionné.
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é 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 que pas geckodriver.exe
N'existe dans mon environnement. Si aucun emplacement n'a été indiqué, alors pourquoi devrais-je définir la propriété?
Aussi, j'ai vu le 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 en raison du changement de politique qui exige désormais que toutes les extensions soient signées par Mozilla.
Marionette est le nouveau pilote fourni/inclus avec Firefox. Ce pilote a son propre protocole qui n'est pas directement compatible avec le protocole Selenium/WebDriver.
Le pilote Gecko (fils précédemment nommés) est un serveur d'applications implémentant le protocole Selenium/WebDriver. Il traduit les commandes Selenium et les transmet au pilote Marionette.
Pour le client Java, le comportement par défaut consiste à utiliser le pilote Gecko, mais il peut être remplacé pour utiliser l'extension existante en tant que pilote avec le webdriver.firefox.marionette
propriété:
System.setProperty("webdriver.firefox.marionette", "false");
ou avec la capacité marionette
à travers 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 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é attribuée dans la ligne de commande:
Java -Dwebdriver.gecko.driver="C:\\geckodriver.exe" -jar Selenium-server-standalone-3.4.0.jar
Jusqu'au lancement de Firefox 47.x, le pilote existant était implémenté sous la forme d'une extension Firefox. Cette extension a été installée dans le profil utilisé par le pilote lorsque 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 lors, GeckoDriver
la solution basée sur Marionette, développée et maintenue par Mozilla, est destinée à être utilisée pour automatiser le navigateur Mozilla Firefox.
Selon la documentation officielle de Mozilla sur developer.mozilla.org . Marionette est le pilote de l'automation . Il utilise le protocole distant de Firefox qui permet de contrôler l'interface utilisateur. Marionette accepte les requêtes et les exécute en Gecko. Il a aussi un client. Le client envoie des instructions au serveur et celui-ci les exécute 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");
Il existe certaines références permettant de renommer le fichier exécutable en ‘fils.exe’ et de l’ajouter à votre chemin. C'est pourquoi on a utilisé:
System.setProperty("webdriver.firefox.marionette","C:\\wires.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://gmail.com");
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 cas de test. GeckoDriver lancera à son tour le navigateur Mozilla Firefox.
Ces extraits ont été extraits de la réponse épique de de Jim Evan à la question . Quels sont les Les avantages d’utiliser Marionette FirefoxDriver au lieu de l’ancien Selenium FirefoxDriver pour un testeur de sélénium? nous permettent de comprendre de manière détaillée comment GeckoDriver et Marionette est entré en vigueur.
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");
Dans le scénario actuel, vous avez toujours la possibilité d'exécuter votre Automation via le navigateur Firefox 47.x hérité et les dernières versions du navigateur Firefox 53.x.
Si vous utilisez les anciens navigateurs Firefox 47.x, vous devez explicitement définir "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");
Si vous utilisez les anciens navigateurs Firefox 47.x, si vous omettez de définir "marionette" sur false ou si vous définissez "marionette" sur true, vous observerez un IllegalStateException
Si vous utilisez les navigateurs Firefox 53.x, vous pouvez choisir de passer le paramètre "marionette" à true comme suit, ce qui affichera les journaux Marionette INFO, 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");
Si vous utilisez les navigateurs Firefox 53.x, vous pouvez explicitement définir "marionette" sur true via la classe DesiredCapabilities qui affichera également les journaux Marionette WARN, par exemple. WARN TLS certificate 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");
Si vous utilisez les navigateurs Firefox 53.x, si vous définissez avec force "marionette" sur false via la classe DesiredCapabilities, vous observerez un UnreachableBrowserException
.
Marionette est le nouveau pilote fourni/inclus avec les dernières versions de Firefox.
Cependant, Geckodriver est un proxy permettant aux clients compatibles W3C WebDriver d'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, telle que la version de Firefox ci-dessus 47.
System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
WebDriver driver = new FirefoxDriver();
Si vous rencontrez toujours des problèmes (en raison de l'incompatibilité des versions FF), vous pouvez utiliser les fonctionnalités suivantes:
DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);