6

私は Selenium WebDriver を使用して、私が取り組んできたいくつかのプロジェクトの機能テストを実装しています。Page Object 設計パターンを Page Factory で使用して、ロケーターを除外しようとしています。また、オプションのタイムアウト パラメーターを使用していくつかの待機手法を実装する静的な WaitTool オブジェクト (シングルトン) も作成しました。

私の現在の問題は、PageFactory が WebElements を初期化しようとする前に、待機メソッドを使用したいということです。私が待ちたい理由は、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())));
    }
}

テストケースをより読みやすくするため、ロジックをできる限り (待機を含めて) ページオブジェクトに配置する傾向があります。

4

1 に答える 1

8

PageFactroy 内の WebElements は、実際には WebElements のプロキシです。これは、WebElement にアクセスするたびに、検索を実行してページ上の要素を見つけることを意味します。

これにはいくつかの利点があります。

  • PageFactory が初期化されると、プロキシが構成されますが、その時点で WebElements が見つかりません (したがって、NoSuchElementException は取得されません)。
  • WebElement を使用するたびに再検索されるため、StaleElementException を使用しないでください。

@CacheLookup アノテーションを使用すると、要素を一度見つけてから参照を保持するため、2 番目の利点が失われます。StaleElementExceptions が表示される可能性がはるかに高くなります。

そうは言っても、Selenium がページに移動せず、最初に使用するまで要素を実際に見つけないという主な利点は引き続き保持されます。

要約すると、あなたがする必要があるのは移動することだけです

PageFactory.initElements(driver, this);

コンストラクターに入れると、すべて正常に機能します。

于 2013-04-24T05:45:52.870 に答える