English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Многие спрашивают в чате, почему не удается найти это выпадающее меню, почему не удается найти этот всплывающий блок... и т.д., и т.д., на самом деле, в большинстве случаев это две проблемы: 1 есть frame, 2 не добавлен wait. Не осознавая, какая скорость выполнения вашего кода, а также скорость загрузки и рендеринга браузера, это как если бы Герой-бегун и Герой-прямоугольник договорились встретиться, чтобы сразиться с монстрами, а затем Герой-бегун вернулся и спросил: почему ты еще не вышел, Герой-прямоугольник, ты же так медленно? Герой-прямоугольник, с его внутренней скоростью, думает: ты издеваешься над мной, я не хочу играть с тобой, бросаю исключение и оставляю тебя.
Как же учитывать медленную загрузку Герой-прямоугольника? Есть только один способ - это ждать. Что касается ожидания, то есть три способа ожидания, и блогер расскажет о них по порядку:
1. Принудительное ожидание
Первый и simplest способ - это принудительное ожидание sleep(xx), который принудительно заставляет Герой-бегуна ждать xx времени, regardless of whether Герой-прямоугольник может跟上 темп или уже прибыл раньше, он все равно будет ждать 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()
Это называется принудительным ожиданием, regardless of whether the browser has finished loading, the program must wait for 3 seconds, and then continue executing the next code, which is very useful for debugging, sometimes you can also wait in this way in the code, but it is not recommended to use this waiting method all the time, it is too rigid and seriously affects the execution speed of the program.
2. Тайное ожидание
Второй способ叫做 тайное ожидание, implicitly_wait(xx), смысл тайного ожидания: Герой-бегун и Герой-прямоугольник договорились, что не importa, куда пойдет Герой-бегун, он будет ждать Герой-прямоугольник 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(выполняемый метод, информация о времени ожидания)
Здесь особенно важно обратить внимание на параметр метода, который можно выполнить в until или until_not, многие передают объект WebElement, например:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # ошибка
Это неправильное использование, параметры, указанные здесь, должны быть вызываемыми, то есть объект должен иметь метод __call__(), в противном случае будет выведено исключение:
TypeError: 'xxx' объект не является вызываемым
Здесь вы можете использовать различные условия из модуля 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 Эти два условия проверяют, появляется ли элемент, передаваемые параметры - это tuple locator, например (By.ID, 'kw') Как следует из названия, один из них проходит, если загружается хотя бы один элемент, соответствующий условию; другой требует, чтобы загружались все элементы, соответствующие условию presence_of_element_located presence_of_all_elements_located Эти три условия проверяют, виден ли элемент, первые два передают параметр в виде tuple 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, можно передать tuple locator или напрямую передать способ定位: id, name, index или WebElement frame_to_be_available_and_switch_to_it Это условие определяет,出现了alert alert_is_present Этот условие определяет, является ли элемент кликабельным, передается locator element_to_be_clickable Эти четыре условия проверяют, выбран ли элемент, первый параметр传入 объект WebElement, второй параметр传入 кортеж 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, они могут реализовать множество судов, и если вы сможете灵活封装, это значительно повысит стабильность скрипта.
Ниже приведено подробное объяснение трех методов ожидания Python selenium, которые являются необходимыми для изучения, hopefully это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставляйте комментарии, и я постараюсь ответить вам в кратчайшие сроки. Вновь благодарю всех за поддержку сайта呐喊教程!
Объявление: контент этой статьи предоставлен из Интернета, авторские права принадлежат соответствующему владельцу, контент предоставлен пользователями Интернета в качестве добровольного вклада и загружен самостоятельно, сайт не имеет права собственности на него, материал не был отредактирован вручную, и сайт не несет ответственности за него. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для подачи жалобы,并提供相关证据. Если подтвердится, что материал涉嫌侵权, сайт немедленно удалил涉嫌侵权的内容。