等待在Selenium 2中加载Javascript文件

时间:2011-07-27 20:45:09

标签: javascript selenium selenium-webdriver

我正在使用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文件加载并执行?

3 个答案:

答案 0 :(得分:2)

查看WebDriverWait

检查功能是否存在

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);
}