Selen

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

Jak čekat na načtení stránky selenem
Zatímco webová automatizace nebo škrábání webu s webovým ovladačem Selenium, můžete čelit problémům, jako je prvek, který chcete vybrat, není k dispozici nebo tlačítko, které chcete stisknout, není připraveno ke kliknutí a tak dále.

Důvodem je to, že webový ovladač selenu musí stáhnout webovou stránku a dokončit vykreslování stránky, než na ní budete moci cokoli dělat. V minulosti webový server generoval obsah webových stránek a prohlížeč jej pouze stáhl a vykreslil. V dnešní době máme mnoho jednostránkových webových aplikací, které fungují trochu jinak. V Single Page Web Apps (SPAs) poskytuje webový server pouze kódy frontend. Po vykreslení kódu frontendu v prohlížeči použije kód frontendu AJAX k vyžádání dat API na webový server. Jakmile rozhraní API přijme data API, vykreslí je v prohlížeči. Přestože 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 vykreslí. Řešením tohoto problému je tedy počkat, až budou data k dispozici, než se selenem něco uděláme.

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

1) Implicitní čekání: Toto je nejjednodušší implementace. Implicitní čekání říká webovému ovladači selenu, aby čekal několik sekund, než bude DOM (model objektu dokumentu) připraven (webová stránka bude připravena).

2) Explicitní čekání: To je trochu složitější než implicitní čekání. Při výslovném čekání řeknete webovému ovladači Selenium, na co čekat. Selen čeká na splnění této konkrétní podmínky. Jakmile je splněn, bude webový ovladač Selenium připraven přijímat další příkazy. Obvykle je explicitní čekací doba proměnlivá. Záleží na tom, jak rychle jsou podmínky splněny. V nejhorším případě bude explicitní čekání čekat tak 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. Pojďme tedy začít.

Předpoklady:

Chcete-li vyzkoušet příkazy a příklady tohoto článku, musíte mít,

1) Ve vašem počítači je nainstalována distribuce Linuxu (nejlépe Ubuntu).
2) Python 3 nainstalovaný ve vašem počítači.
3) PIP 3 nainstalovaný ve vašem počítači.
4) Python virtuální balíček nainstalovaný v 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 webový ovladač Chrome.

Pro splnění požadavků 4, 5 a 6 si přečtěte můj článek Úvod do selenu v Pythonu 3 ve službě Linuxhint.com.

Na LinuxHint najdete mnoho článků o dalších tématech.com. Nezapomeňte je zkontrolovat, pokud potřebujete pomoc.

Nastavení adresáře projektu:

Chcete-li mít vše uspořádané, vytvořte nový adresář projektu selen-počkat / jak následuje:

$ mkdir -pv selenium-wait / ovladače

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

$ cd selen čekání /

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

$ virtualenv .venv

Aktivujte virtuální prostředí následujícím způsobem:

$ zdroj .venv / bin / aktivovat

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

$ pip3 nainstalujte selen

Stáhněte a nainstalujte všechny požadované webové ovladače v Řidiči/ adresář projektu. Proces stahování a instalace webových ovladačů jsem vysvětlil ve svém článku Úvod do selenu v Pythonu 3. Pokud potřebujete pomoc, hledejte na LinuxTip.com pro tento článek.

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

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

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

