Jak čekat na načtení stránky selenem

How Wait Page Load With Selenium



Zatímco automatizace webu nebo škrábání webu pomocí webového ovladače Selenium, můžete se setkat s problémy, jako že prvek, který chcete vybrat, není k dispozici nebo tlačítko, které chcete stisknout, není připraveno na kliknutí atd.

Důvodem je to, že webový ovladač Selenium si musí stáhnout webovou stránku a dokončit vykreslování stránky, než na ní můžete něco dělat. V minulosti webový server generoval obsah webové stránky a prohlížeč ji pouze stáhl a vykreslil. V dnešní době máme mnoho jednostránkových webových aplikací, které fungují trochu jinak. V jednostránkových webových aplikacích (SPA) webový server obsluhuje pouze kódy frontendu. Jakmile je v prohlížeči vykreslen kód frontendu, kód frontendu používá AJAX k vyžádání dat API do webového serveru. Jakmile frontend obdrží data API, vykreslí je v prohlížeči. I když prohlížeč dokončil stahování a vykreslování webové stránky, webová stránka stále není připravena. Musíte počkat, až přijme data API, a také je vykreslit. Řešením tohoto problému je tedy počkat, až budou data k dispozici, než budeme se Seleniem něco dělat.







V selenu existují 2 typy čekání:
1) Implicitní čekání
2) Explicitní čekání



1) Implicitní čekání: Toto je nejjednodušší na implementaci. Implicitní čekání říká webovému ovladači Selenium, aby několik sekund počkal, než bude připraven DOM (objektový model dokumentu) (webová stránka bude připravena).



2) Explicitní čekání: To je trochu složitější než implicitní čekání. V explicitním čekání řeknete webovému ovladači Selenium, na co má čekat. Selen čeká na splnění této konkrétní podmínky. Jakmile je splněn, webový ovladač Selenium bude připraven přijímat další příkazy. Explicitní čekací doba je obvykle proměnlivá. Záleží na tom, jak rychle jsou podmínky splněny. V nejhorším případě bude explicitní čekání čekat stejně dlouho jako implicitní čekání.





V tomto článku vám ukážu, jak čekat (implicitní a explicitní) na načtení stránky se selenem. Začněme tedy.

Předpoklady:

K vyzkoušení příkazů a příkladů tohoto článku musíte mít,



1) Distribuce Linuxu (nejlépe Ubuntu) nainstalovaná ve vašem počítači.
2) Ve vašem počítači je nainstalován Python 3.
3) V počítači je nainstalován PIP 3.
4) Python virtualenv balíček nainstalovaný ve vašem počítači.
5) Ve vašem počítači jsou nainstalovány webové prohlížeče Mozilla Firefox nebo Google Chrome.
6) Musíte vědět, jak nainstalovat ovladač Firefox Gecko nebo Chrome Web Driver.

Chcete -li splnit požadavky 4, 5 a 6, přečtěte si můj článek Úvod do selenu s Pythonem 3 na Linuxhint.com.

Můžete najít mnoho článků na jiná témata LinuxHint.com . Pokud potřebujete pomoc, nezapomeňte je zkontrolovat.

Nastavení adresáře projektu:

Aby bylo vše organizované, vytvořte nový adresář projektu selen-počkejte/ jak následuje:

$mkdir -pvselen-počkejte/Řidiči

Přejděte na selen-počkejte/ adresář projektu takto:

$CDselen-počkejte/

Vytvořte virtuální prostředí Pythonu v adresáři projektu následujícím způsobem:

$virtualenv .venv

Virtuální prostředí aktivujte následovně:

$zdroj.venv/dopoledne/aktivovat

Nainstalujte selen pomocí PIP3 následujícím způsobem:

$ pip3 nainstalujte selen

Stáhněte a nainstalujte veškerý požadovaný webový ovladač do souboru Řidiči/ adresář projektu. Ve svém článku jsem vysvětlil proces stahování a instalace webových ovladačů Úvod do selenu s Pythonem 3 . Pokud potřebujete pomoc, hledejte dál LinuxHint.com za ten článek.

K ukázce v tomto článku použiji webový prohlížeč Google Chrome. Takže budu používat chromedriver binární z Řidiči/ adresář.

Chcete -li experimentovat s implicitním čekáním, vytvořte nový skript Pythonu ex01.py v adresáři projektu a do tohoto souboru zadejte následující řádky kódů.

zselenimportwebový ovladač
zselen.webový ovladač.běžný.klíče importKlíče
možnosti=webový ovladač.Možnosti Chrome()
možnosti.bezhlavý = Skutečný
prohlížeč=webový ovladač.Chrome(spustitelná_cesta='./drivers/chromedriver',možnosti=možnosti)
prohlížeč.implicitně_čekejte(10)
prohlížeč.dostat('https://www.unixtimestamp.com/')
časové razítko=prohlížeč.find_element_by_xpath('// h3 [@] [1]')
tisk('Aktuální časové razítko: %s'%(časové razítko.text.rozdělit('')[0]))
prohlížeč.zavřít()

Jakmile budete hotovi, uložte ex01.py Python skript.

Řádek 1 a 2 importuje všechny požadované součásti selenu.

Řádek 4 vytvoří objekt Možnosti Chrome.

Řádek 5 umožňuje bezhlavý režim pro webový ovladač Chrome.

Řádek 7 vytvoří objekt prohlížeče Chrome pomocí chromedriver binární z Řidiči/ adresář.

Řádek 8 slouží k tomu, aby selenu řekl, aby implicitně čekal 10 sekund pomocí implicitly_wait () metoda prohlížeče.

Řádek 10 načte www.unixtimestamp.com do prohlížeče.

Řádek 12 najde prvek časového razítka pomocí voliče XPath // h3 [@class = ‘textové nebezpečí‘] [1] a uloží jej do časové razítko proměnná.

Selektor XPath jsem získal z Nástroje pro vývojáře Chrome. Jak vidíte, časové razítko je v prvním h3 prvek s názvem třídy textové nebezpečí . K dispozici jsou 2 h3 prvky se třídou textové nebezpečí .

Řádek 13 vytiskne pouze časové razítko z prvku, který jsem vybral pomocí voliče XPath a uložil do souboru časové razítko proměnná.

Řádek 14 zavírá prohlížeč.

Jakmile budete hotovi, spusťte skript Python ex01.py jak následuje:

$ python3 ex01.py

Jak vidíte, aktuální časové razítko je extrahováno z unixtimestamp.com a vytištěno na konzole.

Práce s explicitním čekáním:

Chcete -li experimentovat s explicitním čekáním, vytvořte nový skript Pythonu ex02.py v adresáři projektu a do tohoto souboru zadejte následující řádky kódů.

zselenimportwebový ovladač
zselen.webový ovladač.běžný.klíče importKlíče
zselen.webový ovladač.běžný.podle importPodle
zselen.webový ovladač.Podpěra, podpora.cibule importWebDriver Počkejte
zselen.webový ovladač.Podpěra, podpora importočekávané_podmínky
možnosti=webový ovladač.Možnosti Chrome()
možnosti.bezhlavý = Skutečný
prohlížeč=webový ovladač.Chrome(spustitelná_cesta='./drivers/chromedriver',možnosti=možnosti)
prohlížeč.dostat('https://www.unixtimestamp.com/')
Snaž se:
časové razítko=WebDriver Počkejte(prohlížeč, 10).dokud(
očekávané_podmínky.prezence_prvku_umístěno((Podle.XPATH, '
// h3 [@] [1] '
))
)
tisk('Aktuální časové razítko: %s'%(časové razítko.text.rozdělit('')[0]))
Konečně:
prohlížeč.zavřít()

Jakmile budete hotovi, uložte ex02.py Python skript.

Řádek 1-5 importuje všechny požadované komponenty z knihovny Selenium.

Řádek 7 vytvoří objekt Možnosti Chrome.

Řádek 8 umožňuje bezhlavý režim pro webový ovladač Chrome.

Řádek 10 vytvoří objekt prohlížeče Chrome pomocí chromedriver binární z Řidiči/ adresář.

Řádek 12 načte www.unixtimestamp.com do prohlížeče.

Explicitní čekání je implementováno v bloku try-finally (od řádku 14-20)

Řádek 15-17 používá vytváření WebDriverWait () objekt. První argument z WebDriverWait () je objekt prohlížeče a druhým argumentem je maximální povolená doba (nejhorší scénář) pro splnění podmínky, která je v tomto případě 10 sekund.

