Как мы можем передать ExpectedConditions в качестве параметра для wait.until в Selenium Java?

#java #selenium #webdriver

Вопрос:

Я нахожу проблемы с передачей в ExpectedConditions качестве параметра в методе to wait.until() . wait.until() Ожидает, что функция будет передана. Я относительно новичок в Java и был бы признателен за помощь.

Оскорбительный код:

 public void waitUntil(WebElement element, long seconds, String errorMessage, ExpectedConditions expectedConditions) {
 if (seconds == 0 || errorMessage.isEmpty()) throw new IllegalArgumentException();
 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(seconds));
 wait.withMessage(errorMessage);
 // this throws a compiler error.
 wait.until(expectedConditions);
}
 

wait.until() ожидает, что в него будет передана функция, которая выглядит ExpectedConditions.urlToBe("http://www.test.com") следующим образом.

Я пытаюсь создать метод, который можно было бы вызывать там, где можно было бы передать любое ожидаемое условие, например urlToBe, alertIsPresent и т.д.

Спасибо.

Комментарии:

1. Что говорит ошибка компилятора?

2. Required type: Function <? super org.openqa.selenium.WebDriver, V> Provided: ExpectedConditions reason: no instance(s) of type variable(s) V exist so that ExpectedConditions conforms to Function<? super WebDriver, V>

3. Что, если вы измените 4-й параметр на: ExpectedCondition<?> expectedConditions ?

4. Какой тип должен быть <?> ?

5. Просто оставьте это как ? . Это называется подстановочными знаками: docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Ответ №1:

 (WebElement element, long seconds, String errorMessage, ExpectedConditions expectedConditions)
 

Во-первых, тип expectedConditions неправильный.

Вы объявили его как ExpectedConditions , который представляет класс util .

Вы на самом деле хотите ExpectedCondition , тип, который возвращает все методы из ExpectedConditions .

Но просто изменить его на ExpectedCondition недостаточно. Потому что вы получите предупреждение о Raw type , потому ExpectedCondition что это универсальный класс.

Итак, вам нужно объявить параметр типа class , и поскольку вы хотите включить все, вы используете подстановочный знак ?

В финале параметр должен быть ExpectedCondition<?> expectedConditions

Комментарии:

1. Сработало отлично, еще раз спасибо.

Ответ №2:

У WebDriverWait есть конструктор, который перегружен, чтобы занять много времени в качестве второго аргумента. Вам не нужно использовать Duration.ofSeconds(seconds)

Также,

 The method until(Function<? super WebDriver,V>) in the type FluentWait<WebDriver> is not applicable for the arguments (ExpectedConditions)
 

Исправить :

Вы должны использовать ExpectedConditions с одним соединением, подобным

  1. elementToBeClickable
  2. visibilityOfElement

и так далее..

Код :

 public void waitUntil(WebElement element, long seconds, String errorMessage, ExpectedConditions expectedConditions) {
     if (seconds == 0 || errorMessage.isEmpty()) throw new IllegalArgumentException();
     WebDriverWait wait = new WebDriverWait(driver, seconds);
     wait.withMessage(errorMessage);
     WebElement elemenet  = wait.until(expectedConditions.elementToBeClickable(By.xpath("//some xpath")));
    }
 

Внутренний перегруженный метод :

   */
  public WebDriverWait(WebDriver driver, long timeOutInSeconds) {
    this(
        driver,
        java.time.Clock.systemDefaultZone(),
        Sleeper.SYSTEM_SLEEPER,
        timeOutInSeconds,
        DEFAULT_SLEEP_TIMEOUT);
  }
 

Комментарии:

1. Дело в том, что использование long or int only теперь устарело, в нем есть аннотация @Deprecated . Авторы Selenium хотят, чтобы мы использовали в Duration.ofSeconds() качестве аргумента.

2. @SilentKay: На какой версии вы работаете?

3. Selenium 4.0.0. Просто чтобы добавить -> я знаю, что вы можете использовать ExpectedConditions.urlToBe(url) и просто передать url в него. Но это означает, что мне придется создать отдельный метод для каждого условия. В то время как я бы предпочел, чтобы он был общим, поэтому я могу передать объект ExpectedCondition в метод с любым условием, которое вызывающий считает нужным.

Ответ №3:

Я не вижу ничего неправильного в вашем блоке кода. Однако вам необходимо обеспечить несколько следующих вещей:

  • При этом, используя ExpectedConditions, вы должны выполнить следующий импорт:
     import org.openqa.selenium.support.ui.ExpectedConditions;
     
  • Поскольку вы используете Selenium 4.0.0, вам необходимо использовать guava-31.0.1-jre.jar

Комментарии:

1. Да, я удалил его из соображений краткости. Но оно уже есть.

2. Перепроверьте версию с гуавой.

3. Я не уверен, какое отношение «гуава» имеет к передаче статического метода в вызываемый метод?

4. Кажется, вы получили работающий и общепринятый ответ. Так что я пропущу объяснение. Удачи вам