簡體   English   中英

如何使用java在Selenium WebDriver項目中表示頁面對象導航

[英]How to represent Page Object navigation in a Selenium WebDriver project using java

我在一些地方讀到,在使用WebDriver API時在頁面之間導航通常由頁面對象完成,返回導致導航發生的操作時應返回的下一頁。

該解決方案非常適用於始終返回相同頁面的操作(例如,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));
    }
}

導致頁面從一個頁面對象移動到另一個頁面對象的操作將實現如下方法:

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())));
}

但遺憾的是,我無法讓Navigator根據用戶輸入轉到任何頁面。 有沒有辦法做到這一點,或有其他方法來做到這一點?

資源:

我對返回通用類型做了一些研究,並找到了解決問題的方法。 關鍵是要創建和提供的類型的實例。 有一些例外可能發生,所以我盡力在這里概述它們:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM