2

Selenium を使用して JSF/RichFaces アプリケーションをテストしています。「要素が見つかりません」というエラーが原因で、テストがランダムに失敗します。これは、Selenium: 断続的な「要素が見つかりません」の問題で説明されているとおりですが、jQuery ajax 呼び出しにのみ関連しています。

ここでの課題は、 を使用してすべての ajax リクエストが完了するまで Selenium テストの実行を待機させることselenium.waitForCondition(jsExpression, timeout)です。RichFaces ajax呼び出しを使用する場合に最適なjsExpressionは何ですか?

4

2 に答える 2

1

a4j:status の生成された html を調査しました。以下のコードは今のところ仕事をしていますwait().ステートメントよりも優れていますが、私はより良い解決策を探しています.

// depends on <a4j:status> present in the page under test
selenium.waitForCondition(          
    "selenium.browserbot.getCurrentWindow().document.getElementById(
    "_viewRoot:status.start\").style.display == 'none'",
    "3000");
于 2012-07-06T06:39:12.287 に答える
0

私はかつてあなたと同じ状況に陥ったことがあります。さらに、実際には見つかったものの表示されなかった多くの要素がありました。JSF はまだそれらを表示できるほど高速ではありませんでした。また、何度も書いて疲れseleniumました。

だから私は座って、以下のコードを書きました。すべての要素がページに存在し、それらと対話する前に表示されるのを待ちます (またはタイムアウト後に失敗します)。その後 WebDriver に移行したため、元のコードはありませんが、次のようなものでした。

public static long WAIT = 10000;    // ten seconds

private void waitForElement(String locator) {
    long targetTime = System.currentTimeMillis() + WAIT;
    boolean found;
    do {
        found = selenium.isElementPresent(locator) && selenium.isVisible(locator);
    } while (!found && (targetTime < System.currentTimeMillis()));
    if (!found) {
        throw new SeleniumException("Element " + locator + " not found");
    }
}

public void click(String locator) {
    waitForElement(locator);
    selenium.click(locator);
}

public void type(String locator, String text) {
    waitForElement(locator);
    selenium.type(locator, text);
}

これに関してはwaitForCondition()、要素が存在するかどうかを検出するコードである必要があります。

String locator = "id=anything";
String script =
        "var retValue = true;" +
        "try {" +
        "    selenium.browserbot.findElement('" + locator + "');" +
        "} catch(e) {" +
        "    retValue = false;" +
        "}" +
        "retValue;";
selenium.waitForCondition("!!selenium.browserbot.findElement('" + locator + "')", "10000");
selenium.click(locator);

プレーンな JavaScript のみ:

var retValue = true;
try {
    selenium.browserbot.findElement('" + locator + "');
} catch(e) {
    retValue = false;
}
retValue;
于 2012-07-05T13:11:26.373 に答える