System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
Код:
submitButton.click();
nextStep();
Немного о веб страничке:
На страничке имеется элемент div class =“waitblock hidden”. По нажатию кнопки этот элемент становится видимым и перекрывает другие. Ajax или JavaScript отправляет запрос на сервер. Через некоторое время приходит ответ. Waitblock снова становится невидимым.
Контекст:
Согласно сценарию, в некоторый момент времени нужно нажать кнопку на страничке, а потом выполнить следующие операции.
Я ожидал что после нажатия, будет выполняться следующая операция, связанная с waitblock’ом.
Но происходит следующее:
Вебдрайвер кликает по кнопке.(И я вижу что кнопка нажалась) - в этот момент выполняется команда click();
Появился waitblock - и в этот момент выполняется команда click();
waitblock пропал - и только теперь выполняется nextStep();
Вопрос:
Я в курсе ожидания элемента внутри метода click() который задает таймаут до NoSuchElementException. Но задержка выполнения происходит внутри метода click() уже после выполнения нажатия на вебэлемент. Так как же в итоге работает метод click(), и можно ли настроить или убрать задержку после эмуляции нажатия?
Мм, нет там никаких ожиданий… Под таким “ожиданием”, я полагаю, Вы прдразумеваете implicit wait? Если да, то оно применимо к findElement(-s). Клик же кликает сразу без каких-либо ожиданий.
Есть подозрение, что дело где-то в nextStep() и уже там что-то подвисает.
А так, в клике может быть только ожидание уже после клика, что страница грузится (но не Ваш случай, как я понял из сообщения - у Вас перезагрузки страницы не происходит. И в селениуме 3 что-то лично у меня фигово этот пункт работает ). Вот джава-док на всякий случай:
/**
* 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();
Спасибо за пояснение. Я неверно указал вводные. При нажатии на кнопку на сервер уходит запрос с параметрами поиска. Все элементы текущей страничка перекрываются waitblock’ом. Приходит ответ от сервера и отображается новая страничка. И все это время по дебагу выполняется метод click().
Получается, если выполнения метода click() будет грузится новая страница, то непосредственно после клика будет ожидание полной загрузки новой странички?
Ну как-бы да… Теоретичеки Но опять же, странно, что у Вас подвисает в клике, т.к. после того, как тест нажимает кнопку и “на сервер уходит запрос”, то запрос, я так понимаю, уходит на фоне (AJAX). Фоновые запросы ВебДрайвер не ждет (если не описано какое-либо явное ожидание, но по умолчанию - ничего такого нет). И в момент выполнения запроса у Вас страница остается загруженной, на сколько я понимаю (т.е., document.readyState у нее == true), следовательно выполнение кода должно было сразу продолжиться. Попробуйте подебажить “глубже” (не только свой код, но и выполнение кода ВебДрайвером), если можно так сказать, возможно найдете, где и что ждет. Сам пользуюсь Intellij Idea и она позваляет при дебаге (и не только) залазить в jar-ки зависимостей, даже если исходники не скачаны.