Подождите, пока элемент не станет кликабельным, время ожидания истекло

У меня возникли проблемы с обработкой тайм-аутов, так как, похоже, это не работает в каждой ситуации. Я определил время ожидания следующим образом:

 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, не работающем

Другие вопросы по тегам