30

TestNG で Selenium Web Driver を使用してテスト ケースを作成しており、複数のテストを順番に実行するシナリオがあります (以下を参照)。

@Test(priority =1)
public void Test1(){
}
@Test(priority =2)
public void Test2(){ 
}

両方のテストは、ダイアログ ボックスが開き、テストが実行され、ダイアログ ボックスが閉じて、ページの上部に通知メッセージが表示され、テストが成功するたびにページが更新される AJAX 呼び出しです。

問題は次のとおりです。Test2 は、ページが更新/再ロードされるのを待ちません。Test1 が正常に完了すると、ページが更新される前に Test2 が開始されます (つまり、ダイアログ ボックスが開かれ、シナリオが実行されます)。その間、ページが更新されます (これは、 Test1 の実行が成功した後に発生するはずでした)。ページが更新されると、Test2 によって開かれたダイアログ ボックスが表示されなくなり、Test2 が失敗します。

(また、ページを更新するのにどれくらいの時間がかかるかわかりません。したがって、Test2 を実行する前に Thread.sleep(xxxx) を使用したくありません)

また、私は思わない

driver.navigate().refresh()

その場合、ページが2回更新されるため、Test2の前に配置することで問題を解決します。問題は、コードを介して行われている更新です (1 秒、3 秒、または 5 秒かかる場合があるため不明です)。

4

3 に答える 3

22

要素が表示されるのを待っている場合

Selenium rcでは、これを使用してこれを行っていましたselenium.WaitForCondition("selenium.isElementPresent(\"fContent\")", "desiredTimeoutInMilisec")

Webドライバーでは、これを使用して同じことを達成できます

WebDriverWait myWait = new WebDriverWait(webDriver, 45);
ExpectedCondition<Boolean> conditionToCheck = new ExpectedCondition<Boolean>()
{
    @Override
    public Boolean apply(WebDriver input) {
        return (input.findElements(By.id("fContent")).size() > 0);
    }
};
myWait.until(conditionToCheck);

このようにして、test2 を実行する前に要素が存在するのを待つことができます。

更新しました :

ページが読み込まれるのを待っている場合は、Web ドライバーで次のコードを使用できます。

public void waitForPageLoaded(WebDriver driver)
{
    ExpectedCondition<Boolean> expectation = new
ExpectedCondition<Boolean>() 
    {
        public Boolean apply(WebDriver driver)
        {
            return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
        }
    };
    Wait<WebDriver> wait = new WebDriverWait(driver,30);
    try
    {
        wait.until(expectation);
    }
    catch(Throwable error)
    {
        assertFalse("Timeout waiting for Page Load Request to complete.",true);
    }
}
于 2012-11-06T05:15:18.617 に答える