Подождите, пока элемент не станет кликабельным, время ожидания истекло
У меня возникли проблемы с обработкой тайм-аутов, так как, похоже, это не работает в каждой ситуации. Я определил время ожидания следующим образом:
wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(60))
.pollingEvery(Duration.ofSeconds(1))
.ignoring(NoSuchElementException.class);
Теперь, когда я хочу дождаться появления элемента на странице, я использую этот фрагмент кода:
wait.until(ExpectedConditions.presenceOfElementLocated(locator));
Это работает в большинстве ситуаций (ожидание элемента и тайм-аут через 60 секунд), но в последнее время у нас возникли проблемы с некоторыми страницами, которые зависают при загрузке (есть сообщение, ожидающее... в левом нижнем углу страница). Когда это происходит, я понимаю, что этот кусок кода не работает должным образом. Время ожидания истекает не через 60 секунд, а через 10 минут.
Изменить: На самом деле, пытаясь исследовать мою проблему немного больше, я понял, что это действительно из другой строки кода, который также содержит ожидание:
wait.until(ExpectedConditions.elementToBeClickable(locator));
По сути, я нажимаю на ссылку, которая перенаправляет на другую страницу, жду, когда появится кнопка, жду, когда она будет нажата, и нажимаю на кнопку. Таким образом, он обнаруживает, что кнопка присутствует, но затем ждет, когда она станет активной, и не истекает через 60 секунд.
Поэтому, когда я определил свой драйвер, я добавил следующую строку:
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
В консоли я вижу следующую строку: Превышено время получения сообщения от средства визуализации: 60000
Но как мне поймать это исключение? Я пытался окружить свое ожидание попыткой / уловом, но это не работает.
try {
wait.until(ExpectedConditions.elementToBeClickable(locator));
} catch (Exception e) {
logger.info("TEST");
throw new TimeoutException("element " + locator.toString() + " not found on the page");
}
Как я могу это сделать? Благодарю.
1 ответ
Вы должны позаботиться о нескольких вещах следующим образом:
- Ожидание, пока элемент присутствует на странице, в идеале не сильно поможет, если ваш сценарий использования либо для получения каких-либо атрибутов, например, classname, innerHTML и т. Д. Элемента, либо для вызова
click()
на элементе. - Вместо этого, в зависимости от вашего варианта использования, вам нужно использовать либо visibilityOfElementLocated(), либо elementToBeClickable ().
- Вы можете найти пару подробных обсуждений в:
- Причина строки кода
wait.until(ExpectedConditions.presenceOfElementLocated(locator))
не истекает через 60 секунд, но через 10 минут может быть связано с тем, что наряду с WebDriverWait вы также настроили неявное ожидание и в соответствии с документацией смешивание неявного ожидания и явного ожидания может привести к непредсказуемому времени ожидания Для настройки pageLoadTimeout вы можете использовать следующий блок кода:
Блок кода:
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().timeouts().pageLoadTimeout(2, TimeUnit.SECONDS); try{ driver.get("https://www.booking.com/hotel/in/the-taj-mahal-palace-tower.html?label=gen173nr-1FCAEoggJCAlhYSDNiBW5vcmVmaGyIAQGYATG4AQbIAQzYAQHoAQH4AQKSAgF5qAID;sid=338ad58d8e83c71e6aa78c67a2996616;dest_id=-2092174;dest_type=city;dist=0;group_adults=2;hip_dst=1;hpos=1;room1=A%2CA;sb_price_type=total;srfid=ccd41231d2f37b82d695970f081412152a59586aX1;srpvid=c71751e539ea01ce;type=total;ucfs=1&#hotelTmpl"); }catch(WebDriverException e){ System.out.println("WebDriverException occured"); } driver.quit();
Консольный вывод:
INFO: Detected dialect: W3C [1563377008.449][SEVERE]: Timed out receiving message from renderer: 1.999 [1563377008.450][SEVERE]: Timed out receiving message from renderer: -0.001 [1563377008.461][SEVERE]: Timed out receiving message from renderer: -0.012 [1563377010.466][SEVERE]: Timed out receiving message from renderer: 1.998 [1563377010.467][SEVERE]: Timed out receiving message from renderer: -0.001 [1563377010.476][SEVERE]: Timed out receiving message from renderer: -0.010 WebDriverException occured
Вы можете найти соответствующее подробное обсуждение в pageLoadTimeout в Selenium, не работающем