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

时间:2016-03-19 15:38:14

标签: selenium selenium-webdriver

为什么没有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)或者我错过了某些内容,这是否有意义?

2 个答案:

答案 0 :(得分:2)

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

为什么visibilityOf会返回WebElementinvisibilityOf会返回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));

虽然可以使用标准定位器代码来返回隐藏的元素,但这更加脆弱。后来的优化通常会删除类似情况下的元素。