FluentWait类型中的until(Function<? super WebDriver,V>)方法不适用于参数(boolean, ExpectedCondition<WebElement>)

问题描述 投票:0回答:4

我得到了两个条件,根据这些条件,网络驱动程序需要等待其中一个条件满足,然后才能继续执行。为此,我正在使用显式等待和

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 中

java selenium selenium-webdriver webdriver webdriverwait
4个回答
3
投票

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"))
    )
);

0
投票

jsReturnsValue()

jsReturnsValue()

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

元素定位的可见性()

visibilityOfElementLocated()

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']"))
    ));
    

参考文献

您可以在

中找到一些相关的详细讨论

尾声

我们是否有任何通用函数来检查页面是否已在 Selenium 中完全加载


0
投票

只需在pom.xml中添加selenium依赖,错误就消失了。

     <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.13.0</version>
    </dependency>

0
投票

尝试将以下依赖项添加到 maven pom.xml 中,请记住依赖项的顺序很重要: 我刚刚在 pom.xml 中添加了 selenium 依赖项,错误就消失了。

  <groupId>com.google.guava</groupId>

  <artifactId>guava</artifactId>

  <version>21.0</version>
© www.soinside.com 2019 - 2024. All rights reserved.