docs сказать:
Неявное ожидание - сообщить WebDriver о опросе DOM для определенного количество времени, когда вы пытаетесь найти элемент или элементы, если они не доступно.
Вопрос:
В случае find_elements_by_
(множественное число), сколько элементов implicit_wait
ждет существования, прежде чем продолжить с помощью script? Или implicit_wait
работает только с find_element_by_
(сингулярным)? Если да, то что означают документы под "или элементами"?
От ответ SO > Я прочитал, что лучше не использовать как неявные, так и явные ожидания в том же script, о котором я заметил, так как я как тесты, чтобы быть настолько прочными, насколько это возможно.
Поскольку я знаю, что есть времена, мне определенно нужно WebDriverWait
, значит ли это, что мне нужно избавиться от implicit_wait
в моем методе unittest
setUp
и вместо этого использовать WebDriverWait
каждый раз, когда я использую любой метод find_element_by_
?
(я бы предпочел не делать этого, хотя я полагаю, что могу поместить каждый из методов find_element_by_
в свои собственные пользовательские функции - каждый из них завернут в свой собственный WebDriverWait
- он чувствует, что я не должен к).
Итак, мой главный вопрос:
Можно ли сохранить мой implicit_wait
в моем методе setUp
, а затем использовать WebDriverWait
, когда дело доходит до find_elements_by_
и других мест, где я знаю, что мне это нужно?
Поскольку я знаю, что есть времена, мне определенно нужен WebDriverWait, значит ли это, что мне нужно избавиться от implicit_wait в моем unittest методе setUp и вместо этого использовать WebDriverWait каждый раз, когда я использую какой-либо метод find_element_by_?
Да. Как вы видели в вопросе, на который вы ссылаетесь, если вы используете оба типа ожиданий, вы столкнетесь с нежелательным поведением. Это не просто теоретическое. Я испытал это поведение из первых рук, попытался его отладить, нашел вопрос, с которым вы связались, а затем удалил все неявные ожидания из моих тестовых наборов.
Я разработал библиотеку, чтобы помочь в настройке явных ожиданий (и сделать кучу других вещей). Предполагая, что у вас уже есть объект driver
, у которого есть веб-драйвер селена:
from selenium.webdriver.common.by import By
import selenic.util
util = selenic.util.Util(driver)
# This goes through util and uses the explicit wait set by util.
foo = util.find_element((By.CSS_SELECTOR, "..."))
# For special cases that take longer to give results.
with util.local_timeout(10):
# The timeout is set to 10 for calls in this with block.
bar = util.find_element(...)
# The timeout is restored to what it was just before the with.
Есть несколько раз, когда вам вообще не нужно использовать ожидания, поскольку логически, если присутствует элемент A, тогда присутствует B, поэтому вам не нужно его ждать. Например. если вы хотите родительский элемент, который вы уже получили из Selenium, вы можете сделать parent = foo.find_element_by_xpath("..")
.
Что касается поведения find_elements
, он возвращается, как только он определяет, что есть результат для возврата. Это может означать получение только одного элемента, если последующие элементы появятся после того, как find_elements
найдет что-то, чтобы вернуться.
WebDriverWait
каждый раз. Selenium не знает, когда вам нужно подождать, пока элемент находится в определенном состоянии, прежде чем его можно будет использовать. Вот почему вариант есть. Кроме того, неявный будет ждать, пока элемент не будет найден . Элемент был найден не равен элементу, пригодным для использования.implicitly_wait
вообще присутствует в API! Как бы вы проверили наличие элемента? Я вижуexpected_conditions.element_to_be_clickable
но не уверен, что еще я бы использовал.