Ako čakať na načítanie stránky selénom

How Wait Page Load With Selenium



Pri automatizácii webu alebo škrabaní webu pomocou webového ovládača Selenium sa môžete stretnúť s problémami, ako že prvok, ktorý chcete vybrať, nie je k dispozícii alebo tlačidlo, ktoré chcete stlačiť, nie je pripravené na kliknutie a podobne.

Dôvodom je to, že webový ovládač Selenium musí stiahnuť webovú stránku a dokončiť vykresľovanie stránky, než na nej môžete čokoľvek robiť. V minulosti webový server generoval obsah webovej stránky a prehliadač ju iba stiahol a vykreslil. V dnešnej dobe máme mnoho jednostránkových webových aplikácií, ktoré fungujú trochu inak. V jednostránkových webových aplikáciách (SPA) webový server poskytuje iba kódy frontendu. Po vykreslení kódu frontend v prehliadači použije kód frontendu AJAX na vyžiadanie údajov API webovému serveru. Hneď ako frontend prijme údaje API, vykreslí ich v prehliadači. Aj keď prehliadač dokončil sťahovanie a vykresľovanie webovej stránky, webová stránka stále nie je pripravená. Musíte počkať, kým príjme údaje rozhrania API a tiež ich vykreslí. Riešením tohto problému je teda počkať, kým budú údaje k dispozícii, a až potom budeme so Selenom niečo robiť.







V seléne existujú 2 typy čakaní:
1) Implicitné čakanie
2) Výslovné čakanie



1) Implicitné čakanie: Toto je najľahšie implementovateľné. Implicitné čakanie hovorí, že webový ovládač Selenium musí niekoľko sekúnd čakať, kým bude pripravený DOM (objektový model dokumentu) (webová stránka bude pripravená).



2) Explicitné čakanie: Je to trochu zložitejšie ako implicitné čakanie. V explicitnom čakaní poviete webovému ovládaču Selenium, na čo máte čakať. Selén čaká na splnenie tejto špecifickej podmienky. Akonáhle je splnený, webový ovládač Selenium bude pripravený prevziať ďalšie príkazy. Explicitná doba čakania je zvyčajne variabilná. To závisí od toho, ako rýchlo sú podmienky splnené. V najhoršom prípade explicitné čakanie počká rovnako dlho ako implicitné čakanie.





V tomto článku vám ukážem, ako čakať (implicitné a explicitné) na načítanie stránky so selénom. Začnime teda.

Predpoklady:

Na vyskúšanie príkazov a príkladov tohto článku musíte mať:



1) Vo vašom počítači je nainštalovaná distribúcia Linuxu (najlepšie Ubuntu).
2) Vo vašom počítači je nainštalovaný Python 3.
3) PIP 3 nainštalovaný vo vašom počítači.
4) Python virtualenv balík nainštalovaný vo vašom počítači.
5) Webové prehliadače Mozilla Firefox alebo Google Chrome nainštalované vo vašom počítači.
6) Musíte vedieť, ako nainštalovať ovládač Firefox Gecko alebo Chrome Web Driver.

Ak chcete splniť požiadavky 4, 5 a 6, prečítajte si môj článok Úvod do selénu v Pythone 3 na Linuxhint.com.

Môžete nájsť mnoho článkov na ďalšie témy LinuxHint.com . Nezabudnite ich skontrolovať, ak potrebujete pomoc.

Nastavenie adresára projektu:

Aby bolo všetko v poriadku, vytvorte nový adresár projektu selén-počkať/ nasledovne:

$mkdir -pvselén-počkajte/vodiči

Prejdite na selén-počkať/ adresár projektu takto:

$CDselén-počkajte/

Vytvorte virtuálne prostredie Python v adresári projektu nasledovne:

$virtualenv .venv

Virtuálne prostredie aktivujte nasledovne:

$zdroj.venv/dopoludnia/Aktivovať

Nainštalujte selén pomocou PIP3 nasledovne:

$ pip3 nainštalujte selén

Stiahnite a nainštalujte si požadovaný webový ovládač do súboru vodiči/ adresár projektu. V článku som vysvetlil proces sťahovania a inštalácie webových ovládačov Úvod do selénu v Pythone 3 . Ak potrebujete akúkoľvek pomoc, hľadajte ďalej LinuxHint.com za ten článok.

Na ukážku v tomto článku použijem webový prehliadač Google Chrome. Budem teda používať chromedriver binárne z vodiči/ adresár.

Ak chcete experimentovať s implicitným čakaním, vytvorte nový skript Python ex01.py v adresári projektu a do tohto súboru zadajte nasledujúce riadky kódov.

odselénimportwebdriver
odselén.webdriver.spoločný.kľúče importKľúče
možnosti=webdriver.Možnosti Chrome()
možnosti.bezhlavý = Pravda
prehliadač=webdriver.Chrome(spustiteľná_cesta=„./drivers/chromedriver“,možnosti=možnosti)
prehliadač.implicitne_ čakajte(10)
prehliadač.dostať(„https://www.unixtimestamp.com/“)
časová značka=prehliadač.find_element_by_xpath('// h3 [@] [1]')
vytlačiť('Aktuálna časová pečiatka: %s'%(časová značka.text.rozdeliť('')[0]))
prehliadač.Zavrieť()

Keď skončíte, uložte súbor ex01.py Skript Python.

Riadky 1 a 2 dovážajú všetky požadované komponenty selénu.

Riadok 4 vytvára objekt Možnosti prehliadača Chrome.

Riadok 5 umožňuje pre webový ovládač Chrome režim bez hlavy.

Riadok 7 vytvára objekt prehliadača Chrome pomocou súboru chromedriver binárne z vodiči/ adresár.

Riadok 8 slúži na to, aby Seleniu implicitne počkal 10 sekúnd pomocou implicitly_wait () metóda prehliadača.

Riadok 10 načíta do prehliadača www.unixtimestamp.com.

Riadok 12 nájde prvok časovej pečiatky pomocou voliča XPath // h3 [@class = ‘nebezpečenstvo textu‘] [1] a uloží ho do časová značka premenná.

Selektor XPath som získal z Nástroja pre vývojárov Chrome. Ako vidíte, časová pečiatka je v prvej h3 prvok s názvom triedy nebezpečenstvo textu . K dispozícii sú 2 h3 prvky s triedou nebezpečenstvo textu .

Riadok 13 vytlačí iba časovú pečiatku z prvku, ktorý som vybral pomocou voliča XPath a uložil do priečinka časová značka premenná.

Riadok 14 zatvorí prehliadač.

Po dokončení spustite skript Python ex01.py nasledovne:

$ python3 ex01.py

Ako vidíte, aktuálna časová pečiatka je extrahovaná z unixtimestamp.com a vytlačená na konzole.

Práca s explicitným čakaním:

Ak chcete experimentovať s explicitným čakaním, vytvorte nový skript Python ex02.py v adresári projektu a do tohto súboru zadajte nasledujúce riadky kódov.

odselénimportwebdriver
odselén.webdriver.spoločný.kľúče importKľúče
odselén.webdriver.spoločný.od importOd
odselén.webdriver.podpora.Cibuľa importWebDriverWait
odselén.webdriver.podpora importočakávané_podmienky
možnosti=webdriver.Možnosti Chrome()
možnosti.bezhlavý = Pravda
prehliadač=webdriver.Chrome(spustiteľná_cesta=„./drivers/chromedriver“,možnosti=možnosti)
prehliadač.dostať(„https://www.unixtimestamp.com/“)
skúsiť:
časová značka=WebDriverWait(prehliadač, 10).(
očakávané_podmienky.Prítomnosť_prvku_ umiestnená((Od.XPATH, '
// h3 [@] [1] '
))
)
vytlačiť('Aktuálna časová pečiatka: %s'%(časová značka.text.rozdeliť('')[0]))
konečne:
prehliadač.Zavrieť()

Keď skončíte, uložte súbor ex02.py Skript Python.

Riadok 1-5 importuje všetky požadované komponenty z knižnice Selenium.

Riadok 7 vytvára objekt Možnosti prehliadača Chrome.

Riadok 8 umožňuje pre webový ovládač Chrome režim bez hlavy.

Riadok 10 vytvára objekt prehliadača Chrome pomocou súboru chromedriver binárne z vodiči/ adresár.

Riadok 12 načíta do prehliadača www.unixtimestamp.com.

Explicitné čakanie je implementované v bloku try-finally (z riadku 14-20)

Riadok 15-17 používa vytvorenie WebDriverWait () predmet. Prvý argument z WebDriverWait () je objekt prehliadača a druhým argumentom je maximálny povolený čas (najhorší scenár) na splnenie podmienky, ktorý je v tomto prípade 10 sekúnd.

V do () blok, expect_conditions.presence_of_element_located () metóda sa používa na zaistenie prítomnosti prvku pred pokusom o výber prvku. Tu, By.XPATH používa sa na oznamovanie prezencia_prvku_ umiestnene () Na výber prvku sme použili metódu XPath. Selektor XPath je // h3 [@class = ‘nebezpečenstvo textu‘] [1] .

Akonáhle je prvok nájdený, je uložený v priečinku časová značka premenná.

Riadok 18 vytlačí iba časovú pečiatku z vybratého prvku.

Nakoniec riadok 19-20 zatvorí prehliadač.

Keď skončíte, spustite súbor ex02.py Skript Python takto:

$ python3 ex02.py

Ako vidíte, aktuálna časová pečiatka z webu unixtimestamp.com je vytlačená na konzole.

Výber prvkov v explicitnom čakaní:

V predchádzajúcej časti som použil By.XPATH na výber prvku pomocou voliča XPath. Prvky môžete tiež vybrať pomocou ID, názvu značky, názvu triedy CSS, selektora CSS atď.

Podporované metódy výberu sú uvedené nižšie:

By.XPATH - Vyberá prvok/prvky pomocou selektora XPath.

Od.CLASS_NAME - Vyberá prvok/prvky pomocou názvu triedy CSS.

Od.CSS_SELECTOR - Vyberá prvok/prvky pomocou selektora CSS.

By.ID - Vyberá prvok podľa ID

Podľa názvu - Vyberá prvok/prvky podľa názvu.

Autor: TAG_NAME - Vyberá prvok/prvky podľa názvu značky HTML.

Od.LINK_TEXT - Vyberá prvok/prvky podľa textu odkazu do (kotva) HTML tag.

Od.PARTIAL_LINK_TEXT - Vyberá prvok/prvky podľa textu čiastočného odkazu na do (kotva) HTML tag.

Ak chcete o nich získať ďalšie informácie, navštívte webovú stránku Stránka dokumentácie API Python Selenium .

Očakávané podmienky v explicitnom čakaní:

V predchádzajúcom explicitnom príklade čakania som použil prezencia_prvku_ umiestnene () metóda očakávané_podmienky ako podmienka explicitného čakania, aby sa ubezpečil, že prvok, ktorý som hľadal, existuje pred jeho výberom.

Existujú aj ďalšie očakávané_podmienky môžete použiť ako výslovnú podmienku čakania. Niektoré z nich sú:

title_is (titul) - kontroluje, či je názov stránky titul .

title_contains (partial_title) - kontroluje, či názov stránky obsahuje časť názvu čiastočný_názov .

visibility_of (element) - kontroluje, či element je viditeľný na stránke, kde prvok má šírku a výšku väčšiu ako 0.

visibility_of_element_located (lokátor) -

Prítomnosť_prvku_ umiestnená (lokátor) - Uistite sa, že prvok umiestnený (pri lokátor ) je prítomný na stránke. The lokátor je n -tica (Podľa, volič), ako som ukázal v explicitnom príklade čakania.

Prítomnosť_všetkého_prvku_miesto () - Zaisťuje, aby všetky prvky zodpovedali súboru lokátor je prítomný na stránke. The lokátor je a (Podľa, volič) násobný.

text_to_be_present_in_element (lokátor, text) - Skontroluje, či text je prítomný v prvku umiestnenom pri lokátor . The lokátor je a (Podľa, volič) násobný.

element_to_be_clickable (lokátor) - Skontroluje, či je prvok umiestnený pri lokátor je viditeľný a dá sa naň kliknúť. The lokátor je a (Podľa, volič) násobný.

element_to_be_selected (lokátor) - Skontroluje, či je prvok umiestnený pri lokátor je vybratý. The lokátor je a (Podľa, volič) násobný.

alert_is_present () - očakávajte, že na stránke bude prítomný výstražný dialóg.

Existuje mnoho ďalších očakávané_podmienky k dispozícii na použitie. Ak chcete o nich získať ďalšie informácie, navštívte webovú stránku Stránka dokumentácie API Python Selenium .

Záver:

V tomto článku som diskutoval o implicitných a explicitných čakaniach Selenia. Tiež som vám ukázal, ako pracovať s implicitným a explicitným čakaním. Vo svojich projektoch selénu by ste sa mali vždy snažiť použiť explicitné čakanie, pretože Selenium sa pokúsi skrátiť dobu čakania na maximum. Vďaka tomu nebudete musieť čakať určitý počet sekúnd pri každom spustení projektov selénu. Výslovné čakanie by malo ušetriť veľa sekúnd.

Ak chcete získať ďalšie informácie o čakaní na selén, navštívte oficiálna knižnica Selenium Python čaká na stránku dokumentácie .