我必须编写一个测试来验证在某些情况下元素是否不可点击。我正在使用Selenium Webdriver Java库。
我知道如何利用WebDriverWait
和ExpectedConditions
类来做相反的事情。
new WebDriverWait(element, TIMEOUT).until(ExpectedConditions
.elementToBeClickable(By.cssSelector(LOCATOR)));
但我似乎找不到检查相反方法的方法。
我已经浏览了WebElement
的文档,并设法将问题分解为两个更简单的案例。
该元素已被禁用 - 在这种情况下,我可以使用WebElement#isEnabled
并将其包装在传递给WebDriverWait#until
的谓词中。
new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>(){
public boolean apply(WebDriver driver) {
return !getElement().isEnabled();
}
});
在某些情况下,该元素在点击时不会执行任何操作。我也想考虑到这一点。问题是,元素本身没有被禁用。它可以被点击,但没有注册事件(通常,有一个,但在我的情况下,它被JavaScript删除)。
第二种情况仍然困扰着我。有什么方法可以等待这样的事件取消注册吗?
答案 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.elementToBeClickable(By))