после загрузки страницы я жму на 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().
- еще здесь посмотрите .
p/s c webDriver.manage().timeouts().setScriptTimeout() никто не работал ?
я обычно ставлю ожидание появления элемента, который есть в этом выпадающем списке. Как правило, помогает
В частных случаях да, а когда не знаешь что появится, в частности когда меняют сортировки.
Когда список загрузится, visible для menuItem и menu изменится на true.
Достаточно прописАть wait с условием isVisible для необходимого элемента.
Ну вообще-то, ищем единый способ ожидания выполнения JS скриптов на странице.
Не поможет если пункты меню или строки таблицы обновляются через ajax. Нужно ждать завершения выполнения ajax, иначе webdriver не сможет обратиться к элементу, даже если он уже есть на странице.
Хм… Если menuitems появляются исключительно после завершения работы Ajax - можно считать кол-во menuitems в menu через findAll и обращаться к menuitem только тогда, когда их кол-во >1, например. Затем ждать, пока появится необходимый нам элемент.
Появление элементов меню еще не говорит о том что JS закончил работу, и получите ошибку что элемент не кликабелен.