Смешивание неявных и явных ожиданий

4

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_ и других мест, где я знаю, что мне это нужно?

  • 1
    Я бы не стал смешивать два. Я бы использовал WebDriverWait каждый раз. Selenium не знает, когда вам нужно подождать, пока элемент находится в определенном состоянии, прежде чем его можно будет использовать. Вот почему вариант есть. Кроме того, неявный будет ждать, пока элемент не будет найден . Элемент был найден не равен элементу, пригодным для использования.
  • 0
    +1 Я не знал, что есть различие. Я начинаю задумываться, почему implicitly_wait вообще присутствует в API! Как бы вы проверили наличие элемента? Я вижу expected_conditions.element_to_be_clickable но не уверен, что еще я бы использовал.
Показать ещё 1 комментарий
Теги:
selenium
selenium-webdriver
webdriver

1 ответ

2
Лучший ответ

Поскольку я знаю, что есть времена, мне определенно нужен 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 найдет что-то, чтобы вернуться.

  • 0
    число рейнольдса Ваша точка зрения о нахождении родителя элемента, который вы уже получили от Selenium, означает ли это, что все браузеры всегда делают родителя элемента готовым к DOM и видимым перед самим элементом?
  • 1
    Я говорил о простом существовании. Если элемент X существует в дереве DOM и не является корнем дерева, родительский элемент X должен присутствовать в дереве. Я ожидал бы, что это будет верно и для наглядности, но я не уверен, что это справедливо во всех случаях. Однако, если вы начнете смотреть на такие вещи, как кликабельность, лучше использовать явное ожидание. Отчасти это также связано с логикой тестируемого программного обеспечения. Если приложение создает элемент <ul>, вставляя его в дерево DOM за одну операцию, то, когда я нашел в нем первый элемент <li>, я знаю, что присутствуют и другие элементы <li>.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню