English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Интерпретация трех способов ожидания в Python selenium

Найдено太多 людей, которые не умеют использовать ожидание, и блогер сегодня просто не может сдержаться и рассказать о необходимости ожидания.

Многие спрашивают в чате, почему не удается определить этот выпадающий список или этот всплывающий окно... Различные проблемы с определением. На самом деле, в большинстве случаев это две проблемы: 1 есть фрейм, 2 не добавлено ожидание. Не известно, какая скорость выполнения вашего кода, а скорость загрузки и рендеринга браузера - это что? Например, Герой-газетчик и Герой-мутант договорились пойти на битву с монстром, и когда Герой-газетчик вернулся, он спросил: "Почему ты еще не вышел, если я уже закончил битву?" Внутренне у Героя-мутанта пролетело一万 только что, думая: "Злишься на меня, что я медленно, я не хочу играть с тобой, выведу исключение и оставлю это дело."

Так как же учитывать медленную загрузку Героя-мутанта? Есть только один способ - ждать. Что касается ожидания, есть три способа ожидания, и блогер будет рассказывать о них по порядку:

1. Принудительное ожидание

Первый и наиболее простой способ - это принудительное ожидание sleep(xx), которое заставляет Героя-газетчика ждать xx секунд, независимо от того, успевает ли Герой-мутант или он уже прибыл.

Посмотрите на код:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')
sleep(3) # Принудительное ожидание 3 секунды, прежде чем выполнить следующий шаг
print(driver.current_url)
driver.quit()

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

2. Инкогнито ожидание

Второй способ называется инкогнито ожидание, implicitly_wait(xx). Значение инкогнито ожидания: Герой-газетчик и Герой-мутант договорились, что независимо от того, куда пойдет Герой-газетчик, он будет ждать Героя-мутанта xx секунд. Если Герой-мутант придет в течение этого времени, они сразу же отправятся на битву с монстром. Если Герой-мутант не придет в течение установленного времени, Герой-газетчик отправится один, и, естественно, он будет ждать, пока Герой-мутант выведет исключение.

Посмотрите на код:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # Инкогнито ожидание, максимальное время ожидания 30 секунд
driver.get('https://huilansame.github.io')
print(driver.current_url)
driver.quit()

Инкогнито ожидание устанавливает максимальное время ожидания. Если страница загрузится в течение установленного времени, следующим шагом будет выполнение следующего шага. В противном случае, ожидание продолжится до истечения времени, после чего будет выполнен следующий шаг. Внимание, здесь есть недостаток, так как программа будет ждать завершения загрузки всей страницы, то есть, как правило, вы видите, что индикатор загрузки в строке состояния браузера больше не вращается, и только после этого выполняется следующий шаг. Но иногда элементы, которые вам нужны, уже давно загружены, но из-за медленной загрузки отдельных js и т.д., мне нужно ждать, пока страница полностью завершит загрузку, чтобы выполнить следующий шаг. Что я делаю, если я хочу, чтобы следующий шаг выполнялся, как только элементы, которые я хочу, появятся? Есть способ, и это зависит от другого способа ожидания, предоставляемого selenium - это явное ожидание wait.

Особенно нужно отметить, что тайминг ожидания по умолчанию действует на весь цикл driver, поэтому достаточно его установить один раз. Я видел, как некоторые люди используют тайминг ожидания по умолчанию как sleep, везде и всюду...

3. Ожидание по требованию

Третий способ - это ожидание по требованию, WebDriverWait, в сочетании с методами класса until() и until_not(), позволяет гибко ждать по условиям. Основная идея: программа каждый xx секунд проверяет условие, если условие выполняется, то выполняет下一步, если нет, то продолжает ждать, до тех пор, пока не будет достигнуто максимальное время ожидания, после чего будет выброшено исключение TimeoutException.

Сначала посмотрим на пример кода:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # Тайминг ожидания по умолчанию и ожидание по требованию можно использовать одновременно, но要注意:最长等待时间取两者中的较大值
driver.get('https://huilansame.github.io')
locator = (By.LINK_TEXT, 'CSDN')
try:
  WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
  print(driver.find_element_by_link_text('CSDN')).get_attribute('href')
finally:
  driver.close()

В примере мы установили скрытое ожидание и явное ожидание, в других операциях скрытое ожидание играет решающую роль, вWebDriverWait..явное ожидание играет основную роль, но обратите внимание: наибольшее время ожидания зависит от большего из них, в этом примере это 20, если время скрытого ожидания > времени явного ожидания, то наибольшее время ожидания для этого кода равно времени скрытого ожидания.

