Явные и неявные ожидания - помогите разобраться

Так. Причем если в WebDriverWait сетнуть таймаут 2 секунды, по факту будет ждать 10 секунд и будет только один запрос к драйверу на findElement.

1 лайк

Да и по большому счету тебе без разницы сколько тех миллисекунд будет в implicityWait все равно в методы с ожиданиями обычно передаются секунды (а то свихнуться можно), главное чтобы implicityWait при поиске через явные ожидания был меньше чем WebDriverWait, а при поиске обычными ожиданиями его хватало чтобы точно найти элементы.

А зачем мне тогда искать неявными ожиданиями? Я лучше установлю их в 0 и при поиске буду искать с явным ожиданием, через webdriverwait. Поиск элементов на странице будет искаться через AjaxElementLocatorFactory, что по сути тот же webdriverwait.

Или могут быть какие-то случаи когда мне понадобится искать обязательно неявными ожиданиями?

Имхо, это имеет смысл, в случае, если неявные ожидания решают проблему целиком или в подавляющем большинстве случаев, для тестирования данного приложения. Если же все равно приходится прибегать к явным ожиданиям, то лучше сделать удобный механизм для их использования и отказаться от неявных ожиданий

1 лайк

Просто не трогать их, по умолчанию они отключены

Ответ на вопросы 2, 3, 4:
Если при инициализации элементов используется AjaxElementLocator, то при обращении к полям класса страницы WebDriver будет ожидать появления в DOM данного элемента в течение указанного при инициализации времени (в твоем примере 10 сек). Если находит раньше, сразу обращается к нему. Поиск происходит в момент обращения к полю класса страницы

2 лайка
Тогда каким образом менять установленные 500 мс на дефолтные? confused
Ответить в новой связанной теме

Можно . Есть еще такое ожидание Fluent

Waiting 30 seconds for an element to be present on the page, checking

   // for its presence once every 5 seconds.
   Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(30, SECONDS)
       .pollingEvery(5, SECONDS)
       .ignoring(NoSuchElementException.class);

   WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
     public WebElement apply(WebDriver driver) {
       return driver.findElement(By.id("foo"));
     }
   });

но зачем ? :grinning:

1 лайк

Всем большое спасибо за помощь! Всё стало намного понятнее. Надеюсь эта тема будет полезна не только мне, но и другим людям, столкнувшимся с вопросом по явным и неявным ожиданиям :blush:

Чуть не забыл
если используешь эту ботву

new AjaxElementLocatorFactory(webDriver, 10)

старайся не использовать Xpath .

Серьезно? А почему?

1 лайк

Присоединяюсь к вопросу?
Только надеюсь будете оперировать фактами, а не выдержками из javadoc который написан много лет назад неизвестно кем :slight_smile:

Где то в исходниках по этому классу натыкался на

а не выдержками из javadoc который написан много лет назад неизвестно кем 

ну я не стал проверять, ошиблись ли они рекомендовав не использовать Xpath .
почитал решил не переходить больно много локаторов с Xpath было

Есть много причин:

  1. Жизнь локатра Xpath очень короткая, так как многие изменения на странице сделают этот локатор невалидным
  2. Поиск по Xpath в ИЕ очень медленный. В хроме вы можете не заметить визуально этого, но ИЕ это видно сразу же.
  3. Писать правильные умные Xpath, которые не будут ломаться при изменениях, не так легко как кажется - CSS локаторы в разы проще

Я имел ввиду конкретно для реализации PageFactory.initElements(new AjaxElementLocatorFactory(webDriver, 10), page);

1,3 Каким боком к вашим высказываниям AjaxElementLocatorFactory?
2 Это уже не актуально в течении нескольких лет. Но то ли обучающие курсы лагают, то ли комьюнити - выводя этот “факт” на уровень “городских легенд”.

И снова прошу помощи по теме явных ожиданий!

Подскажите как быть в такой ситуации - пользователь вводит логин и пароль и может оказаться на одной из двух страниц. Вопрос - как правильно сделать проверку на какой странице мы сейчас находимся?

Имплицитные ожидания установлены в 0, используется WebDriverWait и инициализация страниц сделана через AjaxElementLocatorFactory.

Если на странице сделать метод

@FindBy(id = "pushOutMessage")
private WebElement messageText;

public boolean pageIsPresent() {
	return messageText.isDisplayed();
}

То получается неправильно - если действительно страница эта, то ок, вернет true, а если - нет, то будет ожидание в течении N секунд и выброс NoSuchElementException (можно сделать обертку try catch, но проблема именно в долгом ожидании).

Если в таких случаях проверять неявным ожиданием, то тоже неправильно - ведь ожидания в них установлено 0, и получится что если этот элемент не успеет загрузиться будет возвращен false, хотя страница - та.

Вот мне и не понятно теперь - как сделать правильно? Так чтобы можно было быстро определить - на нужной мы странице или нет?

Надеюсь все понятно объяснил. Заранее спасибо за советы!

Это офтоп. Заводи отдельную тему

Создал новую тему по вопросу:

лучший способ открыть книжку по selenium и разобраться с вопросом как что работает.
К сожалению на русском языке нет ничего зато на английском документации по selenium прям изобилие вот вам одна из неплохих книг по selenium Unmesh Gundecha - Selenium Testing Tools Cookbook [ноябрь 2012, PDF/EPUB, ENG] :: RuTracker.org
ну и вообще packt publushing очень хорошее издание на оффсайте есть еще 3 книги про то как работает selenium. При прочтении книг должно отпасть половину вопросов

1 лайк

Спасибо, обязательно почитаю!
Кстати говоря, мне легче разобраться с чем-то используя разные подходы - как просмотр лекций/чтение статей, так и обсуждение на форуме/лично. Так сказать со всех стороны подойти к теме :smile: Да и параллельно обычно выясняется что-то полезное