Прежде всего, time.sleep()
не является элегантным решением для ожидания объекта, например. кнопка, которую можно нажимать , поскольку она ухудшает общую производительность выполнения теста . Вы можете найти пару подробных обсуждений в:
Теперь, когда существуют сотни объектов, будет трудно рассчитать и установить задержку по умолчанию для глобальной настройки в соответствии с идеей Один размер подходит для всех .
Причины
Любым возможным способом действие click()
будет вызываться для различных типов элементов, таких как:
Несмотря на то, что все эти типы элементов динамически генерируются с помощью JavaScript и, по-видимому, выглядят одинаково, в основном между ними есть небольшая разница в отношении их функциональности и реализации. Например,
- executeScript () : выполняет JavaScript в контексте текущего выбранного фрейма или окна. Предоставленный фрагмент скрипта будет выполнен как тело анонимной функции.
- executeAsyncScript () : выполнение асинхронного фрагмента JavaScript в контексте текущего выбранного фрейма или окна. В отличие от выполнения синхронного JavaScript, сценарии, выполняемые с помощью этого метода, должны явно сигнализировать о завершении, вызывая предоставленный обратный вызов. Этот обратный вызов всегда вводится в выполняемую функцию как последний аргумент.
Итак, лучшим подходом было бы побудить WebDriverWait
согласно вашей спецификации теста . Элемент, который должен стать интерактивным в течение 5 секунд , не должен (в идеале) иметь право на глобальное WebDriverWait
10 секунд . Это может скрыть серьезную ошибку JavaScript или AJAX , которая занимает больше времени для рендеринга DOM Tree . Точно так же элемент, который должен быть повернут на clickable в течение 10 секунд , не должен иметь права на глобальный WebDriverWait
из 5 секунд . В этом случае ваш тест не будет выполнен по нежелательной причине.
В заключение, побудите WebDriverWait
согласно вашей спецификации испытаний .
Образец A:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#btn_download"))).click()
Образец B:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='standard']"))).click()
Обновление
В соответствии с обновлением вашего комментария, если какой-либо из ваших тестов основан на предварительном условии, что требуемый элемент должен (легко) взаимодействовать в HTML DOM , грубо говоря, вы можете избежать WebDriverWait
и сразу же найдите и вызовите click()
следующим образом: