Нужно ли уделять меньше времени объявленному для ExplicitWait по сравнению с Implicitwait
Где-то я читал, что смешение Implicit и Explicit дает безнадежный результат. Это правда?
Источник: https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
ВНИМАНИЕ: не смешивайте неявные и явные ожидания! Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания 10 секунд и явного ожидания 15 секунд может привести к возникновению тайм-аута через 20 секунд.
В этом случае, мы должны дать меньше времени / равного неявному ожиданию???
1 ответ
Честно говоря, с хорошей реализацией инфраструктуры автоматизации тестирования вам не нужно implicitWait
, Вы должны всегда явно ждать условий.
Неявное ожидание может привести к замедлению работы ваших тестов. Automated Test Suite всегда должен работать как можно быстрее, чтобы обеспечить обратную связь с командой.
НО, если вы настаиваете на его использовании, вы можете просто создать какой-то метод / класс, в котором вы отключаете неявное ожидание, выполняете явное ожидание и восстанавливаете значение неявного ожидания.
Что-то вроде этого:
public class Wait {
private static final int IMPLICIT_WAIT_TIME = 10; //store your default implicit wait here or use .properties file
private WebDriver driver;
private int timeout = 10;
private List<Class<? extends Throwable>> exceptions = new ArrayList<>();
public Wait(WebDriver driver) {
this.driver = driver;
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //turn off implicit wait
}
public Wait setTimeout(int seconds) {
this.timeout = seconds;
return this;
}
@SafeVarargs
public final Wait ignoring(Class<? extends Throwable>... exceptions) {
this.exceptions.addAll(Arrays.asList(exceptions));
return this;
}
public void until(ExpectedCondition... expectedConditions) {
WebDriverWait wait = new WebDriverWait(driver, timeout);
if (exceptions.size() > 0) {
wait.ignoreAll(exceptions);
}
wait.until(ExpectedConditions.and(expectedConditions));
driver.manage().timeouts().implicitlyWait(IMPLICIT_WAIT_TIME, TimeUnit.SECONDS); //restore implicit wait
}
}