Неблокирующее ожидание в селене с использованием Python
Предварительное условие: автоматизация браузера с использованием Selenium
Когда мы хотим выполнить веб-автоматизацию, нам нужно дождаться загрузки некоторых элементов javascript, прежде чем мы выполним какое-либо действие. В этом отношении обычно люди используют
Python3
time.sleep(in_seconds) |
который является блокирующим вызовом.
Под блокировкой вызова я подразумеваю, что он ждет или, скорее, переводит программу в спящий режим на указанные секунды, что бы ни случилось. Это не очень хорошая идея, так как это увеличивает задержку, фактически замедляя работу программы.
Возможное решение - дождаться появления элемента и не ждать больше этого.
Предварительные требования: установлен Python и установлен Selenium как пакет вместе с веб-драйвером (файл .exe)
Для Python Web Automation с Selenium это может быть достигнуто следующим образом:
Допустим, вы хотите войти в GeeksForGeeks через веб-автоматизацию и ввести учетные данные для входа, как только элементы имени пользователя и пароля появятся на веб-странице, а не ждать, пока загрузится вся страница.
Шаг 1:
Вы настраиваете веб-драйвер следующим образом:
Python3
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument( "--start-maximized" ) options.add_argument( "disable-infobars" ) chrome = webdriver.Chrome(the_path_of_webdriver_which_is_an_exe, chrome_options = options, service_args = [ '--ignore-ssl-errors = true' ]) username = 'something' password = 'anything' username_xpath = '//*[@id ="luser"]' password_xpath = '//*[@id ="password"]' sign_in_xpath = '//*[@id ="Login"]/button' chrome.get(login_uri) |
Здесь я использовал веб-драйвер Chrome, который запускался бы в развернутом виде (в полноэкранном режиме) без информационных панелей, то есть он не говорил, что хром управляется кодом автоматизации, и без каких-либо проблем загружал страницу подписи GFG.
Обратите внимание, что для того, чтобы найти xpath этих элементов, вам необходимо войти в режим разработчика и проверить эти элементы.
Шаг 2:
Python3
# return True if element is visible within 30 seconds, otherwise False def is_visible(locator, timeout = 30 ): try : ui.WebDriverWait(chrome, timeout).until(EC.visibility_of_element_located((By.XPATH, locator))) return True except TimeoutException: return False |
Вышеупомянутая функция is_visible является посредником в неблокирующем вызове, который мы собираемся здесь обсудить.
Объяснение:
1) локатор - xpath элемента
2) тайм-аут - до тех пор, пока не ждать появления элемента (потому что мы не хотим ждать вечно)
3) chrome - объект webdriver, который мы инициализировали ранее
4) Он использует встроенную утилиту ui, чтобы заставить веб-драйвер ждать, пока элемент не станет видимым (идентифицируемым xpath)
5) если он появляется в течение тайм-аута, он возвращает True, иначе False
Шаг 3:
Вот как мы используем функцию:
Python3
if not is_visible(username_xpath): raise RuntimeError( "Something went wrong with the username field :(" ) username_field = chrome.find_element_by_xpath(username_xpath) username_field.send_keys(username) if not is_visible(password_xpath): raise RuntimeError( "Something went wrong with the password field :(" ) password_field = chrome.find_element_by_xpath(password_xpath) password_field.send_keys(password) if not is_visible(sign_in_xpath): raise RuntimeError( "Something went wrong with the sign in field :(" ) sign_in_btn = chrome.find_element_by_xpath(sign_in_xpath) sign_in_btn.click() |
Здесь мы вызываем функцию is_visible и передаем xpath имени пользователя, пароля и кнопки sign_in соответственно и ждем появления элемента в течение таймаута (здесь 30 секунд). Если не отображается, мы вызываем RuntimeError с соответствующим сообщением.
Если он появляется в любое время раньше, чем 30 секунд, он переходит к поиску элемента по xpath (так как теперь он отображается на веб-странице, поэтому этот вызов не будет вызывать ошибку исключения.
Затем мы отправляем данные и нажимаем «Войти», и вы можете наслаждаться обучением на GFG без каких-либо блокирующих вызовов
Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.