z webového ovladače pro import selenu
ze selenu.webdriver.běžný.klíče importovat klíče
options = webdriver.ChromeOptions ()
možnosti.bezhlavý = pravda
prohlížeč = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", options = options)
prohlížeč.implicitně_očkat (10)
prohlížeč.get ("https: // www.unixtimestamp.com / ")
timestamp = prohlížeč.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
print ('Aktuální časové razítko:% s'% (časové razítko.text.split (") [0]))
prohlížeč.zavřít()

Až budete hotovi, uložte ex01.py Skript v Pythonu.

Řádky 1 a 2 importují všechny požadované komponenty selenu.

Řádek 4 vytvoří objekt Možnosti prohlížeče 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 řekl selenu, aby implicitně čekal 10 sekund pomocí implicitne_wait () metoda prohlížeče.

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

Řádek 12 najde prvek časové značky pomocí selektoru XPath // h3 [@ class = 'text-danger'] [1] a ukládá jej do časové razítko proměnná.

Dostal jsem volič XPath z nástroje pro vývojáře Chrome. Jak vidíte, časová značka je v první h3 prvek s názvem třídy textové nebezpečí. K dispozici jsou 2 h3 prvky s třídou textové nebezpečí.

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

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

Po dokončení spusťte skript Pythonu 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 Explicit Wait:

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

z webového ovladače pro import selenu
ze selenu.webdriver.běžný.klíče importovat klíče
ze selenu.webdriver.běžný.podle importu
ze selenu.webdriver.Podpěra, podpora.import uživatelského rozhraní WebDriverWait
ze selenu.webdriver.podpora importu expect_conditions
options = webdriver.ChromeOptions ()
možnosti.bezhlavý = pravda
prohlížeč = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", options = options)
prohlížeč.get ("https: // www.unixtimestamp.com / ")
Snaž se:
timestamp = WebDriverWait (prohlížeč, 10).dokud(
očekávané_podmínky.present_of_element_located ((podle.XPATH, “
// h3 [@ class = 'text-danger'] [1] "))
)
print ('Aktuální časové razítko:% s'% (časové razítko.text.split (") [0]))
Konečně:
prohlížeč.zavřít()

Až budete hotovi, uložte ex02.py Skript v Pythonu.

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

Řádek 7 vytvoří objekt Možnosti prohlížeče 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 v prohlížeči.

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

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

V dokud() blok, očekávané_podmínky.přítomnost_prvku_naloženo () metoda se používá k ověření, zda je prvek přítomen před pokusem o výběr prvku. Tady, Podle.XPATH se používá k označení přítomnost_prvku_místě () metoda, kterou jsme k výběru prvku použili selektor XPath. Volič XPath je // h3 [@ class = 'text-danger'] [1].

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

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

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

Až budete hotovi, spusťte ex02.py Skript v Pythonu takto:

$ python3 ex02.py

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

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

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

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

Podle.XPATH - Vybírá prvek / prvky pomocí selektoru XPath.

Podle.JMÉNO TŘÍDY - Vybírá prvek / prvky pomocí názvu třídy CSS.

Podle.CSS_SELECTOR - Vybírá prvek / prvky pomocí selektoru CSS.

Podle.ID - Vybere prvek podle ID

Podle.NÁZEV - Vybere prvek / prvky podle názvu.

Podle.NÁZEV ŠTÍTKU - Vybírá prvek / prvky podle názvu značky HTML.

Podle.LINK_TEXT - Vybírá prvek / prvky podle textu odkazu A (kotva) značka HTML.

Podle.PARTIAL_LINK_TEXT - Vybírá prvek / prvky částečným textem odkazu A (kotva) značka HTML.

Další informace o nich najdete na stránce dokumentace k rozhraní Python Selenium API.

Očekávané podmínky při výslovném čekání:

V dřívějším explicitním příkladu čekání jsem použil přítomnost_prvku_naloženo () metoda očekávané_podmínky jako podmínka výslovného čekání, abych se ujistil, že prvek, který jsem hledal, existuje před jeho výběrem.

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

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

title_contains (částečný_titul) - zkontroluje, zda nadpis stránky obsahuje část nadpisu částečný_název.

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

visibility_of_element_located (lokátor) -

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

přítomnost_všechna_prvková_položka () - Zajistí, aby všechny prvky odpovídaly lokátor je na stránce. The lokátor je (Podle, selektor) n-tice.

text_to_be_present_in_element (lokátor, text) - Zkontroluje, zda text je přítomen v prvku umístěném u lokátor. The lokátor je (Podle, selektor) 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, selektor) n-tice.

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

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

Je jich mnohem více očekávané_podmínky k dispozici k použití. Další informace o nich najdete na stránce dokumentace k rozhraní Python Selenium API.

Závěr:

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

Další informace o selenu čeká na oficiální stránce dokumentace selenu Python Library čeká.

Top 5 ergonomických produktů pro počítačové myši pro Linux
Způsobuje dlouhodobé používání počítače bolest zápěstí nebo prstů? Trpíte ztuhlými klouby a neustále si musíte třást ruce? Cítíte pálivou bolest pokaž...
Jak změnit nastavení myši a touchpadu pomocí Xinput v Linuxu
Většina linuxových distribucí je ve výchozím nastavení dodávána s knihovnou „libinput“ pro zpracování vstupních událostí v systému. Může zpracovávat v...
Přemapujte tlačítka myši odlišně pro jiný software pomocí ovládání myší X-Mouse
Možná potřebujete nástroj, který by mohl změnit ovládání myši u každé aplikace, kterou používáte. V takovém případě můžete vyzkoušet aplikaci s názvem...