Selenium WebElement.Click () ожидает загрузки следующей страницы? - PullRequest
1 голос
/ 24 июня 2019

Я говорю Selenium подождать, пока он не увидит элемент - Selenium видит его Я говорю Selenium нажать на этот элемент, это кнопка для ссылки на новую страницу - Selenium нажмите на нее.

Проблемазаключается в том, что после нажатия кнопки Selenium будет ждать полной загрузки следующей страницы (иногда страница загружается за секунду или ждет целую вечность, я думаю, что это проблема с Zen Desk Live Chat на этой странице).

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

Iпопытался изменить время ожидания с помощью

driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

, однако это не помогает.Я также пытался

wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));

Однако с этой же проблемой.

Ниже приведен код, который я сейчас использую.

try {
    wait.until(ExpectedConditions.visibilityOfElementLocated(
    By.xpath(element)));
    WebElement we = driver.findElement(By.xpath(element));
    we.click();
    System.out.println("Clicked: " + element);
}catch (Exception e){
    System.out.println(e.getMessage()); 
}   

Я ожидаю, что когда-то элементбыло нажато, что Selenium просто продолжает без заботы, загружена ли следующая страница или нет.

Однако, что происходит, когда загружается 2-я страница, иногда страница застревает, ожидая виджета-посредника.zopim.com "и Selenium не будет проходить дальше строки click (), пока не истечет время ожидания WebDriverWait (60 секунд). По истечении 60 секунд я вижу эту ошибку в выводе консоли:

[1561374309.111][SEVERE]: Timed out receiving message from renderer: 60.000
[1561374309.112][SEVERE]: Timed out receiving message from renderer: -0.002

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

Заранее спасибо.

1 Ответ

1 голос
/ 24 июня 2019

Поведение Selenium (или, точнее, WebDriver) при нажатии регулируется Спецификацией W3C WebDriver .В этом документе полный алгоритм определен для того, что происходит, когда запрашивается щелчок элемента.В общем случае, если щелчок переместится на новую страницу, драйвер будет ждать, пока эта новая страница будет «загружена» (преднамеренно запугивать кавычки) в соответствии со стратегией загрузки страницы до загрузки страницы .timeout .

По умолчанию для стратегии загрузки страницы установлено значение «нормальный» или ожидание завершения документа readyState.Если вы установите «none» в возможностях, запрошенных во время создания драйвера, драйвер вообще не будет ждать.Выбор этого маршрута будет означать, что вам придется обрабатывать всю синхронизацию загружаемых страниц.Обратите внимание, что существует стратегия загрузки третьей страницы, «нетерпеливая», но на момент написания этой статьи не все реализации WebDriver (в первую очередь chromedriver) ее поддерживают.

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

...