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

Как установить время ожидания в Python selenium

Мы уже介绍了Selenium WebDriver тестовые методы, которые проводятся на веб-странице. Предыдущие примеры использовали простые веб-страницы для операций, возможно, вы не体会到网页加载的过程,但在实际应用过程中,加载网页是需要消耗一定时间的。Ваш скрипт已经开始运行, но элементы, которые вы хотите найти, еще не загружены, в этом случае будет выдаваться ошибка, что элемент не найден.显然,没有考虑加载时间的脚本不是一个成功的脚本。Сегодня мы расскажем, как установить время ожидания.

Три метода ожидания

time.sleep(n)

Принудительное ожидание n секунд. Функция Python, входящая в пакет time, перед использованием необходимо импортировать пакет time. Мы часто используем этот метод ожидания в наших примерах, чтобы让大家 clearer видеть результаты выполнения скрипта. Этот метод ожидания очень неуклюж, независимо от того, как быстро загружается страница, он всегда ждет n секунд, что можно сказать, очень неинтеллектуально.

implicitly_wait(n)

Наибольшее ожидание n секунд, если страница загрузится в течение n секунд, ожидание завершится досрочно. Это метод ожидания, предоставленный WebDriver, также известный как таймаут ожидания, который несколько умнее принудительного ожидания, но если страница содержит файлы, такие как超大视频 и т.д., то даже если необходимый элемент уже загружен, скрипт все равно будет ждать окончания загрузки всех файлов, что все же имеет свои недостатки.

WebDriverWait(n)

Наибольшее ожидание n секунд, проверка наличия необходимого элемента каждые несколько секунд в течение n секунд. Если элемент существует, ожидание завершается досрочно. Это метод ожидания, предоставленный WebDriver, также известный как явное ожидание, который несколько умнее таймаута ожидания, он не учитывает загрузку всего веб-страницы, а просто завершает ожидание, когда необходимый элемент существует.

Пример

Принудительное ожидание уже использовалось в предыдущих примерах, давайте посмотрим на два метода ожидания, предоставленных WebDriver

Таймаут ожидания

На самом деле, таймаут ожидания уже использовался в предыдущих примерах, но не было особенно подчеркивалось метод его использования. В этот раз мы откроем главную страницу网易, это веб-сайт с большим количеством загружаемого контента, загрузка которого, в зависимости от скорости Интернета, занимает около 10 секунд. Мы установим время ожидания в 60 секунд и затем рассчитаем, сколько времени потребуется, чтобы открыть страницу и нажать кнопку 【Открытый курс】в навигационной панели.

# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(60) # таймаут ожидания 60 секунд
time_start = time.time() # записываем время при открытии страницы
driver.get('https://www.163.com/')
driver.find_element_by_id('js_love_url').click()
time_end = time.time() # записываем время после нажатия кнопки
print('время доступа: ', time_end - time_start) # вывод времени разницы, то есть фактическое затраченное время
time.sleep(2) # принудительное ожидание 2 секунд, чтобы наблюдать за тем, что мы действительно открыли страницу 【Открытый курс】
driver.quit()

Закончилось выполнение скрипта. Хотя мы установили таймаут в 60 секунд, страница загрузилась примерно через 5 секунд (смотрите мои результаты выполнения снизу), и можно нажать кнопку 【Открытый курс】. Вот результат моего выполнения, который显示了整个加载时间.

>>>время доступа: 5.717327117919922

Ожидание по умолчанию

При использовании ожидания по умолчанию необходимо импортировать класс selenium.webdriver.support.wait.WebDriverWait, API как показано ниже:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver: без комментариев, WebDriver браузер, который вы определили (Chrome, Firefox и т.д.)
  • timeout: максимальное время ожидания, единица измерения - секунды
  • poll_frequency: время проверки наличия элемента, по умолчанию 0.5 секунд (если не указано, то 0.5 секунд), то есть по умолчанию проверять наличие элемента раз в 0.5 секунды, если элемент найден, то завершить ожидание,否则 продолжить ожидание и проверить еще раз через 0.5 секунд
  • ignored_exceptions=None: информация об исключении при превышении времени ожидания, по умолчанию NoSuchElementException

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

until(method, message='')
until_not(method, message='')
  • method: метод until() означает вызов метода, предоставленного драйвером, до тех пор, пока он не вернет not False, а метод until_not() до тех пор, пока он не вернет False
  • message: информация об исключении при превышении времени ожидания

Внимание, метод method() должен быть вызываемым методом, у него должен быть метод __call__(). В примере, давайте перепишем.

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
driver = webdriver.Chrome()
class button():
 def __call__(self, driver):
  if driver.find_element_by_id('js_love_url'):
   return True
  else:
   return False
driver.implicitly_wait(60)
time_start = time.time()
driver.get('https://www.163.com/')
# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver, 2, 0.5).until(button()) 
time_end = time.time()
print('access time is : ', time_end - time_start)
time.sleep(2)
driver.quit()

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

Обобщение

1. Selenium может использовать три типа ожидания, наиболее умным из которых является явная ожидание WebDriverWait()
2. При одновременном наличии скрытой и явной ожидания, эффективным временем ожидания является наибольшее время ожидания из обоих
3. В явной ожидании method() в until(method()) является вызываемым методом, его можно определить самостоятельно, а также использовать анонимные функции и другие методы, об этом мы поговорим позже
4. Установка скрытой ожидания один раз, то есть на протяжении всего скрипта, принудительная ожидание должна быть установлена в каждом месте, где необходимо ожидание

Вот и все, что есть в этой статье, надеюсь, это поможет вам в изучении, и希望大家多多支持呐喊教程。

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

Рекомендуем к просмотру