2015-05-05 16 views
5

Ich entwickle ein Selen WebDriver-Framework [Java], in dem es eine Basisklasse gibt und jede andere Klasse sich von dieser Klasse erstreckt. Ich folge auch dem Page Object Model, wobei auf jeder Seite eine Klasse und Methode steht, mit der zur nächsten Seite navigiert wird, um eine neue Instanz der nächsten Seite/Klasse zurückzugeben. Kurz gesagt entspricht jeder UI Seite KlasseWie man bessere OOPs implementiert

Jetzt jede Seite einige gemeinsame Funktionen haben so statt jeder Klasse sie bei der Umsetzung und DRY vermeiden ich diese Seite Klasse in meiner Basis

für ex goBack Verfahren am Putten ist auf jede Seite, die im Wesentlichen zur vorherigen Seite navigiert.

Meine Sorge ist, ich möchte Verkettung zwischen den Seiten/Klassen folgen und daher bin ich mir nicht sicher, was der Rückgabetyp der üblichen Methoden für ex goBack sein sollte.

Denken Sie daran, dass jede Methode, die zur nächsten Seite navigiert, eine neue Instanz dieser Seite zurückgeben soll.

Eine Lösung, die ich dachte, war Generika zu implementieren, aber immer noch kämpfen. Kann mir jemand helfen, wie ich das erreichen kann?

public class BasePage { 
      public WebDriver driver; 
      public BasePage(WebDriver driver) { 
       this.driver=driver; 
      } 
      public BasePage clickGoBack() throws Exception{ 
      driver.click(goBackButton); 
      return this; 
      } 
     } 
+1

Das ist, was ich tue: public T clickGoBack (Klasse expectedPage) –

+0

Ich NPE bekommen. Mein Code ist öffentlich T clickGoBack (Klasse a) löst Ausnahme aus { \t \t driver.click (goBackButton); \t \t T ob = a.newInstance(); \t \t Rückgabe ob; \t} –

+1

OK ich löste es. Da meine Basisklasse einen parametrisierten Konstruktor hatte, muss ich eine neue Instanz über den Konstruktor public aufrufen T clickGoBack (Klasse a) löst Ausnahme aus { \t \t driver.click (goBackButton); \t \t Konstruktor cons = a.getConstructor (WebDriver.class); \t \t T ob = cons.newInstance (Treiber); \t \t Rückgabe ob; \t \t \t} –

Antwort

7

BasePage Bedürfnisse der Umsetzung Typ kennen Verkettungs:

/** 
* @param <T> The implementing type. 
*/ 
public abstract class BasePage<T extends BasePage<T>> {} 

Dann könnten Sie verwenden:

public T clickGoBack() { return (T) this; } 

Das Problem hier ist, dass this nicht unbedingt eine Instanz von T so ist die Besetzung nicht sicher, zum Beispiel mit der folgenden Klasse:

public class Page1 extends BasePage<Page2> {} 

Eine Lösung ist es, die Unterklassen zu bitten, ihre this:

public abstract class BasePage<T extends BasePage<T>> { 

    protected final WebDriver driver; 

    public BasePage(WebDriver driver) { 
    this.driver = driver; 
    } 

    public T clickGoBack() throws Exception{ 
    driver.click(goBackButton); 
    return getThis(); 
    } 

    protected abstract T getThis(); 

} 

public class HomePage extends BasePage<HomePage> { 

    public HomePage(WebDriver driver) { 
    super(driver); 
    } 

    @Override 
    protected HomePage getThis() { 
    return this; 
    } 

} 
Verwandte Themen