Müssen im Seitenobjektmodell alle Klassen eine einzelne Treiberinstanz gemeinsam nutzen?

Dec 19 2020

Ich kann eine BaseTest.java-Datei erstellen und den öffentlichen statischen WebDriver-Treiber deklarieren. drin. Dann können alle Klassen dieselbe Treiberreferenz erweitern und verwenden.

Dann können alle meine Testklassen dieselbe Instanz verwenden.

Kann ich benutzen:

driver = new ChromeDriver(); 

in jeder Testmethode oder jedem Gurkenszenario. Ich bin verwirrt, wie man den Treiber benutzt. Ist der Treiber eine Chrome-Fenstersitzung?

Antworten

2 JoãoFarias Dec 19 2020 at 16:31

Ist der Treiber eine Chrome-Fenstersitzung?

Nein. Ein ChromeDriver stellt einen Server dar, der einen lokal ausgeführten Chrome-Browser steuert. Der Server steuert den Lebenszyklus des Browsers, z. B. das Initiieren, Beenden und Steuern von Aktionen.

Weitere Einzelheiten finden Sie in den Dokumenten

Kann ich driver = new ChromeDriver () erstellen? in jeder Testmethode oder jedem Gurkenszenario

Ja, aber es hängt von Ihrem Kontext ab. Wenn mehrere Browser in einigen Aktionen unabhängig voneinander ausgeführt werden sollen, können Sie einen neuen Treiber erstellen.

Bonus:

Ich kann eine BaseTest.java-Datei erstellen und den öffentlichen statischen WebDriver-Treiber deklarieren. drin. Dann können alle Klassen dieselbe Treiberreferenz erweitern und verwenden.

Dies kann gefährlich sein. Vererbung ist die stärkste Form der Kopplung, die Sie herstellen können, und eine globale Variable kann zu Verhaltensänderungen führen, die sehr schwer zu verstehen sind. Möglicherweise möchten Sie Ihren Code so umgestalten, dass die Treiberinstanzen in Ihre Seitenobjekte eingefügt werden . Auf diese Weise koppeln Sie die Seitenobjekte nicht an eine globale Variable und können problemlos Komponententests für sie erstellen, indem Sie ein Testdouble für den Treiber einfügen.

2 PDHide Dec 19 2020 at 19:39

Was ist Chromedriver:

chromedriver verfügt über Code, der mit dem Browser interagieren kann. Diese Befehle werden über eine API verfügbar gemacht (Dies ist, was Sie als Chromedriver sehen, der auf localhost gestartet wurde: 14563). Über den Code greifen wir auf diese API-Endpunkte zu, um den Chrome-Treiber anzuweisen, etwas zu tun.

Wenn Sie beispielsweise elem.click () sagen, spricht Selen mit der API und weist chromedriver an, im Browser auf das angegebene elem zu klicken. Und der Chrome-Treiber macht das und gibt die Antwort vom Browser zurück und gibt sie an unseren Code zurück

Warum brauchen wir Basisklasse

Dies soll sicherstellen, dass Treibersitzungen zwischen verschiedenen Klassen übergeben werden. Sonst kannst du so etwas nicht machen

   page1.sendpassword()
   page1.sendusername()
   page1.submit()
   page2.adduser()

Denn wenn Sie unterschiedliche Treibersitzungen für Seite1 und Seite2 haben,

Sobald Sie page2.adduser () starten, wird der Chrome-Treiber neu gestartet und Ihre vorherigen Anmeldesitzungen sind nicht verfügbar, sodass Sie sich erneut anmelden müssen

Außerdem können Sie in Listener-Klassen keine Screenshots oder treiberspezifischen Aktionen für die Berichterstellung hinzufügen

Weitere Informationen zur Basisklasse finden Sie unter:

Was ist der Zweck des Erstellens einer BaseTest-Klasse, die ein globales statisches WebDriver-Objekt im POM-Framework deklariert?

AlexeyR. Dec 19 2020 at 16:33

Die WebDriver-Instanz in Ihrem Code ist eine Art Kanal, über den Sie mit einer einzelnen Sitzung der Implementierung des Webtreibers interagieren. Grundsätzlich verwenden Sie in Ihrem Code die sogenannte Client-Bindung .

Ein WebDriver ist ein HTTP-Server, der die REST-API auf der einen Seite für Ihre Client-Bindungen (z. B. Java-Bibliotheken) verfügbar macht und auf der anderen Seite den Browser steuern kann.

Daher muss Ihr gesamter Code, von dem angenommen wird, dass er mit derselben Chrome-Sitzung funktioniert (Cookies beibehalten usw.), dieselbe Instanz des Webtreibers gemeinsam nutzen.

Nichts hindert Sie daran, einen weiteren Taucher in Ihrem Code zu instanziieren. Durch diese neue Instanz erhalten Sie die Kontrolle über eine andere parallele isolierte Browsersitzung.