Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как дождаться выполнения Javascript на странице


(Rostyslav Ignatenko) #1

после загрузки страницы я жму на combobox и жду выпадающий список, но по причине того что Javascript не успел отработать выпадающий список не выпадает


(rmerkushin) #2

Список заполняется посредством ajax? если да, то я делал страшный костыль:

wait = WebDriverWait(driver, timeout)
wait.until(lambda driver: driver.find_element(_type, _locator).is_displayed() and driver.execute_script("return $.active") == 0, message=message)

(Xasatx) #3

Это только если используется jQuery, в остальных случаях все зависит от фрэймворка


(rmerkushin) #4

Да, только для jQuery и только для ajax. В остальных случаях нужно видеть код того что там запускается. )


(Stan) #5

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


(Ray Romanov) #6

По поводу “(return $.active) == 0” у меня все время возвращает false чтоб не происходило на странице. Используется на страницах jQuery.


(Sergey Korol) #7

Можно попробовать альтернативу: return jQuery.active == 0
Но суть в том, что эту конструкцию надо использовать в качестве wait condition. Единоразовый вызов не даст результатов.


(Максим Малунов) #8

Если уж совсем по другому не получаеться то Thread.sleep().

  • еще здесь посмотрите .
  1. http://selenium.googlecode.com/svn-history/r12954/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html#executeAsyncScript(java.lang.String,%20java.lang.Object...)

p/s c webDriver.manage().timeouts().setScriptTimeout() никто не работал ?


(Alsu Vadimovna) #9

я обычно ставлю ожидание появления элемента, который есть в этом выпадающем списке. Как правило, помогает


(Ray Romanov) #10

В частных случаях да, а когда не знаешь что появится, в частности когда меняют сортировки.


(Дмитрий Мирошник) #11

Когда список загрузится, visible для menuItem и menu изменится на true.
Достаточно прописАть wait с условием isVisible для необходимого элемента.


(Ray Romanov) #12

Ну вообще-то, ищем единый способ ожидания выполнения JS скриптов на странице.


(rmerkushin) #13

Не поможет если пункты меню или строки таблицы обновляются через ajax. Нужно ждать завершения выполнения ajax, иначе webdriver не сможет обратиться к элементу, даже если он уже есть на странице.


(Дмитрий Мирошник) #14

Хм… Если menuitems появляются исключительно после завершения работы Ajax - можно считать кол-во menuitems в menu через findAll и обращаться к menuitem только тогда, когда их кол-во >1, например. Затем ждать, пока появится необходимый нам элемент.


(Ray Romanov) #15

Появление элементов меню еще не говорит о том что JS закончил работу, и получите ошибку что элемент не кликабелен.