我正在使用Selenium 2来测试我网站的用户界面。我需要检查单击按钮是否会产生一些结果。在每10次左右的测试运行中,Selenium甚至没有点击按钮。没有打印出错误。 JS没有任何问题,因为我可以在Selenium无法点击它之后手动点击按钮。
最简单的是,我的HTML看起来像这样:
<html>
<head></head>
<body>
<a id="button" onclick="clickIt(); return false;"></a>
<script type="text/javascript" src="javascript.js"></script>
</body>
</html>
JS位于正文的末尾,因此缓慢加载的JS文件不会阻止整个页面。 JS文件定义了clickIt函数。
function clickIt() {
$('button').addClassName('beenClicked');
}
爪哇:
WebElement button = driver.findElement(By.xpath("//a[@id='button']"));
button.click();
我的假设为什么它在10次中失败的原因是Selenium在点击按钮之前没有等待加载JS文件。如果是这样,我该如何等待这个JS文件加载并执行?
答案 0 :(得分:2)
检查功能是否存在
JavascriptExecutor js = (JavascriptExecutor) driver;
Boolean isLoaded = (Boolean)js.executeScript("return typeof window.yourFunctionName === 'function'", null);
答案 1 :(得分:0)
JavascriptExecutor js = (JavascriptExecutor) driver;
Boolean isLoaded = (Boolean)js.executeScript(
"return typeof window.yourFunctionName === 'function'", null);
答案 2 :(得分:0)
public boolean waitForJStoLoad(WebDriver driver) {
WebDriverWait wait = new WebDriverWait(driver, 30);
// wait for jQuery to load
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
return ((Long)((JavascriptExecutor) driver)
.executeScript("return jQuery.active") == 0);
}
catch (Exception e) {
return true;
}
}
};
// wait for Javascript to load
ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor) driver)
.executeScript("return document.readyState")
.toString().equals("complete");
}
};
return wait.until(jQueryLoad) && wait.until(jsLoad);
}