为什么没有返回元素可见性布尔值的 ExpectConditions 方法



为什么没有返回布尔值以获得元素可见性的 ExpectConditions 方法? 例如,有一个布尔的"不可见和过时"方法,但没有"可见性"和"存在"? 为什么? 我们是否应该使用 not 方法?

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;

ExpectConditions 类中有一个直接的"可见性"方法(返回布尔值;而不仅仅是 WebElement)还是我错过了什么?

我假设ExpectedConditions开发人员想要限制 API 的大小,因此没有为每种类型创建两个visibilityOf方法,一个返回 boolean 和一个返回 WebElement ,他们只创建了一个返回 WebElement 或抛出TimeoutException的方法。

为什么visibilityOf退货WebElementinvisibilityOf退货boolean

visibilityOf中,您可以使用正在等待的元素或忽略返回值。但是当你等待WebElement消失时,你无法用它做任何事情,所以为什么要归还它呢?更不用说这种情况,期望元素在 DOM 中不可见或不存在。

顺便说一下,ExpectedConditions.visibilityOfAllElementsLocatedBy要么返回大小大于 0 的 List,要么抛出 TimeoutException .检查foundElements.size() > 0不起作用。

为什么没有可见性的布尔测试而不是不可见性?

我的猜测是,这样做是为了鼓励更有效的编码,并利用所有Selenium定位器已经工作的方式。

所有硒定位器都通过返回满足页面上给定条件的元素列表来工作。

隐形不能依赖标准定位器代码,因为成功可能来自根本不存在的元素。 我们不能保证能够基于此返回 Web 元素,而是被迫提供布尔结果。

状态、可见性、启用等都可以返回找到的元素,并通过为用户提供元素而无需进一步处理来减少多次回调的开销。 这对于快速代码来说是一件好事。我相信开发人员有意针对这种情况进行优化,并且没有提供布尔测试来鼓励使用它。

WebElement found = new WebDriverWait(driver, timeout)
  .until(ExpectedConditions.visibilityOfElementLocated((By)loc));

虽然可以使用标准定位器代码返回隐藏的元素,但这要脆弱得多。 在这种情况下,以后的优化通常会删除元素。

最新更新