2013-04-26 63 views
4

在使用WebDriver API時在頁面之間導航的幾個地方,我已閱讀過一些頁面對象通常返回下一頁的頁面,導致導航發生。如何在使用java的Selenium WebDriver項目中表示頁面對象導航

該解決方案對於始終返回相同頁面的動作(例如,SearchPage.search()返回新的ResultPage)非常適用,但是當動作可能會將用戶置於不同頁面時取決於某些輸入或狀態會發生什麼。 Java不允許基於返回類型重載方法。那麼這怎麼做呢?

我粗略地嘗試實現了一個Navigator對象,該對象可以用來根據預期的結果返回一個通用的Page對象。

public class Navigator { 

    private WebDriver driver; 
    private String baseUrl; 
    private Map<Class, String> pagesToRelativePaths; 


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

    public Navigator(WebDriver driver, String baseUrl, Map<Class, String> pagesToRelativePaths) { 
     this.driver = driver; 

     setBaseUrl(baseUrl); 
     setPagesToRelativePaths(pagesToRelativePaths); 
    } 

    public void setBaseUrl(String baseUrl) { 
     this.baseUrl = baseUrl; 
    } 

    public void setPagesToRelativePaths(Map<Class, String> pagesToRelativePaths) { 
     this.pagesToRelativePaths = pagesToRelativePaths; 
    } 

    public <T extends PageBase> T navigateTo(Class<T> type) { 
     driver.get(baseUrl + pagesToRelativePaths.get(type)); 

     return type.cast(new PageBase(driver)); 
    } 

    public <T extends PageBase> T expectedLandingPage(Class<T> type) { 
     return type.cast(new PageBase(driver)); 
    } 
} 

行動,將導致從一個Page對象移動到另一個頁面將實現像這樣的方法:

public Navigator signIn(String username, String password) { 
    usernameField.type(username); 
    passwordField.type(password); 
    signInButton.click(); 

    return new Navigator(driver); 
} 

和測試是這樣的:

@Test 
public void SignInWithInvalidCredentialsTest() { 
    SignInPage signInPage = navigator.navigateTo(SignInPage.class); 

    signInPage = signInPage.signIn("invalid", "invalid").expectedLandingPage(SignInPage.class); 

    assertThat(signInPage.getTitle(), is(equalTo(driver.getTitle()))); 
} 

但不幸的是,我無法讓導航器根據用戶輸入轉到任何頁面。有沒有辦法做到這一點,或有其他方法可以做到這一點?

來源:

回答

4

我做了些研究進入返回泛型類型,並找到了解決問題的辦法。關鍵是創建和提供的類型的實例。有幾個例外可能發生,所以我盡力在這裏概述它們:

public <T extends PageBase> T navigateTo(Class<T> type) { 
    driver.get(baseUrl + pagesToRelativePaths.get(type)); 

    return getPage(type); 
} 

public <T extends PageBase> T expectedLandingPage(Class<T> type) { 
    return getPage(type); 
} 

private <T extends PageBase> T getPage(Class<T> type) { 
    T page = null; 

    try { 
     page = type.getDeclaredConstructor(WebDriver.class).newInstance(driver); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } 

    return page; 
} 
相關問題