java - 如何使用 java 在 Selenium WebDriver 项目中表示页面对象导航

标签 java selenium-webdriver pageobjects

我在一些地方读到,当使用 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())));
}

但不幸的是,我无法让导航器根据用户输入转到任何页面。有没有一种方法可以做到这一点,或者是否有其他方法可以做到这一点?

来源:

最佳答案

我对返回泛型类型做了更多研究,并找到了解决问题的方法。关键是创建所提供类型的实例。可能会出现一些异常(exception)情况,因此我已尽力在此处概述它们:

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

关于java - 如何使用 java 在 Selenium WebDriver 项目中表示页面对象导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16229163/

相关文章:

java - 如何使用 Spring Boot 配置 Selenium WebDriver 进行 UI 测试?

javascript - 实习生js :How to return PageObject of the page from the function which opens it ?

java - 如何发出逗号分隔的列表?

java.lang.ClassCastException : ConditionalOnJava$JavaVersion cant be cast to org. springframework.boot.system.JavaVersion 错误

java - 使用 Openshift 将文件保存到已部署的应用程序文件夹中

java - Internet Explorer 未选择网页上的元素

java - 将应用程序移至 javafx 中的第二个窗口监视器

java - 如何在 cucumber 与 Selenium 的步骤中进行断言

testing - 在同一测试规范中运行多个浏览器实例

javascript - PageObjects + 非 Angular 页面 - 如何加入它们?