Как да изчакаме да се зареди страница със селен

How Wait Page Load With Selenium



Докато уеб автоматизацията или изстъргването на уеб с уеб драйвер Selenium може да срещнете проблеми като елемента, който искате да изберете, не е наличен или бутонът, който искате да натиснете, не е готов за щракване и т.н.

Причината за това е, че уеб драйверът на Selenium трябва да изтегли уеб страницата и да завърши изобразяването на страницата, преди да можете да направите нещо по нея. В миналото уеб сървърът е генерирал съдържанието на уебсайт, а браузърът просто го е изтеглял и рендирал. Тези дни имаме много уеб страници с една страница, които работят малко по-различно. В уеб страници за една страница (SPA) уеб сървърът обслужва само кодовете на интерфейса. След като кодът на интерфейса бъде изобразен в браузъра, кодът на интерфейса използва AJAX, за да поиска API данни към уеб сървъра. След като интерфейсът получи данните от API, той ги изобразява в браузъра. Така че, въпреки че браузърът е завършил изтеглянето и изобразяването на уеб страницата, тя все още не е готова. Трябва да изчакате да получи данните от API и да ги визуализира също. И така, решението на този проблем е да изчакаме данните да бъдат налични, преди да направим нещо със Selenium.







В Selenium има 2 вида изчаквания:
1) Неявно изчакване
2) Изрично изчакване



1) Неявно изчакване: Това е най -лесното за изпълнение. Неявно изчакване казва на уеб драйвера на Selenium да изчака няколко секунди, докато DOM (обектният модел на документа) бъде готов (уеб страницата да бъде готова).



2) Изрично изчакване: Това е малко по -сложно от неявното чакане. При изрично изчакване вие ​​казвате на уеб драйвера на Selenium какво да чака. Селенът чака това специфично условие да бъде изпълнено. След като бъде изпълнен, уеб драйверът на Selenium ще бъде готов да приеме други команди. Обикновено изричното време на изчакване е променливо. Зависи колко бързо се изпълняват условията. В най-лошия сценарий изричното изчакване ще чака толкова дълго, колкото и неявното чакане.





В тази статия ще ви покажа как да изчакате (неявно и явно) да се зареди страница със Selenium. И така, нека започнем.

Предпоставки:

За да изпробвате командите и примерите на тази статия, трябва да имате,



1) Linux дистрибуция (за предпочитане Ubuntu), инсталирана на вашия компютър.
2) Python 3 е инсталиран на вашия компютър.
3) PIP 3, инсталиран на вашия компютър.
4) Python virtualenv пакет, инсталиран на вашия компютър.
5) Mozilla Firefox или Google Chrome уеб браузъри, инсталирани на вашия компютър.
6) Трябва да знаете как да инсталирате Firefox Gecko Driver или Chrome Web Driver.

За да изпълните изискванията 4, 5 и 6, прочетете моята статия Въведение в Selenium с Python 3 на Linuxhint.com.

Можете да намерите много статии по другите теми LinuxHint.com . Не забравяйте да ги проверите, ако имате нужда от помощ.

Настройване на директория на проекта:

За да поддържате всичко организирано, създайте нова директория на проекта селен-чакане/ както следва:

$mkdir -пвселен-изчакайте/шофьори

Придвижете се до селен-чакане/ директория на проекта, както следва:

$CDселен-изчакайте/

Създайте виртуална среда на Python в директорията на проекта, както следва:

$virtualenv .venv

Активирайте виртуалната среда, както следва:

$източник.venv/съм/активирате

Инсталирайте Selenium с помощта на PIP3, както следва:

$ pip3 инсталирайте селен

Изтеглете и инсталирайте всички необходими уеб драйвери в шофьори/ директория на проекта. Обясних процеса на изтегляне и инсталиране на уеб драйвери в моята статия Въведение в Selenium с Python 3 . Ако имате нужда от помощ, потърсете нататък LinuxHint.com за тази статия.

Ще използвам уеб браузъра Google Chrome за демонстрацията в тази статия. Така че, ще използвам хромиран водач двоичен от шофьори/ директория.

За да експериментирате с неявно изчакване, създайте нов скрипт на Python ex01.py в директорията на вашия проект и въведете следните редове кодове в този файл.

отселенвносуеб драйвер
отселен.уеб драйвер.често срещани.ключове вносКлючове
настроики=уеб драйвер.Опции за Chrome()
настроики.без глава = Вярно
браузър=уеб драйвер.Chrome(executable_path='./drivers/chromedriver',настроики=настроики)
браузър.неявно_изчакайте(10)
браузър.вземете(„https://www.unixtimestamp.com/“)
времева марка=браузър.find_element_by_xpath('// h3 [@] [1]')
печат(„Текуща времева марка: %s“%(времева марка.текст.разделяне('')[0]))
браузър.близо()

След като приключите, запазете ex01.py Python скрипт.

Ред 1 и 2 импортират всички необходими компоненти на селен.

Ред 4 създава обект с опции за Chrome.

Ред 5 позволява безглавен режим за уеб драйвера на Chrome.

Ред 7 създава обект на браузър Chrome с помощта на хромиран водач двоичен от шофьори/ директория.

Ред 8 се използва, за да каже на Selenium да чака имплицитно за 10 секунди, използвайки implicitly_wait () браузър метод.

Ред 10 зарежда www.unixtimestamp.com в браузъра.

Ред 12 намира елемента за времева маркировка с помощта на селектора XPath // h3 [@class = ’text-hazard’] [1] и го съхранява в времева марка променлива.

Получих селектора XPath от инструмента за разработчици на Chrome. Както можете да видите, времевата марка е в първата h3 елемент с името на класа текст-опасност . Има 2 h3 елементи с класа текст-опасност .

Ред 13 отпечатва само времевата отметка от избрания от мен елемент с помощта на селектора XPath и съхраняван в времева марка променлива.

Ред 14 затваря браузъра.

След като приключите, стартирайте скрипта на Python ex01.py както следва:

$ python3 ex01.py

Както можете да видите, текущата времева марка се извлича от unixtimestamp.com и се отпечатва на конзолата.

Работа с Explicit Wait:

За да експериментирате с изрично изчакване, създайте нов скрипт на Python ex02.py в директорията на вашия проект и въведете следните редове кодове в този файл.

отселенвносуеб драйвер
отселен.уеб драйвер.често срещани.ключове вносКлючове
отселен.уеб драйвер.често срещани.от вносОт
отселен.уеб драйвер.поддържа.лук вносWebDriverWait
отселен.уеб драйвер.поддържа вносочаквани_условия
настроики=уеб драйвер.Опции за Chrome()
настроики.без глава = Вярно
браузър=уеб драйвер.Chrome(executable_path='./drivers/chromedriver',настроики=настроики)
браузър.вземете(„https://www.unixtimestamp.com/“)
опитвам:
времева марка=WebDriverWait(браузър, 10).до(
очаквани_условия.присъствие_на_елемент_на разположение((От.XPATH, '
// h3 [@] [1] '
))
)
печат(„Текуща времева марка: %s“%(времева марка.текст.разделяне('')[0]))
най -накрая:
браузър.близо()

След като приключите, запазете ex02.py Python скрипт.

Ред 1-5 импортира всички необходими компоненти от библиотеката Selenium.

Ред 7 създава обект с опции за Chrome.

Ред 8 позволява безглавен режим за уеб драйвера на Chrome.

Ред 10 създава обект на браузър Chrome с помощта на хромиран водач двоичен от шофьори/ директория.

Ред 12 зарежда www.unixtimestamp.com в браузъра.

Изричното изчакване се прилага в блока try-окончателно (от ред 14-20)

Ред 15-17 използва създава WebDriverWait () обект. Първият аргумент на WebDriverWait () е обектът на браузъра, а вторият аргумент е максимално разрешеното време (най-лошия сценарий) за изпълнение на условието, което в този случай е 10 секунди.

В до() блок, очаквани_условия.присъствие_елемент_локализиран () метод се използва, за да се уверите, че елементът присъства, преди да се опитате да изберете елемента. Тук, От.XPATH се използва за разказване на присъствие_ на_елемент_локалиран () метод, който използвахме селектор XPath за избор на елемента. Селекторът XPath е // h3 [@class = ’text-hazard’] [1] .

След като елементът бъде намерен, той се съхранява в времева марка променлива.

Ред 18 отпечатва само времевата отметка от избрания елемент.

И накрая, ред 19-20 затваря браузъра.

След като приключите, стартирайте ex02.py Python скрипт, както следва:

$ python3 ex02.py

Както можете да видите, текущата времева марка от unixtimestamp.com се отпечатва на конзолата.

Избиране на елементи в явни изчаквания:

В по -ранния раздел съм използвал От.XPATH за избор на елемент с помощта на селектора XPath. Можете също да изберете елементите, като използвате ID, име на етикет, име на CSS клас, CSS селектор и т.н.

Поддържаните методи за подбор са дадени по -долу:

От.XPATH - Избира елемент/елементи с помощта на XPath селектор.

От.CLASS_NAME - Избира елемент/елементи, използвайки име на CSS клас.

От.CSS_SELECTOR - Избира елемент/елементи с помощта на CSS селектор.

By.ID - Избира елемент по ID

По име - Избира елемент/елементи по име.

От.TAG_NAME - Избира елемент/елементи по име на HTML етикет.

От.LINK_TEXT - Избира елемент/елементи по текст на връзката на да се (котва) HTML маркер.

От.PARTIAL_LINK_TEXT - Избира елемент/елементи чрез частичен текст на връзката на да се (котва) HTML маркер.

За повече информация относно тях посетете Страница с документация на Python Selenium API .

Очаквани условия в явни изчаквания:

В по -ранния изричен пример за изчакване използвах присъствие_ на_елемент_локалиран () метод на очаквани_условия като изрично условие за изчакване, за да се уверя, че елементът, който търсех, съществува, преди да го изберете.

Има и други очаквани_условия можете да използвате като изрично условие за изчакване. Някои от тях са:

title_is (заглавие) - проверява дали заглавието на страницата е заглавие .

title_contains (частичен_заглавие) - проверява дали заглавието на страницата съдържа част от заглавието частичен_заглавие .

visibility_of (елемент) - проверява дали елемент се вижда на страницата, която е с ширина и височина на елемента по -голяма от 0.

visibility_of_element_located (локатор) -

присъствие_ на_елемент_на разположение (локатор) - Уверете се, че елементът се намира (до локатор ) присъства на страницата. The локатор е кортеж от (Чрез, селектор), както показах в примера за изрично изчакване.

присъствие_на_всички_елемент_локирано () - Уверява се, че всички елементи съвпадат с локатор присъства на страницата. The локатор е (От, селектор) кортеж.

text_to_be_present_in_element (локатор, текст) - Проверява дали текст присъства в елемента, разположен от локатор . The локатор е (От, селектор) кортеж.

element_to_be_clickable (локатор) - Проверява дали елементът, разположен до локатор е видим и кликващ. The локатор е (От, селектор) кортеж.

element_to_be_selected (локатор) - Проверява дали елементът, разположен до локатор е избран. The локатор е (От, селектор) кортеж.

alert_is_present () - очаквайте да има диалогов прозорец за предупреждение на страницата.

Има още много очаквани_условия на разположение за използване. За повече информация относно тях посетете Страница с документация на Python Selenium API .

Заключение:

В тази статия съм обсъждал неявните и явни чакания на Selenium. Също така ви показах как да работите с неявно и явно изчакване. Винаги трябва да се опитвате да използвате изрично изчакване във вашите проекти на Selenium, тъй като Selenium ще се опита да намали максимално времето за изчакване. По този начин няма да се налага да чакате определен брой секунди всеки път, когато стартирате вашите проекти на Selenium. Изричното изчакване трябва да спести много секунди.

За повече информация относно изчакванията на Selenium посетете официалната библиотека на Selenium Python чака страницата с документация .