2

我正在努力弄清楚 WebDriver 实例是如何传递给 Selenium 的预期条件的。

所以我有一个简单的 WebDriverWait 用于 web 元素的可见性:

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 实现了函数接口

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

它将 WebDriver 作为第一个参数。

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

谢谢

4

1 回答 1

0

当您创建时,WebDriverWait您正在传递 webdriver 实例。相同的实例将通过方法传递给apply功能接口ExpectedConditionuntil方法。

WebDriverWaitextendsFluentWait<WebDriver>它实际上实现了该until方法。当您构造WebDriverWait驱动程序时,驱动程序将作为参数传递给该参数,FluentWait并将其保存在属性中。

现在,当您调用该方法时,调用该until方法将您实际传递给构造函数。您正在构建的对象有效地接收两个输入。你传递给它以及你传递给它。WebDriverWaituntilapplydriverExpectedConditionWebElementdriverWebDriverWait

源代码并不太复杂-您可以查看它以获取更多详细信息:)

于 2019-01-21T11:33:51.613 回答