Я не хочу менять неявное ожидание WebDriver, потому что эта проблема возникает только при конкретном клике.

Обратите внимание: после оператора click код не выполняется. Это не обычная ошибка ожидания. Я попытался добавить простой «print (« test »)» после driver.find_element_by_xpath (xpath) .click (), но выполнение завершается с ошибкой при самом щелчке. Печать не выполняется. Время ожидания веб-драйвера при ожидании загрузки страницы (вверх 5 минут).

Мне нужно отправить конкретную форму. Эта форма занимает много времени после нажатия на кнопку отправки. Загрузка следующей страницы может занять до 5 минут.

Тайм-аут WebDriver после нажатия этой кнопки с исключением «TimeOut».

Вот трассировка стека:

Traceback (последний вызов был последним):

Файл "C: /Users/user.domain/PycharmProjects/server_config/server_config.py", строка 704, в # Применить файл сброса "C: /Users/user.domain/PycharmProjects/server_config/server_config.py", строка 222 , в server_reset logger.info («Сброс настроек сервера») Файл «C: \ Program Files (x86) \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py», строка 80, в щелкните файл self._execute (Command.CLICK_ELEMENT) "C: \ Program Files (x86) \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py", строка 501, в _execute, верните self._parent .execute (команда, params) Файл "C: \ Program Files (x86) \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py", строка 308, в файле execute self.error_handler.check_response (выполнить. ответ) Файл "C: \ Program Files (x86) \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py", строка 194, в файле check_response on_class (сообщение, экран, трассировка стека) selenium.common.exceptions.TimeoutException: сообщение: тайм-аут (информация о сеансе: chrome = 75.0.3770.100) (информация о драйвере: chromedriver = 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e {головки / 37s) # 29}), платформа = Windows NT 10.0.17763 x86_64)

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

Как я могу справиться с этим конкретным кликом? Что является более элегантным способом обработки запроса ожидания вместо изменения неявных значений ожидания до и после этого нажатия?

0
Mugen 10 Июл 2019 в 09:23

3 ответа

Лучший ответ

implicit wait не влияет на загрузку страницы, он имеет отношение только к поиску веб-элементов с помощью функций find_element().

Вы можете использовать driver.set_page_load_timeout(timeout) для увеличения времени, которое драйвер ожидает загрузки страницы (хотя в соответствии с спецификация w3c по умолчанию уже 5 минут).

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

try:
    driver.find_element_by_xpath(xpath).click()
except TimeoutException:
    print('Failed to load next page')
    # do something
    # or rethrow the exception with 'raise'
1
Guy 10 Июл 2019 в 08:05

Я имел в виду что-то вроде:

   WebElement.click();
  int counter = 0;
  do
    {

      switch (elementStatus)
      {
        case "Element is not present":

          Thread.sleep(100000);
          counter++;
          if (counter == 4)
            throw new AutomationException("Form submission is taking time. Please check manually.");
          break;

        case "Element is present":
          counter = 4;
          break;

      }

    } while (counter < 4);
0
Neha 10 Июл 2019 в 06:42

Проверьте наличие html-элемента, который существует в случае как успешной, так и недопустимой отправки формы, если он существует, дождитесь изменения этого конкретного состояния / значения html-элемента.

Например, приведенный ниже код находится в Java.

WebDriverWait wait = new WebDriverWait(driver, 10);
element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(<message>)));
String result = null;

if(element.isDisplayed() && element.getText().contains("Successfully"))
     result = driver.findElement(By.id(<name>)).getText();
else
    result = element.getText();
0
Veeksha A V 10 Июл 2019 в 06:51