Wie Selen funktioniert: Episoden 1 - 2

Eine Übersetzung des Artikels wurde vor Beginn des Java QA Engineer- Kurses erstellt .



Folge 1 - Transport


Als Ergebnis des Dialogs, der am letzten Januarwochenende 2020 stattfand und einem der Probleme in Selen gewidmet war, in dem mir jemand sagte, "warum Sie das einfach nicht tun ...", als Antwort auf die Erklärung des Problems, beschloss ich, eine Reihe von Artikeln zu schreiben, in denen die Befehle erläutert wurden bei Selenium WebDriver und warum wir zu dem Design gekommen sind, das wir heute haben.

Ich werde dies in jeder Episode dieser Serie wiederholen - viel, manchmal bis zum Wahnsinn, viel Nachdenken und Nachdenken wurde in die Arbeit jedes kleinsten Details von Selen gesteckt.

Warum?

Durch Zufall und wie gut er tut, was er tun soll, wird Selen von Millionen von Menschen auf der ganzen Welt verwendet. Auf diese Weise stellt die größte Auswahl an Unternehmen, von kleinen Startups bis hin zu Microsoft und Google, sicher, dass ihre Website in jedem Browser funktioniert.

Selenium ?


Im Laufe der Jahre von Selen haben wir uns darauf konzentriert, HTTP als Interaktionsmöglichkeit mit dem Browser zu verwenden. Wir haben die REST-ish-API (REST-ish - im Sinne von REST) ​​erstellt, die jede Clientbindung verwenden und hoffentlich die gleichen Ergebnisse erzielen kann.

HTTP und REST-ish? Ernsthaft?

Ja ...

Beginnen wir mit dem HTTP-Teil. Als wir anfingen, mussten wir verschiedene Arten der Interaktion mit jedem Browser unterstützen, basierend auf dem besten Ansatz für jeden von ihnen. Für Internet Explorer haben wir beispielsweise COM-Code geschrieben. Er hat gut gearbeitet, aber von ihm haben wir immer noch Albträume. Für Firefox haben wir ein zeilenweises Lesemonster geschrieben, das dank Mozillas Ansatz „Browser erstellen“ glücklicherweise zu viel fähig war. Opera erlaubte uns die Eingabe über das DevTools-Protokoll.

Dies bedeutete, dass wir insbesondere in den Anfangsjahren von WebDriver N: M-Bindungen unterstützen mussten, wobei N die Sprachbindungen und M die von uns unterstützten Browser sind. Dieser Weg führt nicht zu einem guten Produkt. Wir beschlossen, dass wir etwas brauchen, das jede Sprache verstehen würde. Wir brauchten auch etwas ziemlich Zuverlässiges. Die Wahl fiel also auf HTTP, und wir begannen mit der Erstellung JSONWireProtocol.

In diesem Framework haben JSONWireProtocolwir eine REST-ähnliche Schnittstelle erstellt, die in JSON kommuniziert. Ich sage REST-ish, weil es nicht absolut allen Prinzipien von REST folgt, sondern sie in einem Ausmaß verkörpert, das ausreicht, um es zu einem mächtigen Werkzeug für unsere Aufgaben zu machen.

Was ist mit dem aktuellen Stand der Dinge?

Web, Internet und die Welt bewegen sich weiter. Warum ist Selen nicht?

Das ist eine gute Frage, aber Tatsache ist, dass wir versuchen zu modernisieren. Leider ist das Netzwerk durch einen Zustand gekennzeichnet, in dem es nicht funktioniert, wenn es nicht ausgeführt wird. HTTP ist als Protokoll ziemlich zuverlässig. Außerdem können Benutzer Cluster zum Testen erstellen, ohne sich Gedanken darüber machen zu müssen, wie Multiplexing funktioniert. Dies ist der Grund, warum Selenium Grid erstellt wurde, das immer noch eine gute Wahl ist, wenn es darum geht, Tests mit mehreren Geräten und Computern zu organisieren.

Aber es sieht eher aus wie ein Netzwerk.

Also ... Es gibt Tools, die das Chrome Debug Protocol verwenden, um Chrome zu steuern. Sie machen einige Dinge besser als Selen, was eine Folge ihrer Wahl der Kommunikation mit dem Browser ist. Leider ist dies das proprietäre Protokoll von Chrome, und es ist nicht im Interesse von Google, es anderen Browsern zugänglich zu machen.

Wenn wir interessante Designlösungen des Google-Teams ignorieren, besteht ein derartiges Problem, dass wir eine ständig offene Verbindung haben müssen. In diesem Fall werden WebSockets verwendet. Sie sollten sich jedoch an meinen obigen Kommentar erinnern, dass das Internet nicht verfügbar ist, solange es nicht funktioniert. WebSockets stellen ständig eine neue Verbindung her. Es gibt auch das Problem, wie viel Verkehr auf diesem Kanal auf und ab geht.

Dies ist für den Puppenspieler kein Problem, wenn Sie nur auf Ihrem lokalen Computer mit etwas interagieren, aber wenn Sie einen CI-Dienst wie Circle CI oder TravisCI und etwas wie AWS Device Farm, Sauce Labs oder BrowserStack zwischen sich integrieren und Ihr Läufer erhält plötzlich das Internet, und diese Daten sollten die Empfänger erreichen.

Die Arbeitsgruppe W3C-Browsertests und -Tools, bestehend aus Browser-Anbietern und Selenium-Mitarbeitern, versucht zu entwerfen, wie alles aussehen soll, um sicherzustellen, dass wir von Anfang an die Cross-Browser-Kompatibilität sicherstellen können, ohne auf seltsame Hacker-Patches und deren persönliche Bereitstellung zurückgreifen zu müssen Browser.

Möchten Sie mehr wissen?



Episode 2 - Navigation
In dieser Episode werden wir uns eine Menge Arbeit im Zusammenhang mit der Navigation ansehen.

from selenium import webdriver

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


Was wir oben sehen ... sieht ganz einfach aus, richtig ... aber hier ist es!

Tatsächlich führt mich dies zu einem schwieligen Interview. Wenn Sie jemals gefragt werden, was im Browser passiert, wenn Sie die URL eingeben und die Eingabetaste drücken, besteht eine hohe Wahrscheinlichkeit, dass er keine wirkliche Vorstellung davon hat, was in der Navigation passiert. Wie auch immer ... zurück zu Selen und seiner Navigation. Sobald wir die Anfrage über die Transportschicht senden , beginnt der wahre Spaß. Wir müssen herausfinden, wohin wir wollen, und dem Browser sagen, dass er für uns dorthin gehen soll. Leider führt dies zu dem ersten von vielen Problemen bei der Automatisierung.

driver.get



Zertifikate


Wenn Sie jemals in großen Unternehmen gearbeitet haben, in denen Technologie nicht die Hauptrolle spielt, wissen Sie, welchen Schmerzen das Entwicklungsteam ausgesetzt sein kann. Verdoppeln Sie jetzt diesen Schmerz, und Sie können sich den Schmerz vorstellen, mit dem Tester und Automatisierungsingenieure zu kämpfen haben.

Eines dieser Probleme sind Zertifikate. Unternehmen sind geizig und werden selbstsignierte Zertifikate und andere Missbildungen erstellen. Besonders in den frühen Tagen von Selen, als es keine Dienste wie Let's Encrypt gab . Und selbst jetzt haben die meisten Entwickler und QS-Gruppen selten Zugriff auf Konfigurationsänderungen in ihren Testumgebungen oder auf ihren CI-Servern. Wir mussten einen Weg finden, um Zertifikate zu umgehen. ( Dies ist einer der ersten Gründe, warum Selen als Sicherheitsrisiko angesehen wird. )

Daher überspringt jeder Browser während der Automatisierung schlecht konfigurierte Zertifikate. Wenn sie dies nicht erkannt hätten, hätten viele Tester / Entwickler nicht die Möglichkeit, ihre Websites zu testen.

Nun ... als wir das erste Problem umgangen haben, müssen wir mit dem Laden der Seite fortfahren.

Wird geladen


Sobald wir die Zertifikate erhalten haben, erhalten wir die Seite zum Herunterladen. Glücklicherweise müssen wir nichts Komplizierteres als das Äquivalent tun

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


Erledigt ...


Wenn Selen das Team „vervollständigt“, erhalten wir eine Rückerstattung. Wir müssen also nur warten, bis die Seite geladen ist. Um ganz ehrlich zu sein, was bedeutet "fertiges Laden" ?

Der Browser löst verschiedene Ereignisse aus. Wir werden wissen, wann die Seite angezeigt wird und was es ist readyState. Selen wird dies alles testen und auch warten DOMContentLoaded.

Und dann tritt ein Problem auf, wenn Sie sich auf einer Seite befinden und versuchen, zum Anker auf dieser Seite zu springen. Schauen wir uns das folgende Beispiel an.

from selenium import webdriver

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


Oh, schau mal, keines der Seitenladeereignisse wird ausgelöst! Klasse? Ein dummer Browser arbeitet effizient und scrollt einfach zum Anker. Dies bedeutet, dass wir uns nicht nur auf Ereignisse verlassen können, die von der Seite ausgehen.

Nein, daher benötigen wir für diesen Fall einen speziellen Code und ein Verständnis dafür, was „bereit“ in diesem Fall bedeutet. Wenn wir einen Fehler machen, führt dies zu vielen instabilen Tests. Instabile Tests machen die Leute mürrisch, und wir wollen keine mürrischen Entwickler, es gibt genug davon auf der Welt und ohne instabile Tests.

Nachdem wir diese Überprüfungen abgeschlossen haben und Sie die Art und Weise ändern können, wie wir diese Ereignisse betrachten, können Sie sie mithilfe von Seitenladestrategien schneller laden. Dies ist eher eine Fertiger-Benutzerfunktion, daher würde ich mich jetzt nicht darum kümmern, aber sie wirken sich auf die Geschwindigkeit der Navigationsbefehle aus.

Was ist mit JavaScript-Frameworks und Navigation?


Dies ist der Ort, an dem sich der ganze "Spaß" konzentriert. Viele Frameworks werden nach dem ersten Laden auf der Seite immer noch viel geladen. Wenn Sie jemals an einer einseitigen Anwendung gearbeitet oder diese nur verwendet haben, wurden beim Laden viele Elemente angezeigt. Leider bedeutet dies, dass Sie sich nicht nur auf die Rückgabe des Navigationsbefehls verlassen können. Sie müssen WebDriverWaitIhrem Code einen Befehl hinzufügen , wie unten gezeigt, um sicherzustellen, dass sich Ihr Test im richtigen Zustand befindet, bevor Sie das tun, was er benötigt.

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”))


Fazit


Verlassen Sie sich beim Laden einer Seite nicht immer darauf, dass Selenium zurückkehrt, wenn die Seite vollständig geladen ist. Wenn Sie sich ein Element auf einer Seite ansehen müssen, tun Sie es. Sie müssen nur wissen, wie JavaScript auf der Seite es nach dem ersten Laden ändern kann.

Zur weiteren Lektüre






Erfahren Sie mehr über den Kurs .



All Articles