2013-12-20 75 views
1

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

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

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

但我似乎无法找到一种方法来检查相反的事情。

我已经通过了WebElement的文档,并设法将问题分解为两个更简单的情况。

  1. 元素被禁用 - 在这种情况下,我可以只使用WebElement#isEnabled并传递给谓词包裹。

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

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

回答

1

您的案例1的解决方案似乎应该工作。

对于案例2,你可能需要调用页面上的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事件处理程序,该事件处理程序分配给从getElement()方法传入JavascriptExecutor的元素,如果未分配处理程序,则返回true。

没有真正测试过这个超出JS的快速小提琴,但它应该都很好。

更新: 在新版本中的硒,你应该能够使用:

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

谢谢,我会尝试这个,当我回来的X-MAS休息后上班。明确的转换看起来有点可疑,但它可能会被删除,我会看到我能做些什么。再次感谢,节日快乐;) – toniedzwiedz

+0

我很确定这就是Selenium的JS执行程序的工作原理,但是可能是错误的 - 如果你找到一种方法来摆脱它,我很乐意听到它! 顺便说一句,这个答案你有什么好运吗? –

+0

我最终使用'JavaScriptExecutor'来检查由前端设置的特定值。谢谢。 – toniedzwiedz

相关问题