我得到了两个条件,根据这些条件,网络驱动程序需要等待其中一个条件满足,然后才能继续执行。为此,我正在使用显式等待和
ExpectedConditions.or
。
我尝试使用以下代码:
new WebDriverWait(driver.getDriver(),30).until(
ExpectedConditions.or(
ExpectedConditions.jsReturnsValue("return document.ReadyState")).equals("complete"),
ExpectedConditions.visibilityOfElementLocated(driver.findElement(By.Id("name"))
)
);
我收到错误:
The method until(Function<? super WebDriver,V>) in the type FluentWait<WebDriver> is not applicable for the arguments (boolean, ExpectedCondition<WebElement>)
请注意,我使用的是 Guava 23.0,它已经作为依赖项添加到我的 pom.xml 中
ExpectedConditions.or
接收 ExpectedCondition
作为参数。当您将 ExpectedConditions.jsReturnsValue
的结果与字符串进行比较时,您将所有表达式更改为 boolean
。
您可以创建自定义
ExpectedCondition
来扭曲它
public static ExpectedCondition<Object> customeJsReturnsValue(final String javaScript) {
return new ExpectedCondition<Object>() {
@Override
public Object apply(WebDriver driver) {
return ExpectedConditions.jsReturnsValue("return Spotfire.Busy.idle()")).equals("true")
}
}
}
用途:
new WebDriverWait(driver.getDriver(),30).until(
ExpectedConditions.or(
customeJsReturnsValue("return document.ReadyState")).equals("complete"),
ExpectedConditions.visibilityOfElementLocated(driver.findElement(By.Id("name"))
)
);
的ExpectedConditions返回一个Object,定义为:
public static ExpectedCondition<java.lang.Object> jsReturnsValue(java.lang.String javaScript)
An expectation for String value from javascript
Parameters:
javaScript - as executable js line
Returns:
true once js return string
的ExpectedConditions返回WebElement,定义为:
public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)
An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.
Parameters:
locator - used to find the element
Returns:
the WebElement once it is located and visible
这个错误信息...
The method until(Function<? super WebDriver,V>) in the type FluentWait<WebDriver> is not applicable for the arguments (boolean, ExpectedCondition<WebElement>)
...意味着
until()
不适用于多种返回类型 boolean
和 WebElement
。
在您的用例中,
jsReturnsValue()
返回一个 Object。visibilityOfElementLocated()
返回一个 WebElement。如果您的usecase与某个WebElement的可见性有关,您可以安全地忽略对'document.readyState'等于“完整”的担忧,因为这将是一种开销。您可以在Selenium IE WebDriver 仅在调试时工作中找到相关讨论。
但是,要将
until()
用于 visibilityOfElementLocated()
来表示类似数据类型的多个元素,您可以按照以下示例操作:
等待
By.xpath("//span[@id='id1']")
或By.xpath("//span[@id='id2']")
中的任何一个元素就像:
new WebDriverWait(driver, 10).until(ExpectedConditions.or(
ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='id1']")),
ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='id2']"))
));
您可以在
中找到一些相关的详细讨论只需在pom.xml中添加selenium依赖,错误就消失了。
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
</dependency>
尝试将以下依赖项添加到 maven pom.xml 中,请记住依赖项的顺序很重要: 我刚刚在 pom.xml 中添加了 selenium 依赖项,错误就消失了。
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>