#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 с одним соединением, подобным
- elementToBeClickable
- 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
orint
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. Кажется, вы получили работающий и общепринятый ответ. Так что я пропущу объяснение. Удачи вам