Comment fonctionne le sélénium: épisodes 1 à 2

Une traduction de l'article a été préparée avant le début du cours Java QA Engineer .



Épisode 1 - Transport


À la suite du dialogue qui a eu lieu le dernier week-end de janvier 2020, qui était consacré à l'un des problèmes de Sélénium, où quelqu'un m'a dit "pourquoi vous ne le ferez pas ..." en réponse à l'explication du problème, j'ai décidé d'écrire une série d'articles expliquant les commandes chez Selenium WebDriver et pourquoi nous nous sommes retrouvés avec le design que nous avons aujourd'hui.

Je vais répéter cela dans chaque épisode de cette série - beaucoup, parfois au point de la folie, beaucoup de réflexion et de réflexion a été mise dans le travail de chaque détail de Selenium.

Pourquoi?

Par chance et à quel point il fait ce qu'il est censé faire, le sélénium est utilisé par des millions de personnes dans le monde. C'est ainsi que le plus large éventail d'entreprises, des petites startups à Microsoft et Google, s'assure que leur site fonctionne dans tous les navigateurs.

Selenium ?


Au fil des ans de Selenium, nous avons fini par nous concentrer sur l'utilisation de HTTP comme moyen d'interagir avec le navigateur. Nous avons créé l'API REST-ish (REST-ish - dans l'esprit de REST), qui peut utiliser chaque liaison client et obtenir, nous l'espérons, les mêmes résultats.

HTTP et REST-ish? Sérieusement?

Ouais ...

Commençons par la partie HTTP. Lorsque nous avons commencé, nous devions prendre en charge différentes façons d'interagir avec chaque navigateur, en fonction de la meilleure approche pour chacun d'entre eux. Par exemple, pour Internet Explorer, nous avons écrit du code COM. Il a bien fonctionné, mais de lui nous avons encore des cauchemars. Pour Firefox, nous avons écrit un monstre de lecture ligne par ligne qui, heureusement, grâce à l'approche «make your browser» de Mozilla, était capable de beaucoup. Opera nous a permis d'entrer via le protocole DevTools.

Ainsi, cela signifiait que, en particulier dans les premières années de WebDriver, nous devions prendre en charge les liaisons N: M, où N est les liaisons de langue et M sont les navigateurs que nous prenons en charge. Cette voie ne mène pas à un bon produit. Nous avons décidé que nous avions besoin de quelque chose que chaque langue comprendrait. Nous avions également besoin de quelque chose d'assez fiable. Le choix s'est donc porté sur HTTP, et nous avons commencé à créer JSONWireProtocol.

Dans le cadre, JSONWireProtocolnous avons construit une interface REST-ish qui communique en JSON. Je dis REST-ish car il ne suit pas absolument tous les principes de REST, mais les incarne plutôt à un degré suffisant pour en faire un outil puissant pour nos tâches.

Qu'en est-il de l'état actuel des choses?

Le Web, Internet et le monde évoluent. Alors pourquoi le sélénium n'est-il pas?

C'est une bonne question, mais le fait est que nous essayons de nous moderniser. Malheureusement, le réseau est caractérisé par un état lorsqu'il ne fonctionne pas, s'il n'est pas en cours d'exécution. HTTP est assez fiable en tant que protocole. Il permet également aux utilisateurs de créer des clusters pour les tests sans se soucier du fonctionnement du multiplexage. C'est la raison pour laquelle Selenium Grid a été créé, qui reste toujours un bon choix lorsqu'il s'agit d'organiser des tests avec plusieurs appareils et ordinateurs.

Mais cela ressemble plus à un réseau.

Donc ... Il existe des outils qui utilisent son protocole de débogage Chrome pour contrôler Chrome. Ils font certaines choses mieux que Selenium, ce qui est une conséquence de leur choix de communication avec le navigateur. Malheureusement, il s'agit du protocole propriétaire de Chrome, et le rendre accessible à d'autres navigateurs n'est pas dans l'intérêt de Google.

De plus, en ignorant les solutions de conception intéressantes de l'équipe Google, il y a un problème tel que nous devons avoir une connexion constamment ouverte. Dans ce cas, il utilise WebSockets, mais vous devez vous rappeler mon commentaire ci-dessus selon lequel Internet n'est pas disponible tant qu'il ne fonctionne pas. WebSockets se reconnectera constamment. Il y a aussi le problème de la quantité de trafic qui montera et descendra sur ce canal.

Ce n'est pas un problème pour le marionnettiste lorsque vous interagissez avec quelque chose uniquement sur votre ordinateur local, mais si vous intégrez entre vous un service de CI tel que Circle CI ou TravisCI et quelque chose comme AWS Device Farm, Sauce Labs ou BrowserStack et votre coureur obtient soudainement Internet, et ces données devraient atteindre les destinataires.

