簡體   English   中英

使用Java在Selenium WebDriver中使用PageObjects,Page Factory和WebDriverWait

[英]Using PageObjects, Page Factory and WebDriverWait in Selenium WebDriver using Java

我一直在使用Selenium WebDriver為我曾經使用過的一些項目實現功能測試。 我正在嘗試使用Page Factory設計模式與Page Factory來分解我的定位器。 我還創建了一個靜態WaitTool對象(singleton),它使用可選的超時參數實現了幾種等待技術。

我目前的問題是我想在PageFactory嘗試初始化WebElements之前使用我的wait方法。 我想等待的原因是因為PageFactory可能會嘗試在頁面元素可用之前初始化頁面元素。

這是一個示例PageObject:

public class SignInPage extends PageBase {
    @FindBy(id = "username")
    @CacheLookup
    private WebElement usernameField;

    @FindBy(id = "password")
    @CacheLookup
    private WebElement passwordField;

    @FindBy(name = "submit")
    @CacheLookup
    private WebElement signInButton;

    public SignInPage(WebDriver driver) {
        super(driver);

        WaitTool.waitForPageToLoad(driver, this);

        // I'd like initialisation to occur here
    }

    public MainPage signInWithValidCredentials(String username, String password){
        return signIn(username, password, MainPage.class);
    }

    private <T>T signIn(String username, String password, Class<T> expectedPage) {
        usernameField.type(username);
        passwordField.type(password);
        signInButton.click();

        return PageFactory.initElements(driver, expectedPage);
    }
}

這是一個示例TestObject:

public class SignInTest extends TestBase {
    @Test
    public void SignInWithValidCredentialsTest() {
        SignInPage signInPage = PageFactory.initElements(driver, SignInPage.class);

        MainPage mainPage = signInPage.signInWithValidCredentials("sbrown", "sbrown");

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

我傾向於盡可能地將我的邏輯放在頁面對象中(包括等待),因為它使測試用例更具可讀性。

PageFactroy中的WebElements實際上是WebElements的代理。 這意味着每次訪問WebElement時,它都會執行搜索以在頁面上查找元素。

這有一些優點:

  • 初始化PageFactory時,會配置代理,但此時找不到WebElements(因此您不會獲得NoSuchElementException)
  • 每次使用WebElement時,它都會再次找到它,因此您不應該使用StaleElementException

您正在使用@CacheLookup注釋,它會失去第二個好處,因為它會找到該元素一次,然后保留對它的引用,您現在更有可能看到StaleElementExceptions。

話雖如此,你仍然保留了主要的好處,即Selenium不會進入頁面並實際找到元素,直到你第一次使用它。

總而言之,您需要做的就是搬家

PageFactory.initElements(driver, this);

進入你的構造函數,一切正常。

暫無
暫無

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

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