Ожидания внутри метода click. Как работает метод click?

click
webdriver
Теги: #<Tag:0x00007f7b65697ea8> #<Tag:0x00007f7b65697d68>

(Дмитрий Кравчук) #1

Дано:

Инициализация вебдрайвера:

System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();

Код:

submitButton.click();
nextStep();

Немного о веб страничке:

На страничке имеется элемент div class =“waitblock hidden”. По нажатию кнопки этот элемент становится видимым и перекрывает другие. Ajax или JavaScript отправляет запрос на сервер. Через некоторое время приходит ответ. Waitblock снова становится невидимым.

Контекст:

Согласно сценарию, в некоторый момент времени нужно нажать кнопку на страничке, а потом выполнить следующие операции.
Я ожидал что после нажатия, будет выполняться следующая операция, связанная с waitblock’ом.
Но происходит следующее:

  1. Вебдрайвер кликает по кнопке.(И я вижу что кнопка нажалась) - в этот момент выполняется команда click();
  2. Появился waitblock - и в этот момент выполняется команда click();
  3. waitblock пропал - и только теперь выполняется nextStep();

Вопрос:
Я в курсе ожидания элемента внутри метода click() который задает таймаут до NoSuchElementException. Но задержка выполнения происходит внутри метода click() уже после выполнения нажатия на вебэлемент. Так как же в итоге работает метод click(), и можно ли настроить или убрать задержку после эмуляции нажатия?

Спасибо за внимание.


(Pavel Ordenko) #2

Мм, нет там никаких ожиданий… Под таким “ожиданием”, я полагаю, Вы прдразумеваете implicit wait? Если да, то оно применимо к findElement(-s). Клик же кликает сразу без каких-либо ожиданий.
Есть подозрение, что дело где-то в nextStep() и уже там что-то подвисает.
А так, в клике может быть только ожидание уже после клика, что страница грузится (но не Ваш случай, как я понял из сообщения - у Вас перезагрузки страницы не происходит. И в селениуме 3 что-то лично у меня фигово этот пункт работает :frowning: ). Вот джава-док на всякий случай:

  /**
   * Click this element. If this causes a new page to load, you
   * should discard all references to this element and any further
   * operations performed on this element will throw a
   * StaleElementReferenceException.
   *
   * Note that if click() is done by sending a native event (which is
   * the default on most browsers/platforms) then the method will
   * _not_ wait for the next page to load and the caller should verify
   * that themselves.

   *
   * There are some preconditions for an element to be clicked. The
   * element must be visible and it must have a height and width
   * greater then 0.
   *
   * @throws StaleElementReferenceException If the element no
   *     longer exists as initially defined
   */
  void click();

(Дмитрий Кравчук) #3

Спасибо за пояснение. Я неверно указал вводные. При нажатии на кнопку на сервер уходит запрос с параметрами поиска. Все элементы текущей страничка перекрываются waitblock’ом. Приходит ответ от сервера и отображается новая страничка. И все это время по дебагу выполняется метод click().
Получается, если выполнения метода click() будет грузится новая страница, то непосредственно после клика будет ожидание полной загрузки новой странички?


(Pavel Ordenko) #4

Ну как-бы да… Теоретичеки :slight_smile: Но опять же, странно, что у Вас подвисает в клике, т.к. после того, как тест нажимает кнопку и “на сервер уходит запрос”, то запрос, я так понимаю, уходит на фоне (AJAX). Фоновые запросы ВебДрайвер не ждет (если не описано какое-либо явное ожидание, но по умолчанию - ничего такого нет). И в момент выполнения запроса у Вас страница остается загруженной, на сколько я понимаю (т.е., document.readyState у нее == true), следовательно выполнение кода должно было сразу продолжиться. Попробуйте подебажить “глубже” (не только свой код, но и выполнение кода ВебДрайвером), если можно так сказать, возможно найдете, где и что ждет. Сам пользуюсь Intellij Idea и она позваляет при дебаге (и не только) залазить в jar-ки зависимостей, даже если исходники не скачаны.

Вот неплохая статья про ожидания загрузки страницы - http://barancev.github.io/slow-loading-pages/ . Попробуйте поиграться со стратегией ожидания, может быть это Вам как-либо поможет (сам не пробовал, если честно)