Le groupe de travail W3C Browser Testing and Tools, composé de fournisseurs de navigateurs et de gars de Selenium, essaie de concevoir à quoi tout devrait ressembler pour être sûr que nous pouvons assurer la compatibilité entre les navigateurs dès le début, sans recourir à des correctifs de pirates étranges et à la livraison personnelle de ces derniers. navigateurs.

Vouloir en savoir davantage?



Épisode 2 - Navigation
Dans cet épisode, nous examinerons une énorme quantité de travail lié à la navigation.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


Ce que nous voyons ci-dessus ... semble assez simple, non ... mais le voici!

En fait, cela m'amène à une interview insensée. Si quelqu'un vous demande de décrire ce qui se passe dans le navigateur lorsque vous tapez l'URL et appuyez sur Entrée, il y a de fortes chances qu'il n'ait pas une idée réelle de ce qui se passe dans la navigation. Quoi qu'il en soit ... revenons à Selenium et à sa navigation. Dès que nous envoyons la demande via la couche transport , le vrai plaisir commence. Nous devons savoir où nous voulons aller et dire au navigateur d'y aller pour nous. Malheureusement, cela entraînera le premier de nombreux problèmes d'automatisation.

driver.get



Certificats


Si vous avez déjà travaillé dans de grandes entreprises, où la technologie n'est pas la principale, vous comprenez à quel type de douleur l'équipe de développement peut faire face. Maintenant, doublez cette douleur, et vous pouvez imaginer la douleur que les testeurs et les ingénieurs en automatisation doivent affronter.

L'une de ces douleurs est les certificats. Les entreprises sont avares et feront des certificats auto-signés et d'autres déformations. Surtout au début de Selenium, quand il n'y avait pas de services comme Let's Encrypt . Et même maintenant, la plupart des développeurs et des groupes d'assurance qualité ont rarement accès aux modifications de configuration dans leurs environnements de test ou sur leurs serveurs CI. Nous devions trouver un moyen de contourner les certificats. ( C'est l'une des premières raisons pour lesquelles le sélénium est considéré comme un risque pour la sécurité. )

Ainsi, chacun des navigateurs ignore les certificats mal configurés lors de l'automatisation. S'ils ne l'avaient pas réalisé, de nombreux testeurs / développeurs n'auraient pas la possibilité de tester leurs sites.

Maintenant ... lorsque nous avons contourné le premier problème, nous devons passer au chargement de la page.

Chargement


Dès que nous recevons les certificats, nous obtenons la page à télécharger. Heureusement, nous n'avons rien à faire de plus compliqué que l'équivalent

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


Terminé ...


Lorsque Selenium «complète» l'équipe, nous recevrons un remboursement. Il nous suffit donc d'attendre le chargement de la page. Pour être complètement franc, que signifie «chargement terminé» ?

Le navigateur déclenchera plusieurs événements différents. Nous saurons quand la page sera affichée, puis ce que c'est readyState. Sélénium testera tout cela et attendra également DOMContentLoaded.

Et puis un problème se pose si vous êtes sur une page et essayez de sauter à l'ancre sur cette page. Regardons l'exemple suivant.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


Oh, regardez, aucun des événements de chargement de page ne sera déclenché! Classe? Un navigateur stupide fonctionnera efficacement et fera défiler jusqu'à l'ancre. Cela signifie que nous ne pouvons pas dépendre uniquement des événements émanant de la page.

Non, par conséquent, nous avons besoin d'un code spécial pour ce cas et une compréhension de ce que signifie «prêt» dans ce cas. Si nous commettons une erreur, cela créera de nombreux tests instables. Les tests instables rendent les gens grincheux, et nous ne voulons pas de développeurs grincheux, il y en a assez dans le monde et sans tests instables.

Après avoir terminé ces vérifications, et vous pouvez manipuler la façon dont nous considérons ces événements, si vous souhaitez qu'ils se chargent plus rapidement à l'aide des stratégies de chargement de page. Il s'agit davantage d'une fonctionnalité utilisateur de pavé, donc je ne m'inquiéterais pas à leur sujet maintenant, mais ils affectent la vitesse des commandes de navigation.

Qu'en est-il des frameworks JavaScript et de la navigation


C'est l'endroit où tout le "plaisir" est concentré. De nombreux frameworks se chargeront toujours beaucoup après le chargement initial sur la page. Si vous avez déjà travaillé sur une application d'une seule page ou l'avez simplement utilisée, vous avez vu de nombreux éléments affichés lors de leur chargement. Malheureusement, cela signifie que vous ne pouvez pas simplement compter sur le retour de la commande de navigation. Vous devrez ajouter une commande WebDriverWaità votre code, comme indiqué ci-dessous, pour vous assurer que votre test est dans le bon état avant de faire ce dont il a besoin.

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))


Conclusion


Lors du chargement d'une page, ne comptez pas toujours sur le retour de Selenium lorsque le chargement de la page est terminé. Si vous devez regarder un élément sur une page, faites-le. Il suffit de savoir comment JavaScript sur la page peut le changer après le chargement initial.

Pour en savoir plus






En savoir plus sur le cours .



All Articles