Неблокирующее ожидание в селене с использованием Python

Опубликовано: 5 Января, 2022

Предварительное условие: автоматизация браузера с использованием 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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.