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

How does FluentWait in Selenium implements the until() method

selenium 文档中 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() 方法的语法和用法。我想知道语法是如何实现的。

是的,我知道泛型,我们用它来了解编译时的错误,这样我们就可以在运行时避免 ClassCastException。另外,我知道功能接口,我们用它来实现行为参数化。

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

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

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

java.util.function

java.util.function 包包括 函数接口 ,它为 lambda 表达式 和方法引用提供目标类型。

几个例子是:

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

Class FluentWait

在页面上搜索元素时public class FluentWait<T> class extends java.lang.Object and implements Wait<T> which implies it is an implementation of the Wait interface that may have its timeout and polling interval configured on the fly. Each FluentWait instance defines the maximum amount of time to wait for a condition, as well as the frequency with which to check the condition. Furthermore, the user may configure the wait to ignore specific types of exceptions whilst waiting, such as 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.

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

  • 函数returns既不为空也不为假
  • 函数抛出未忽略的异常
  • 超时到期
  • 当前线程被中断

接口预期条件

public interface ExpectedCondition<T> 接口扩展了 com.google.common.base.Function<WebDriver,T>,它模拟了一个预期评估为既非 null 也非 false 的条件。示例包括确定网页是否已加载或元素是否可见。

Note that it is expected that ExpectedConditions are idempotent. They will be called in a loop by the WebDriverWait and any modification of the state of the application under test may have unexpected side-effects.


Class 预期条件

通常在 webdriver 测试中有用的 ExpectedConditions Class is the canned ExpectedConditions。

一些用法示例:

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