2012-10-31 2 views
7

Ich habe an einem Team gearbeitet, das seit einigen Monaten eine Selenium WebDriver-Infrastruktur entwickelt, und etwas über die Art, wie wir von Testfällen und Seitenobjekten auf das Treiberobjekt zugreifen, nervt mich.Wie funktioniert das Kopieren/Übergeben von Instanzen eines WebDrivers und ist das gefährlich?

Unsere Testfälle erstellen eine neue WebDriver-Instanz und öffnen den Browser. Diese neue Instanz wird in der Testfallklasse gespeichert.

Dann instanziiert der Testfall ein Seitenobjekt. Diese Seite Objekte zusammen mit Selenium's Page Object Pattern nehmen den WebDriver als Parameter in ihrem Konstruktor (obwohl ich in unserer Version feststellen, ist es nicht endgültig). Die verschiedenen Seitenobjektmethoden verwenden den Treiber, der im Konstruktor des Seitenobjekts festgelegt wurde, um das zu tun, was sie tun. Wenn eine Seitenobjektmethode zu einem neuen Seitenobjekt navigiert, wird der WebDriver an sie übergeben. Genau wie in Selenium Vorbild:

public class LoginPage { 
    private final WebDriver driver; 

    public LoginPage(WebDriver driver) { 
     this.driver = driver; 

     // Check that we're on the right page. 
     if (!"Login".equals(driver.getTitle())) { 
      // Alternatively, we could navigate to the login page, perhaps logging out first 
      throw new IllegalStateException("This is not the login page"); 
     } 
    } 

    // Conceptually, the login page offers the user the service of being able to "log into" 
    // the application using a user name and password. 
    public HomePage loginAs(String username, String password) { 
     // This is the only place in the test code that "knows" how to enter these details 
     driver.findElement(By.id("username")).sendKeys(username); 
     driver.findElement(By.id("passwd")).sendKeys(password); 
     driver.findElement(By.id("login")).submit(); 

     // Return a new page object representing the destination. Should the login page ever 
     // go somewhere else (for example, a legal disclaimer) then changing the method signature 
     // for this method will mean that all tests that rely on this behaviour won't compile. 
     return new HomePage(driver); 
    } 
} 

Dies es, als ob die Instanz WebDriver scheinen macht einzigartig und wichtig ist, wie eine Fackel, die von Seite zu Seite Objekt-Objekt übergeben werden müssen. Der Stil des Codes führte mich zu der Annahme, dass ich immer sicherstellen musste, dass ich dieselbe Instanz des Treibers verwendete, die in der letzten Operation verwendet wurde.

Diese "Weitergabe der Fackel" wird jedoch bei Situationen, in denen mehrere Seitenobjekte auf einer Seite vorhanden sind, kompliziert und unmöglich, und Seitenobjektmethoden geben das Seitenobjekt, mit dem Sie arbeiten möchten, nicht zurück. Wie können Sie mit derselben WebDriver-Instanz arbeiten, wenn Sie zwei Seitenobjekte auf dem Bildschirm haben und zwischen diesen wechseln müssen, ohne zu einer neuen Seite zu wechseln oder neue Seitenobjekte zu erstellen?

All diese Verwirrung führt mich zu der Annahme, dass keine Weitergabe der Fackel tatsächlich notwendig ist, oder vielleicht sogar passiert (sind all diese Seitenobjekte Referenzen auf die gleiche WebDriver-Instanz?), Aber ich weiß nicht warum Muster wurde in der Beschreibung von Selenium vorgeschlagen.

Also, muss ich mir Sorgen machen über "die Fackel übergeben?" Oder funktioniert jedes Seitenobjekt, sobald es mit seinem WebDriver instanziiert wurde, selbst wenn andere Seitenobjekte in der Zwischenzeit Operationen mit ihren eigenen Versionen desselben WebDrivers ausführen?

Wäre es einfacher/besser, den WebDriver zu einem Singleton zu machen, der für alle zugänglich ist, da wir zu einem bestimmten Zeitpunkt nicht mehr als einen WebDriver pro JVM verwenden werden? Dann müssten wir den WebDriver überhaupt nicht in Konstruktoren übergeben. Vielen Dank im Voraus für jede Eingabe.

+1

gut, ich in meinem Projekt habe die folgende Struktur bekommt: BaseSeleniumTest.java, die von anderen Klassen erweitert wird (mit Satz von tets mit @ Test Annotation). Also in BaseSeleniumTest.java deklariere ich WebDriver Treiber; Als statische Variable und auf diese Weise vermeide ich das Erstellen mehrerer WebDriver-Instanzen. –

+0

Um das herauszubringen, gibt es einige Fälle, in denen Sie mehrere Webdriver-Instanzen benötigen, wenn Sie für einen bestimmten Anwendungsfall buchstäblich mit zwei verschiedenen Browsern arbeiten müssen. – grumpasaurus

+0

"...dann weiß ich nicht, warum dieses Muster in der Beschreibung von Selenium vorgeschlagen wurde. "Kannst du einen Link dazu liefern? Meine Erinnerung war, dass sie eine WebDriver-Instanz an statische Methoden übergeben haben. – grumpasaurus

Antwort

4

Es ist besser, den Webdriver als Singleton für das gesamte Framework zu markieren. Ich habe dieses Muster gerade benutzt und es funktioniert gut.
Hinweis: Bei der parallelen Ausführung ist Vorsicht geboten.

@CodeEnthusiastic Zum Beispiel nehmen Sie eine Klasse GeneralLibrary, dass eine WebDriver erstellen.

die Klassen in Seite Objektmodell erweitert mit GeneralLibrary als Superklasse

+0

I Ich würde definitiv gerne ein Singleton verwenden, insbesondere wenn der WebDriver tatsächlich eine Art von Zustandsinformationen verwaltet, die es zwingend erforderlich machen, dass alle Seitenobjekte und Operationen _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ = _ Ich denke nicht, dass wir die parallele Ausführung auf derselben Maschine mit derselben JVM planen. Meine bisherigen Erfahrungen mit Selen machen mir Sorgen, dass es zu zerbrechlich ist, um das zu tun - ich würde mir Sorgen machen, dass in einem Browser die Ausführung auf einem anderen Browser fehlschlägt. –

+0

@rironin, Jede Webdriver-Instanz ist einer Sitzungs-ID zugeordnet, die als zufällig generierter 32-Bit-Schlüssel angenommen werden kann. So wirkt sich eine Browser-Aktion überhaupt nicht auf andere aus. –

+0

Es macht Sinn, dass ein Browser den anderen überhaupt nicht direkt beeinflusst, aber hat IE insbesondere keine Probleme mit der laufenden Automatisierung, wenn das IE-Fenster nicht im Fokus ist? Funktionieren alle Automatisierungsaufrufe gleich gut, wenn das Browserfenster von einem anderen Browserfenster abgedeckt wird, wenn die Browser minimiert sind? Ich denke, es wäre unmöglich zu garantieren, dass die Browser, auf denen gearbeitet wird, den Fokus haben oder sichtbar wären, wenn Sie mehrere Tests gleichzeitig auf demselben Computer ausführen würden. –

Verwandte Themen