Мы используем класс WebDriverWait и модуль expected_conditions, блогер покажет вам подробнее这两个модули:

WebDriverWait

Класс WebDriverWait из модуля waitявляется классом ожидания, рассмотрим его параметры и методы:

selenium.webdriver.support.wait.WebDriverWait (класс)
__init__
  driver: Передается экземпляр WebDriver, то есть driver из нашего примера
  timeout: Время ожидания, максимальное время ожидания (учитывая также время скрытого ожидания)
  poll_frequency: Интервал вызова метода вuntilилиuntil_not, по умолчанию 0.5 секунды
  ignored_exceptions: Пропущенные исключения, если во время вызова untilилиuntil_not выбрасывается исключение из этого списка,
      не прерывает код, продолжая ждать, если выбрасывается исключение, не входящее в этот список, прерывает код, выбрасывая исключение. По умолчанию это NoSuchElementException.
until
  method: В течение ожидания метод, переданный в качестве аргумента, вызывается через определенный интервал времени, пока значение не станет False
  message: Если время ожидания истекло, выбрасывается TimeoutException, передаваяmessageв исключение
until_not противоположен until, until продолжается, когда элемент появляется или условие выполняется,
    until_not продолжается, когда элемент исчезает или условие не выполняется, параметры такие же, не будем повторяться.
  method
  message

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

WebDriverWait(driver, время_ожидалки, частота_звонков, пропущенные_исключения).until(исполняемый_метод, информация_о_погрешности)

Здесь особенно важно обратить внимание на параметр method вuntilилиuntil_not, так как многие передают WebElementобъект, например:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # Ошибка

Это неправильное использование, параметры должны быть вызовными, то есть объект должен иметь метод __call__(), в противном случае будет выведено исключение:

TypeError: 'xxx' object is not callable

Здесь вы можете использовать различные условия из модуля expected_conditions, предоставляемого selenium, а также методы is_displayed() , is_enabled() , is_selected() WebElement или свои собственные методы, поэтому让我们看一下, какие условия предоставляет selenium:

expected_conditions

expected_conditions - это модуль selenium, который содержит множество условий, которые можно использовать для проверки:
selenium.webdriver.support.expected_conditions(модуль)
Эти два условия проверки проверяют title, проверяется, равен ли или содержит ли переданный параметр title значение driver.title
title_is
title_contains
Эти два условия проверки проверяют, появляется ли элемент, передаваемые параметры - это кортеж locator типа, например (By.ID, 'kw')
Как следует из названия, один проверяет, загружается ли хотя бы один элемент, соответствующий условиям, а другой требует, чтобы загружались все элементы, соответствующие условиям
presence_of_element_located
presence_of_all_elements_located
Эти три условия проверки проверяют, виден ли элемент, первые два передают параметры типа кортеж locator, а третий передает WebElement
Первый и третий по сути одинаковы
visibility_of_element_located
invisibility_of_element_located
visibility_of
Эти два условия проверки проверяют, появляется ли текст в каком-либо элементе, один проверяет text элемента, а другой проверяет value элемента
text_to_be_present_in_element
text_to_be_present_in_element_value
Эта условие проверки, можно ли ввести frame, можно передать кортеж locator или передать способ定位ations: id, name, index или WebElement
frame_to_be_available_and_switch_to_it
Этот критерий определяет,出现了 alert
alert_is_present
Этот критерий определяет, можно ли щелкнуть элемент,传入 locator
element_to_be_clickable
Эти четыре критерия определяют, выбран ли элемент, первый критерий传入 объект WebElement, второй传入 tuple locator
Третий критерий传入 объект WebElement и состояние, если они равны, возвращает True, в противном случае возвращает False
Четвертый критерий传入 locator и состояние, если они равны, возвращает True, в противном случае возвращает False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
Последний критерий определяет, находится ли элемент все еще в DOM,传入 объект WebElement, можно определить, был ли обновлен страница
staleness_of

Всего 17 условий, в сочетании с until и until_not, они могут реализовать множество�断ок, если их можно гибко обернуть, это значительно повысит стабильность скрипта.

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

Заявление: содержимое статьи взято из Интернета, авторские права принадлежат соответствующему автору, материал предоставлен пользователями Интернета в добровольном порядке, сайт не имеет права собственности, материал не был отредактирован вручную, и сайт не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении,并提供相关证据. При подтверждении факта нарушения сайт незамедлительно удалят涉嫌侵权的内容.

Основной учебник
Рекомендуем также