Так. Причем если в WebDriverWait
сетнуть таймаут 2 секунды, по факту будет ждать 10 секунд и будет только один запрос к драйверу на findElement.
Да и по большому счету тебе без разницы сколько тех миллисекунд будет в implicityWait все равно в методы с ожиданиями обычно передаются секунды (а то свихнуться можно), главное чтобы implicityWait при поиске через явные ожидания был меньше чем WebDriverWait, а при поиске обычными ожиданиями его хватало чтобы точно найти элементы.
А зачем мне тогда искать неявными ожиданиями? Я лучше установлю их в 0 и при поиске буду искать с явным ожиданием, через webdriverwait. Поиск элементов на странице будет искаться через AjaxElementLocatorFactory, что по сути тот же webdriverwait.
Или могут быть какие-то случаи когда мне понадобится искать обязательно неявными ожиданиями?
Имхо, это имеет смысл, в случае, если неявные ожидания решают проблему целиком или в подавляющем большинстве случаев, для тестирования данного приложения. Если же все равно приходится прибегать к явным ожиданиям, то лучше сделать удобный механизм для их использования и отказаться от неявных ожиданий
Просто не трогать их, по умолчанию они отключены
Ответ на вопросы 2, 3, 4:
Если при инициализации элементов используется AjaxElementLocator
, то при обращении к полям класса страницы WebDriver
будет ожидать появления в DOM данного элемента в течение указанного при инициализации времени (в твоем примере 10 сек). Если находит раньше, сразу обращается к нему. Поиск происходит в момент обращения к полю класса страницы
Тогда каким образом менять установленные 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"));
}
});
но зачем ?
Всем большое спасибо за помощь! Всё стало намного понятнее. Надеюсь эта тема будет полезна не только мне, но и другим людям, столкнувшимся с вопросом по явным и неявным ожиданиям
Чуть не забыл
если используешь эту ботву
new AjaxElementLocatorFactory(webDriver, 10)
старайся не использовать Xpath .
Серьезно? А почему?
Присоединяюсь к вопросу?
Только надеюсь будете оперировать фактами, а не выдержками из javadoc который написан много лет назад неизвестно кем
Где то в исходниках по этому классу натыкался на
а не выдержками из javadoc который написан много лет назад неизвестно кем
ну я не стал проверять, ошиблись ли они рекомендовав не использовать Xpath .
почитал решил не переходить больно много локаторов с Xpath было
Есть много причин:
- Жизнь локатра Xpath очень короткая, так как многие изменения на странице сделают этот локатор невалидным
- Поиск по Xpath в ИЕ очень медленный. В хроме вы можете не заметить визуально этого, но ИЕ это видно сразу же.
- Писать правильные умные 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. При прочтении книг должно отпасть половину вопросов
Спасибо, обязательно почитаю!
Кстати говоря, мне легче разобраться с чем-то используя разные подходы - как просмотр лекций/чтение статей, так и обсуждение на форуме/лично. Так сказать со всех стороны подойти к теме Да и параллельно обычно выясняется что-то полезное