Почему в Selenium wait.until_not(EC.invisibility_of_element_located) слишком долго ждет исчезновения загрузчика?

Какие selenium.webdriver.support.expected_conditions лучше использовать в ожидании невидимости элемента? В моем случае я ввожу данные в форму, нажимаю сохранить и жду когда загрузчик исчезнет

from selenium.webdriver.support import expected_conditions as EC 
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")

В выводе я вижу, что второе ожидание выполняется в течение 20 секунд (мое глобальное неявное ожидание составляет 20 секунд).

360ms ⟥     [debug] loader appeared
21s 141ms ⟥ [debug] loader disappeared

Локатор хороший, пытаюсь понять, что не так с ожиданием. Были ли у кого-нибудь подобные проблемы? Буду рад любым предложениям.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 565
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Из документации Ожидания

Предупреждение: не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к тайм-ауту через 20 секунд.

Возможно смешивание следующих двух ожиданий:

  • глобальное неявное ожидание составляет 20 секунд
  • WebDriverWait(драйвер, 10)

вызывает непредсказуемое время ожидания.


Решение

При вызове WebDriverWait вам необходимо перенастроить неявное ожидание на 0, используя следующую строку кода:

  • Питон:

    driver.implicitly_wait(0)
    
  • Джава:

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
  • Дотнет:

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    

Я думаю ты прав. Я попытаюсь изменить неявное ожидание внутри моей функции.

vitaliis 19.12.2020 22:20

Спасибо за полезный совет

vitaliis 16.03.2021 22:06

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

Позвольте мне объяснить с вашим кодом:

# 1. create a wait object
wait = WebDriverWait(driver, 10)

# 2. execute a wait statement
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")

# 3. execute a wait statement
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")

Оба оператора ожидания (№2 и №3) используют один и тот же объект ожидания, поэтому их выполнение будет "стекаться":

  1. Объект ожидания будет ждать 10 секунд для условия
  2. Подождите 10 секунд (унаследовано) + появится счетчик
  3. Подождите 10 секунд (унаследовано) + появится счетчик (унаследовано) + исчезнет счетчик

Действие № 2 ждет 10 секунд. Действие №3 ждет 20 секунд.

Спасибо, я нашел это как одно из решений для ожидания исчезновения объекта на этом сайте. "wait.until(EC.presence_of_element_located((SelectBy.CSS_SEL‌​ECTOR, ".spinner"))) debug("появился загрузчик")" - это ожидание проходит без проблем, но .invisibility_of_element_located зависает.

vitaliis 19.12.2020 23:42

Из документации Explicit Waits

Вы также можете попробовать это:

try:
  WebDriverWait(driver, 10).until(
    EC.invisibility_of_element_located((By.CSS_SELECTOR, ".spinner"))
  )
finally:
  debug('loader disappeared')

В приведенном выше коде Selenium будет ждать максимум 10 секунд, пока не будет найден элемент, соответствующий заданным критериям. Если за это время элемент не найден, генерируется исключение TimeoutException. По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не вернет успешное выполнение. ExpectedCondition вернет значение true (логическое значение) в случае успеха или значение null, если не удастся найти элемент.

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

Другие вопросы по теме