Селен

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

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

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

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

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

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

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

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

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

1) Линукс дистрибуция (за предпочитане 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 прочетете статията ми Въведение в селена с Python 3 в Linuxhint.com.

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

Създаване на директория на проекти:

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

$ mkdir -pv селен-изчакване / драйвери

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

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

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

$ virtualenv .venv

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

$ източник .venv / bin / активиране

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

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

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

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

Работа с неявно изчакване:

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

от webdriver за импортиране на селен
от селен.уеб драйвер.често срещани.ключове за импортиране
options = webdriver.ChromeOptions ()
настроики.без глава = Вярно
браузър = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", опции = опции)
браузър.implicitly_wait (10)
браузър.get ("https: // www.unixtimestamp.com / ")
timestamp = браузър.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
print ('Текущ клеймо:% s'% (клеймо.текст.split (") [0]))
браузър.близо()

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

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

Ред 4 създава обект на Chrome Options.

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

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

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

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

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

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

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

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

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

$ python3 ex01.py

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

Работа с изрично чакане:

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

от webdriver за импортиране на селен
от селен.уеб драйвер.често срещани.ключове за импортиране
от селен.уеб драйвер.често срещани.чрез импортиране от
от селен.уеб драйвер.поддържа.ui импортиране на WebDriverWait
от селен.уеб драйвер.поддържа импортиране очаквани_условия
options = webdriver.ChromeOptions ()
настроики.без глава = Вярно
браузър = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", опции = опции)
браузър.get ("https: // www.unixtimestamp.com / ")
опитвам:
timestamp = WebDriverWait (браузър, 10).до(
очаквани_условия.присъствие_от_елемент_разположен ((От.XPATH, "
// h3 [@ class = 'text-danger'] [1] "))
)
print ('Текущ клеймо:% s'% (клеймо.текст.split (") [0]))
накрая:
браузър.близо()

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

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

Ред 7 създава обект на Chrome Options.

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

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

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

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

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

В до() блок, очаквани_условия.присъствие_ на_елемент_разположен () метод се използва, за да се увери, че елементът присъства, преди да се опитате да изберете елемента. Тук, От.XPATH се използва за казване на присъствие_ на_елемент_разположен () метод, който използвахме селектор XPath за избор на елемента. Селекторът XPath е // h3 [@ class = 'text-danger'] [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 селектор.

От.документ за самоличност - Избира елемент по идентификатор

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

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

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

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

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

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

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

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

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

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

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

видимост_ на_елемент_разположен (локатор) -

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

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

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

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

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

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

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

Заключение:

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

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

Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...
Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...
OpenTTD срещу Simutrans
Създаването на собствена транспортна симулация може да бъде забавно, релаксиращо и изключително примамливо. Ето защо трябва да сте сигурни, че изпробв...