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

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

Список заполняется посредством 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)

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

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

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

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

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

Если уж совсем по другому не получаеться то 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() никто не работал ?

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

1 лайк

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

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

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

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

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

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