Selenium预期条件:Webdriver实例从哪里来?

3

我很难理解WebDriver实例是如何传递到Selenium的预期条件中的。

所以我有一个简单的WebDriverWait,用于等待网页元素的可见性:

new WebDriverWait(webDriver, Configuration.WEB_DRIVER_WAIT_TIMEOUT)
                .until(ExpectedConditions.visibilityOf(element));

这里的webDriver实例是之前初始化的chromedriver。
我的问题是:在visibilityOf()方法中:
public static ExpectedCondition<WebElement> visibilityOf(final WebElement element) {
    return new ExpectedCondition<WebElement>() {
      @Override
      public WebElement apply(WebDriver driver) {
        return elementIfVisible(element);
      }

      @Override
      public String toString() {
        return "visibility of " + element;
      }
    };
  }

在上面,WebDriver的哪个实例会被传递给apply()方法,以及如何传递呢? 我理解ExpectedCondition实现了Function接口。

public interface ExpectedCondition<T> extends Function<WebDriver, T> {}

第一个参数是WebDriver。

WebDriver实例如何传递给visibilityOf()的ExpectedCondition?

谢谢。

1个回答

1
当您创建WebDriverWait时,需要传递webdriver实例。同一个实例将被传递给ExpectedCondition的函数接口的apply方法,并由until方法调用。 WebDriverWait扩展了FluentWait<WebDriver>,实际上实现了until方法。在构造WebDriverWait时,驱动程序作为参数传递给FluentWait,并保存在属性中。
现在,当您在WebDriverWait上调用until方法时,until方法调用apply方法,将您实际传递给构造函数的driver传递给它。您正在构建的ExpectedCondition对象实际上接收到两个输入:您传递给它的WebElement以及您传递给WebDriverWaitdriver
源代码并不太复杂-您可以查看它以获取更精细的细节 :)

在WebDriverWait的javadocs中,它说:@param driver WebDriver实例要传递给预期条件。您能否解释一下如何通过until方法传递它?谢谢。 - Anastasios
1
谢谢。我错过了在WebDriverWait的构造函数中调用父方法(FluentWait)的重点。谢谢。 - Anastasios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接