V dokud() blok, expect_conditions.presence_of_element_located () metoda se používá k zajištění toho, aby byl prvek přítomen před pokusem o výběr prvku. Tady, By.XPATH slouží k sdělování present_of_element_located () metodu, kterou jsme použili pro výběr prvku XPath. Volič XPath je // h3 [@class = ‘textové nebezpečí‘] [1] .

Jakmile je prvek nalezen, je uložen v časové razítko proměnná.

Řádek 18 vytiskne pouze časové razítko z vybraného prvku.

Nakonec řádek 19-20 zavře prohlížeč.

Jakmile budete hotovi, spusťte soubor ex02.py Python skript následovně:

$ python3 ex02.py

Jak vidíte, aktuální časové razítko z unixtimestamp.com je vytištěno na konzole.

Výběr prvků v explicitním čekání:

V předchozí části jsem použil By.XPATH pro výběr prvku pomocí voliče XPath. Prvky můžete také vybrat pomocí ID, názvu značky, názvu třídy CSS, selektoru CSS atd.

Podporované metody výběru jsou uvedeny níže:

By.XPATH - Vybírá prvek/prvky pomocí voliče XPath.

Od. CLASS_NAME - Vybírá prvek/prvky pomocí názvu třídy CSS.

Autor: CSC_SELECTOR - Vybírá prvek/prvky pomocí voliče CSS.

By.ID - Vybírá prvek podle ID

Podle jména - Vybírá prvek/prvky podle názvu.

Autor: TAG_NAME - Vybírá prvek/prvky podle názvu značky HTML.

Od.LINK_TEXT - Vybírá prvek/prvky podle textu odkazu na (kotva) HTML tag.

Od.PARTIAL_LINK_TEXT - Vybírá prvek/prvky podle částečného textu odkazu na (kotva) HTML tag.

Pro více informací o nich navštivte Stránka dokumentace API Python Selenium .

Očekávané podmínky v explicitním čekání:

V předchozím příkladu explicitní čekání jsem použil present_of_element_located () metoda očekávané_podmínky jako explicitní podmínka čekání, aby se ujistil, že prvek, který jsem hledal, existuje před jeho výběrem.

Existují další očekávané_podmínky můžete použít jako explicitní podmínku čekání. Někteří z nich jsou:

title_is (název) - kontroluje, zda je název stránky titul .

title_contains (partial_title) - kontroluje, zda název stránky obsahuje část názvu částečný_název .

visibility_of (element) - kontroluje, zda živel je viditelný na stránce, která má prvek šířku a výšku větší než 0.

visibility_of_element_located (lokátor) -

present_of_element_located (lokátor) - Ujistěte se, že se prvek nachází (u lokátor ) je na stránce přítomen. The lokátor je n -tice (Podle, volič), jak jsem ukázal v explicitním příkladu čekání.

present_of_all_element_located () - Zajišťuje, aby všechny prvky odpovídaly lokátor je na stránce přítomen. The lokátor je (Podle, volič) n -tice.

text_to_be_present_in_element (lokátor, text) - Zkontroluje, zda text je přítomna v prvku umístěném lokátor . The lokátor je (Podle, volič) n -tice.

element_to_be_clickable (lokátor) - Zkontroluje, zda je prvek umístěný u lokátor je viditelný a lze na něj kliknout. The lokátor je (Podle, volič) n -tice.

element_to_be_selected (lokátor) - Zkontroluje, zda je prvek umístěný u lokátor je vybráno. The lokátor je (Podle, volič) n -tice.

alert_is_present () - očekávejte, že na stránce bude zobrazen výstražný dialog.

Existuje mnoho dalších očekávané_podmínky k dispozici k použití. Pro více informací o nich navštivte Stránka dokumentace API Python Selenium .

Závěr:

V tomto článku jsem diskutoval o implicitních a explicitních čekáních Selenium. Také jsem vám ukázal, jak pracovat s implicitním a explicitním čekáním. Ve svých projektech selenu byste se vždy měli pokusit použít explicitní čekání, protože Selenium se pokusí dobu čekání co nejvíce zkrátit. Tímto způsobem nebudete muset čekat určitý počet sekund při každém spuštění vašich projektů selenu. Výslovné čekání by mělo ušetřit spoustu sekund.

Další informace o čekání na Selenium najdete na oficiální knihovna Selenium Python čeká na stránku dokumentace .