2

次のようなJavaコードをSelenium1(RC)からSelenium 2(WebDriver)に移行しようとしています。

1:  selenium.click(someButton);
2:  selenium.waitForPageToLoad();
3:  if (!selenium.isElementPresent(errorMessageElement)) {
4:     Assert.fail("Test failed! No error msg should be displayed on page.");
5:  }

重要な部分は3行目です。これは、 RostislavMatlのアドバイスに従ってSelenium2に変換しようとしました。

3:  if (!driver.findElements(By.xpath(errorMessageElement)).size() > 0) {

残念ながら、WebDriverは、要素が実際に存在しないことを検出するために、タイムアウト全体(私の場合は60秒)を待機します。これは機能しますが、オーバーヘッドがかかりすぎます...

Selenium 2には、現在Webブラウザーに表示されているHTMLページに要素が存在するかどうかを時間効率よくチェックする方法はありますか?

4

3 に答える 3

3

ここに2つの部分の答えがあります

  1. 時間のオーバーヘッドは正しいです:要素が実際にレンダリングされていないことを確認したいので。つまり、ページのレンダリング時間、AJAX 要素などを考慮に入れます。ページの読み込みとともにエラー メッセージが表示されることは理解していますが、数ミリ秒の遅延で表示される ajax 要素の有無を確認する場合は、タイムアウトが役立ちます。

  2. 待機オーバーヘッドを削減するためのハック: それでも、このように暗黙の待機時間を一時的にリセットするメソッドを作成できます

public boolean isElementNotPresent(By by) {
    boolean flag = true;
    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
    if (!driver.findElements(by).size() > 0) {
        flag = false;
    } 
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    return flag;
}

不在を確認する場所でこのメソッドを呼び出します。たとえば、3 行目と 4 行目は次のようになります。

if (!isElementNotPresent(By.xpath(xpathoferrorelement))) {
    Assert.fail("Test failed! No error msg should be displayed on page.");
}
于 2012-09-21T07:30:55.117 に答える
1

FluentWait クラスを使用してみてください。使用したい条件を簡単に設定できます: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/FluentWait .html

于 2012-09-21T07:00:32.853 に答える
0

ページが既にレンダリングされている場合に、(存在するかどうかを確認するために) 私が通常使用するいくつかのアプローチ。アプローチ 1:

input.findElements(By.xpath("//xpath")).size() > 0

アプローチ 2:

driver.findElement(By.cssSelector(propertyKeysLoader(key))).isDisplayed()

アプローチ 3:

public bool IsElementPresent(By selector)
{
    return driver.FindElements(selector).Any();
}

要素をレンダリングしたい場合(ページにすべてのAJAXがない場合)、アレックが述べたように流暢な待機を使用することをお勧めします。

 public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

文字列では、.pollingEvery(5, TimeUnit.SECONDS)任意の反復タイムアウトを設定できます。快適です。これが何らかの形で役立つことを願っています)

于 2012-09-21T16:08:14.580 に答える