为什么没有ExpectedConditions方法返回元素可见性的布尔值?例如,有一个布尔“AND staleness of invisibility of”方法但不是“visibility”和“present”?为什么?我们是否希望使用非方法?
boolean invisible = wait.
until( ExpectedConditions.invisibilityOfElementLocated( locator ) );
boolean unpresent = wait.
until( ExpectedConditions.stalenessOf( locator );
我能想到的只有2种解决方法:
boolean found = wait.
until( ExpectedConditions.not.invisibilityOfElementLocated( locator ) );
这个是我首选的解决方法(因为在这种情况下,我的FluentWait不需要忽略ElementNotFoundException):
boolean found = false;
List<WebElement> foundElements = wait
.until( ExpectedConditions.visibilityOfAllElementsLocatedBy( locator ) );
found = foundElements.size() > 0;
ExpectedConditions类中是否存在直接“可见性”方法(返回布尔;不仅仅是WebElement)或者我错过了某些内容,这是否有意义?
答案 0 :(得分:2)
我假设ExpectedConditions
开发人员想要限制API的大小,因此不是为每种类型创建两个visibilityOf
方法,而是返回boolean
的方法和返回WebElement
的方法。 {1}},他们只创建了一个返回WebElement
或抛出TimeoutException
的内容。
为什么visibilityOf
会返回WebElement
而invisibilityOf
会返回boolean
?
在visibilityOf
中,您可以使用您正在等待的元素,或忽略返回的值。但是当你等待WebElement
消失时,你无法对它做任何事情,那么为什么要回来呢?更不用说这个条件期望元素不可见或不存在于DOM 中。
顺便说一句,ExpectedConditions.visibilityOfAllElementsLocatedBy
将返回大小超过0的List
或抛出TimeoutException
。支票foundElements.size() > 0
不起作用。
答案 1 :(得分:0)
为什么没有可见性的布尔测试而不是隐身?
我的猜测是,这样做是为了鼓励更有效的编码并利用所有Selenium定位器的工作方式。
所有selenium定位器的工作方式是返回满足页面上给定条件的元素列表。
隐形不能依赖于标准定位器代码,因为成功可能来自根本不存在的元素。我们无法保证能够基于此返回Web元素,而是被迫提供布尔结果。
存在,可见性,启用等都可以返回找到的元素,并通过为用户提供元素而无需进一步处理来减少多个回调的开销。这对快速代码来说是件好事。我相信开发人员故意针对这种情况进行优化,并没有提供布尔测试来鼓励其使用。
WebElement found = new WebDriverWait(driver, timeout)
.until(ExpectedConditions.visibilityOfElementLocated((By)loc));
虽然可以使用标准定位器代码来返回隐藏的元素,但这更加脆弱。后来的优化通常会删除类似情况下的元素。