我使用 selenium 来测试 JSF/RichFaces 应用程序。由于“未找到元素”错误,测试随机失败。这如Selenium:间歇性“找不到元素”问题中所述,但它仅与 jQuery ajax 调用有关。
这里的挑战是使用selenium.waitForCondition(jsExpression, timeout)
. 使用 RichFaces ajax 调用时最好的 jsExpression 是什么?
我使用 selenium 来测试 JSF/RichFaces 应用程序。由于“未找到元素”错误,测试随机失败。这如Selenium:间歇性“找不到元素”问题中所述,但它仅与 jQuery ajax 调用有关。
这里的挑战是使用selenium.waitForCondition(jsExpression, timeout)
. 使用 RichFaces ajax 调用时最好的 jsExpression 是什么?
我调查了为 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");
我曾经发现自己的处境和你一样。此外,我有很多实际找到但不可见的元素——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;