2015-06-26 4 views
15

Ich habe verschiedene Testautomatisierungs-Frameworks mit dem Page Object Pattern mit Java (https://code.google.com/p/selenium/wiki/PageObjects) erstellt.Ist Ruby mit einem strengen Page Object Pattern kompatibel?

Zwei der großen Vorteile, die ich gefunden haben, sind:

1) Sie können sehen, welche Methoden verfügbar sind, wenn Sie eine Instanz einer Seite (zB homepage. Eingabe zeigt mir alle Aktionen/Methoden, die Sie anrufen können von der Homepage)

2) Da Navigationsmethoden (zB goToHomepage()) eine Instanz der Folgeseite (zB Homepage) zurückliefern, können Sie durch Ihre Tests navigieren, indem Sie den Code schreiben und sehen, wo er Sie hinführt.

z.B.

Diese Vorteile funktionieren perfekt mit Java, da der Typ des Objekts (oder der Seite in diesem Fall) von der IDE bekannt ist.

Allerdings ist der Objekttyp mit Ruby an keiner Stelle fest und oft nicht eindeutig für die IDE. Daher kann ich nicht sehen, wie Sie diese Vorteile in einer mit Ruby erstellten Automatisierungssuite realisieren können (z. B. mit Cucumber).

Kann mir jemand zeigen, wie Sie Ruby mit dem Page Object Pattern verwenden würden, um diese Vorteile zu erhalten?

Antwort

3

von dem Chat zu Kollegen ich folgenden vermuten könnte die beste Lösung sein (aber bitte eine alternative Antwort zu schreiben, wenn eine bessere Lösung existiert):

When(/^I buy a movie from the movie page$/) do 
    movie_page = MoviePage.new 
    movie_page.buyMovie("Test Movie") 
    purchase_page = PurchasePage.new 
    purchase_page.confirmPurchase 
end 

So im Beispiel oben wir keine Instanzen von dem zurückkehren nachfolgende Seite beim Navigieren auf der Seite (da die zurückgegebene Seite einfach ein unbekannter Objekttyp wäre). Außerdem müssen wir eine neue Instanz jeder Seite erstellen, auf der wir uns befinden (mit ".new"), so dass wir zumindest die Intellisense-Vorteile der Eingabe von "movie_page" erhalten. und sehen, welche Aktionen/Methoden von dieser Seite verfügbar sind.

Hat jemand bessere Lösungen?

+2

Dies ist der Ansatz, den ich in Ruby verwende. Ich denke, es ist der klarste Weg zur Arbeit. Ich definiere jedoch '@movie_page || = MoviePage.new', damit ich die Seitenobjektinstanz in anderen Schritten wiederverwenden kann, ohne mehr Objekte zu erstellen, als ich brauche. Außerdem können Sie Variablen zwischen den Schritten in der Instanz dieser Seite speichern. Im Allgemeinen vermeide ich dies, da von einem Wartungs-POV nicht immer klar ist, wo es eingestellt wurde, aber in einigen Fällen ist es viel einfacher zu verwenden als viele @ Variablen in den Gurkenschritten zu verwenden. – alannichols

9

Von einigen weiteren Untersuchung, es sieht aus wie die ursprüngliche Anforderung Variablen Instanz mit erfüllt werden können:

Given(/^I am on the launch page$/) do 
    @launch_page ||= LaunchPage.new 
end 

When(/^I open the set alarm time page$/) do 
    @set_alarm_page = @launch_page.goto_set_alarm_page 
end 

When(/^I open our apps from the home page$/) do 
    @launch_page.navigation_toolbar.open_our_apps 
end 

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time| 
    alarm_time_actual = @launch_page.get_alarm_time 
    assert_equal(alarm_time, alarm_time_actual) 
end 

Solange irgendwo auf der Klasse Schritt Definition explizit eine neue Seite Objekt (im obigen Beispiel erstellen : LaunchPage.new), dann werden alle nachfolgenden Seiten angezeigt und stellen IntelliSense-Methoden/-Eigenschaftswerte bereit.

6

Ich benutze Spinat anstelle von Gurke - es ist fast identisch, aber die Schritte sind innerhalb einer Klasse enthalten, die einzigartig für diese Feature-Datei ist - so gibt es keine Leckage von Objekten außerhalb des aktuellen Bereichs.

https://github.com/codegram/spinach

+0

Bitte fügen Sie Links zu Ressourcen hinzu, die Sie erwähnen, um so hilfreich wie möglich zu sein. –

+0

Bearbeitet mit einem Link :-) –

Verwandte Themen