Selenium中的FluentWait如何实现till()方法

时间:2019-02-06 13:53:23

标签: java selenium selenium-webdriver webdriverwait fluentwait

硒文档中until()方法的语法如下:

public <V> V until(java.util.function.Function<? super T,V> isTrue)

用法相同:

WebDriver wait = new WebDriver(driver, 20);
WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("lgn-btn")));

我与until()方法的语法和用法无关。我想知道语法的实现方式。

是的,我了解Generics,我们用它来了解编译时的错误,以便可以在运行时避免ClassCastException。另外,我了解功能接口,我们可以使用该功能接口来实现行为参数化。

我没有得到的是java.util.function.Function<? super T,V> isTrue)ExpectedConditions.elementToBeClickable(By.id("id))之间的等效性。

java.util.function.Function<? super T,V> isTrue表示什么意思?

1 个答案:

答案 0 :(得分:2)

问题中提到了四个不同的主题,您可以在下面找到详细信息:

java.util.function

java.util.function软件包包括 Functional接口,这些接口为 lambda表达式和方法引用提供了目标类型。

一些例子是:

  • BiConsumer<T,U>:表示一个接受两个输入参数且不返回结果的操作。
  • BiFunction<T,U,R>:表示一个接受两个参数并产生结果的函数。
  • BinaryOperator<T>:表示对两个相同类型的操作数的运算,并产生与该操作数相同类型的结果。
  • BiPredicate<T,U>:表示两个参数的谓词(布尔值函数)。
  • Consumer<T>:表示一个接受单个输入参数且不返回结果的操作。
  • Function<T,R>:表示一个接受一个参数并产生结果的函数。

FluentWait类

public class FluentWait<T>类扩展了java.lang.Object并实现了Wait<T>,这意味着它是Wait接口的实现,可以动态配置其超时和轮询间隔。每个FluentWait实例都定义了等待条件的最长时间,以及检查条件的频率。此外,用户可以配置等待以在等待时忽略特定类型的异常,例如在搜索页面上的元素时使用NoSuchElementExceptions

修饰符之一是:

Modifier and Type       Method and Description
-----------------       ----------------------
<V> V                   until(java.util.function.Function<? super T,V> isTrue)

Specified by:
    until in interface Wait<T>
Type Parameters:
    V - The function's expected return type.
Parameters:
    isTrue - the parameter to pass to the ExpectedCondition
Returns:
    The function's return value if the function returned something different from null or false before the timeout expired.
Throws:
    TimeoutException - If the timeout expires.

此实现重复将此实例的输入值应用于给定函数,直到发生以下情况之一:

  • 该函数既不返回null也不返回false
  • 该函数引发不可忽略的异常
  • 超时到期
  • 当前线程被中断

Interface ExpectedCondition

public interface ExpectedCondition<T>接口扩展了com.google.common.base.Function<WebDriver,T>,该接口对期望求值的条件进行建模,该条件不能为null或false。示例包括确定网页是否已加载或元素可见。

  

请注意,ExpectedConditions应该是幂等的。 WebDriverWait将在循环中调用它们,对被测应用程序状态的任何修改都可能会产生意想不到的副作用。


类别期望条件

ExpectedConditions类是罐装ExpectedCondition,通常在网络驱动程序测试中很有用。

一些用法示例:

  • elementToBeClickable()

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("element_css")));
    
  • visibilityOfElementLocated()

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("element_css")));
    
  • frameToBeAvailableAndSwitchToIt()

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("element_css")));
    
  • visibilityOfAllElementsLocatedBy()

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("element_css")));
    
  • attributeContains()

    new WebDriverWait(driver, 20).until(ExpectedConditions.attributeContains(driver.findElement(my_element), "src", "https"));