如何使用Selenium Webdriver等待不可点击的元素?

时间:2013-12-20 09:08:33

标签: java selenium-webdriver clickable

我必须编写一个测试来验证在某些情况下元素是否不可点击。我正在使用Selenium Webdriver Java库。

我知道如何利用WebDriverWaitExpectedConditions类来做相反的事情。

 new WebDriverWait(element, TIMEOUT).until(ExpectedConditions
     .elementToBeClickable(By.cssSelector(LOCATOR)));

但我似乎找不到检查相反方法的方法。

我已经浏览了WebElement的文档,并设法将问题分解为两个更简单的案例。

  1. 该元素已被禁用 - 在这种情况下,我可以使用WebElement#isEnabled并将其包装在传递给WebDriverWait#until的谓词中。

    new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver) {
            return !getElement().isEnabled();
        }
    });  
    
  2. 在某些情况下,该元素在点击时不会执行任何操作。我也想考虑到这一点。问题是,元素本身没有被禁用。它可以被点击,但没有注册事件(通常,有一个,但在我的情况下,它被JavaScript删除)。

  3. 第二种情况仍然困扰着我。有什么方法可以等待这样的事件取消注册吗?

1 个答案:

答案 0 :(得分:2)

您对案例1的解决方案似乎应该有效。

对于案例2,您可能需要在Selenium中调用页面上的JavaScript来检查元素是否分配了任何事件处理程序,我相信以下应该可以解决这个问题:

new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>() {
    public boolean apply(WebDriver driver) {
        return (JavascriptExectutor) driver.executeScript(
                    "arguments[0].onclick == null;", getElement());
    }
}); 

这应该让JS从方法onClick查询分配给传递到JavascriptExecutor的元素的当前getElement()事件处理程序,如果没有分配处理程序,则返回true。

实际上并没有对JS进行过多的测试,但它应该都很好。

更新: 在较新的selenium版本中,您应该能够使用:

ExpectedConditions.not(ExpectedConditions.elementToBeClickab‌​le(By))