【问题标题】:The method until(Function<? super WebDriver,V>) in the type FluentWait is not applicable for the arguments (boolean, ExpectedCondition<WebElement>)FluentWait 类型中的方法 until(Function<? super WebDriver,V>) 不适用于参数 (boolean, ExpectedCondition<WebElement>)
【发布时间】:2019-09-26 10:04:27
【问题描述】:

我得到了两个条件,基于这两个条件,webdriver 需要等待其中一个条件满足才能继续执行。为此,我正在使用 Explicit wait 和 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 中

【问题讨论】:

  • 什么是objMap
  • 这是对我们的对象映射存储库的调用以获取 Xpath

标签: java selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

ExpectedConditions.or 接收ExpectedConditions 作为参数。当您将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"))
    )
);

【讨论】:

  • 我尝试了上面的代码。但是,我仍然在以下行收到错误: public static ExpectedCondition customeJsReturnsValue(final String javaScript) { return new ExpectedCondition() 错误消息: 类型不匹配:无法从 new ExpectedCondition(){} 转换为 String
  • 另外,我们已经重写了 ExpectedCondition 方法 -> 我们是否必须重写 ExpectedConditions.or 方法来返回一个布尔值??
【解决方案2】:

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()

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() 不适用于多种返回类型booleanWebElement

在您的用例中,

  • jsReturnsValue() 返回一个对象
  • visibilityOfElementLocated() 返回一个 WebElement

解决方案

如果你的用例是关于某个WebElement的可见性,你可以放心地忽略'document.readyState'等于“完成” 因为这将是一个开销。您可以在Selenium IE WebDriver only works while debugging找到相关讨论。

但是,要将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']"))
    ));
    

参考文献

您可以在

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

结尾

Do we have any generic function to check if page has completely loaded in Selenium

【讨论】:

  • jsReturnsValue() 将 JavaScript 查询中的值返回为 Object,而不是 boolean
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多