Paano Maghintay para sa isang Pahina na Maglo-load sa Selenium

How Wait Page Load With Selenium



Habang ang web automation o web scraping sa Selenium web driver, maaari kang harapin ang mga problema tulad ng elementong nais mong piliin ay hindi magagamit o ang pindutan na nais mong pindutin ay hindi handa na ma-click at iba pa.

Ang kadahilanang nangyari ito ay ang Selenium web driver ay dapat na mag-download ng webpage at tapusin ang pag-render ng pahina bago mo magawa ang anumang bagay dito. Noong nakaraan, nabuo ng webserver ang nilalaman ng isang website, at na-download lamang ito ng browser at ibinigay ito. Sa mga araw na ito mayroon kaming maraming mga solong pahina na web app na gumana nang medyo iba. Sa Mga Single Page Web Apps (SPA), ang webserver ang naghahatid lamang ng mga frontend code. Kapag naibigay ang frontend code sa browser, ang frontend code ay gumagamit ng AJAX upang humiling ng data ng API sa webserver. Kapag natanggap na ng frontend ang data ng API, nai-render ito sa browser. Kaya, kahit na natapos ng browser ang pag-download at pag-render ng web page, ang webpage ay hindi pa rin handa. Dapat mong hintayin itong makatanggap ng data ng API at i-render din ang mga ito. Kaya, ang solusyon sa problemang ito ay maghintay para sa data na magagamit bago kami gumawa ng anumang bagay sa Selenium.







Sa Selenium, mayroong 2 uri ng paghihintay:
1) Implicit na paghihintay
2) Tahasang paghihintay



1) Implicit na paghihintay: Ito ang pinakamadaling ipatupad. Sinasabi ng isang implicit na paghihintay sa Selenium web driver na maghintay ng maraming segundo para maging handa ang DOM (modelo ng object ng dokumento) (handa na ang web page).



2) Tahasang paghihintay: Ito ay medyo kumplikado kaysa sa implicit na paghihintay. Sa tahasang paghihintay, sasabihin mo sa Selenium web driver kung ano ang maghihintay. Naghihintay ang selenium para sa natukoy na tukoy na kundisyon. Kapag natupad na ito, ang Selenium web driver ay magiging handa na kumuha ng iba pang mga utos. Karaniwan, ang malinaw na oras ng paghihintay ay variable. Depende ito sa kung gaano kabilis nasiyahan ang mga kundisyon. Sa pinakapangit na sitwasyon, ang tahasang paghihintay ay maghihintay hangga't ang ipinahiwatig na paghihintay.





Sa artikulong ito, ipapakita ko sa iyo kung paano maghintay (implicit at malinaw) para sa isang pahina na mai-load sa Selenium. Kaya, magsimula na tayo.

Mga Pangangailangan:

Upang subukan ang mga utos at halimbawa ng artikulong ito, dapat mayroon ka,



1) Isang pamamahagi ng Linux (mas mabuti ang Ubuntu) na naka-install sa iyong computer.
2) Na-install ang Python 3 sa iyong computer.
3) naka-install na PIP 3 sa iyong computer.
4) Python virtualenv naka-install na package sa iyong computer.
5) Ang mga browser ng Mozilla Firefox o Google Chrome na naka-install sa iyong computer.
6) Dapat malaman kung paano i-install ang Firefox Gecko Driver o Chrome Web Driver.

Para sa pagtupad sa mga kinakailangan 4, 5, at 6, basahin ang aking artikulo Panimula sa Selenium na may Python 3 sa Linuxhint.com.

Maaari kang makahanap ng maraming mga artikulo sa iba pang mga paksa sa LinuxHint.com . Tiyaking suriin ang mga ito kung kailangan mo ng anumang tulong.

Pagse-set up ng isang Direktoryo ng Proyekto:

Upang panatilihing maayos ang lahat, lumikha ng isang bagong direktoryo ng proyekto selenium-wait / tulad ng sumusunod:

$mkdir -pvselenium-teka/mga driver

Mag-navigate sa selenium-wait / direktoryo ng proyekto tulad ng sumusunod:

$CDselenium-teka/

Lumikha ng isang virtual na kapaligiran ng Python sa direktoryo ng proyekto tulad ng sumusunod:

$virtualenv .venv

Isaaktibo ang virtual na kapaligiran tulad ng sumusunod:

$pinagmulan.venv/am/buhayin

I-install ang Selenium gamit ang PIP3 tulad ng sumusunod:

$ pip3 i-install ang siliniyum

I-download at i-install ang lahat ng kinakailangang web driver sa mga driver / direktoryo ng proyekto. Ipinaliwanag ko ang proseso ng pag-download at pag-install ng mga web driver sa aking artikulo Panimula sa Selenium na may Python 3 . Kung kailangan mo ng anumang tulong, maghanap sa LinuxHint.com para sa artikulong iyon

Gagamitin ko ang web browser ng Google Chrome para sa pagpapakita sa artikulong ito. Kaya, gagamitin ko ang chromedriver binary mula sa mga driver / direktoryo

Upang mag-eksperimento sa implicit na paghihintay, lumikha ng isang bagong script ng Python ex01.py sa iyong direktoryo ng proyekto at i-type ang mga sumusunod na linya ng mga code sa file na iyon.

mula sasiliniyumangkatwebdriver
mula sasiliniyumwebdriver.pangkaraniwan.mga susi angkatMga susi
mga pagpipilian=webdriver.Mga Opsyon ng Chrome()
mga pagpipilianwalang ulo = Totoo
browser=webdriver.Chrome(maipapatupad na_path='./drivers/chromedriver',mga pagpipilian=mga pagpipilian)
browserimplicitly_wait(10)
browserkumuha ka('https://www.unixtimestamp.com/')
timestamp=browserfind_element_by_xpath('// h3 [@] [1]')
mag-print('Kasalukuyang timestamp:% s'%(timestamp.text.nahati(')[0]))
browsermalapit na()

Kapag tapos ka na, i-save ang ex01.py Python script.

Ang linya 1 at 2 ay nag-import ng lahat ng kinakailangang mga sangkap ng Selenium.

Lumilikha ang Line 4 ng isang object ng Mga Pagpipilian ng Chrome.

Nagbibigay-daan ang linya 5 sa walang ulo na mode para sa Chrome web driver.

Lumilikha ang Line 7 ng isang object ng Chrome browser gamit ang chromedriver binary mula sa mga driver / direktoryo

Ginagamit ang linya 8 upang sabihin sa Selenium na maghintay nang implicit para sa 10 segundo gamit ang implicitly_wait () paraan ng browser.

Nilo-load ng linya 10 ang www.unixtimestamp.com sa browser.

Hahanapin ng linya 12 ang elemento ng timestamp gamit ang tagapili ng XPath // h3 [@ class = ’text-panganib’] [1] at iniimbak ito sa timestamp variable.

Nakuha ko ang XPath selector mula sa Chrome Developer Tool. Tulad ng nakikita mo, ang timestamp ay nasa una h3 elemento na may pangalan ng klase text-panganib . Mayroong 2 h3 mga elemento sa klase text-panganib .

Ang linya 13 ay nagpi-print lamang ng timestamp mula sa elemento na napili ko gamit ang XPath selector at nakaimbak sa timestamp variable.

Isinasara ng linya 14 ang browser.

Kapag tapos ka na, patakbuhin ang script ng Python ex01.py tulad ng sumusunod:

$ python3 ex01.py

Tulad ng nakikita mo, ang kasalukuyang timestamp ay nakuha mula sa unixtimestamp.com at naka-print sa console.

Paggawa gamit ang Malaswang Paghintay:

Upang mag-eksperimento sa malinaw na paghihintay, lumikha ng isang bagong script ng Python ex02.py sa iyong direktoryo ng proyekto at i-type ang mga sumusunod na linya ng mga code sa file na iyon.

mula sasiliniyumangkatwebdriver
mula sasiliniyumwebdriver.pangkaraniwan.mga susi angkatMga susi
mula sasiliniyumwebdriver.pangkaraniwan.ni angkatNi
mula sasiliniyumwebdriver.suporta.sibuyas angkatWebDriverWait
mula sasiliniyumwebdriver.suporta angkatinaasahan_conditions
mga pagpipilian=webdriver.Mga Opsyon ng Chrome()
mga pagpipilianwalang ulo = Totoo
browser=webdriver.Chrome(maipapatupad na_path='./drivers/chromedriver',mga pagpipilian=mga pagpipilian)
browserkumuha ka('https://www.unixtimestamp.com/')
subukan mo:
timestamp=WebDriverWait(browser, 10).hanggang sa(
inaasahan_conditions.pagkakaroon_of_element_located((NiXPATH, '
// h3 [@] [1] '
))
)
mag-print('Kasalukuyang timestamp:% s'%(timestamp.text.nahati(')[0]))
sa wakas:
browsermalapit na()

Kapag tapos ka na, i-save ang ex02.py Python script.

Ini-import ng linya 1-5 ang lahat ng kinakailangang sangkap mula sa silid-aklatan ng Selenium.

Lumilikha ang Line 7 ng isang object ng Mga Pagpipilian ng Chrome.

Nagbibigay-daan ang Line 8 sa mode na walang ulo para sa driver ng web ng Chrome.

Lumilikha ang Line 10 ng isang object ng Chrome browser gamit ang chromedriver binary mula sa mga driver / direktoryo

Nilo-load ng linya 12 ang www.unixtimestamp.com sa browser.

Ang tahasang paghihintay ay ipinatupad sa try-tungtungna block (mula sa linya 14-20)

Gumagawa ang linya ng 15-17 WebDriverWait () bagay Ang unang pagtatalo ng WebDriverWait () ang object ng browser, at ang pangalawang argumento ay ang maximum na pinapayagan na oras (pinakapangit na sitwasyon) para sa pagtupad sa kundisyon, na 10 segundo sa kasong ito.

Nasa hanggang () harangan, inaasahan_conditions.presence_of_element_located () ginagamit ang pamamaraan upang matiyak na ang elemento ay naroroon bago subukang piliin ang elemento. Dito, Ni.XPATH ay ginagamit upang sabihin sa presensya_of_element_located () pamamaraan na ginamit namin ang isang XPath selector upang mapili ang elemento. Ang tagapili ng XPath ay // h3 [@ class = ’text-panganib’] [1] .

Kapag natagpuan ang elemento, ito ay nakaimbak sa timestamp variable.

Ang linya 18 ay naglilimbag lamang ng timestamp mula sa napiling elemento.

Panghuli, isinasara ng linya 19-20 ang browser.

Kapag tapos ka na, patakbuhin ang ex02.py Ang script ng Python tulad ng sumusunod:

$ python3 ex02.py

Tulad ng nakikita mo, ang kasalukuyang timestamp mula unixtimestamp.com ay nakalimbag sa console.

Pagpili ng Mga Elemento sa Malaswang Naghihintay:

Sa naunang seksyon, ginamit ko na Ni.XPATH para sa pagpili ng elemento gamit ang tagapili ng XPath. Maaari mo ring piliin ang mga elemento gamit ang ID, pangalan ng tag, pangalan ng klase ng CSS, tagapili ng CSS, atbp.

Ang mga sinusuportahang pamamaraan ng pagpili ay ibinibigay sa ibaba:

Ni.XPATH - Pinipili ang elemento / elemento gamit ang XPath selector.

Ni.CLASS_NAME - Pinipili ang elemento / elemento gamit ang pangalan ng klase ng CSS.

Ni.CSS_SELECTOR - Pinipili ang elemento / elemento gamit ang tagapili ng CSS.

Ni.ID - Pinipili ang elemento ayon sa ID

Ni.NAME - Pinipili ang elemento / elemento ayon sa pangalan.

Ni.TAG_NAME - Pinipili ang elemento / elemento sa pamamagitan ng pangalan ng HTML tag.

Ni.LINK_TEXT - Pinipili ang elemento / elemento sa pamamagitan ng teksto ng link ng sa (anchor) HTML tag.

Ni.PARTIAL_LINK_TEXT - Pinipili ang elemento / elemento sa pamamagitan ng bahagyang teksto ng link ng sa (anchor) HTML tag.

Para sa karagdagang impormasyon tungkol sa mga ito, bisitahin ang Pahina ng Dokumentasyon ng Python Selenium API .

Mga Inaasahang Kundisyon sa Malaswang Paghihintay:

Sa naunang tahasang halimbawa ng paghihintay, ginamit ko ang presensya_of_element_located () paraan ng inaasahan_conditions bilang ang malinaw na kundisyon ng paghihintay upang matiyak na ang elemento na hinahanap ko ay mayroon bago piliin ito.

May iba pa inaasahan_conditions maaari mong gamitin bilang isang malinaw na kundisyon ng paghihintay. Ang ilan sa kanila ay:

title_is (pamagat) - Sinusuri kung ang pamagat ng pahina ay pamagat .

title_contains (bahagyang_title) - Sinusuri kung ang pamagat ng pahina ay naglalaman ng isang bahagi ng pamagat bahagyang_title .

visibility_of (elemento) - Sinusuri kung ang elemento ay nakikita sa pahina na ang elemento ay may lapad at taas na mas mataas sa 0.

visibility_of_element_located (tagahanap) -

presensya_of_element_located (tagahanap) - Tiyaking matatagpuan ang elemento (ng tagahanap ) ay naroroon sa pahina. Ang tagahanap ay isang tuple ng (Ni, tagapili), tulad ng ipinakita ko sa malinaw na halimbawa ng paghihintay.

presensya_of_all_element_located () - Tinitiyak na ang lahat ng elemento ay naitugma ng tagahanap ay naroroon sa pahina. Ang tagahanap ay isang (Ni, tagapili) tuple

text_to_be_present_in_element (tagahanap, teksto) - Sinusuri kung ang text ay naroroon sa elemento na matatagpuan ng tagahanap . Ang tagahanap ay isang (Ni, tagapili) tuple

element_to_be_clickable (tagahanap) - Sinusuri kung ang elemento na matatagpuan ng tagahanap ay nakikita at naki-click. Ang tagahanap ay isang (Ni, tagapili) tuple

element_to_be_selected (tagahanap) - Sinusuri kung ang elemento na matatagpuan ng tagahanap napili. Ang tagahanap ay isang (Ni, tagapili) tuple

alert_is_present () - asahan ang isang alertong alerto na naroroon sa pahina.

Marami pa inaasahan_conditions magagamit mo upang magamit. Para sa karagdagang impormasyon tungkol sa mga ito, bisitahin ang Pahina ng Dokumentasyon ng Python Selenium API .

Konklusyon:

Sa artikulong ito, tinalakay ko ang implicit at tahasang paghihintay ng Selenium. Ipinakita ko rin sa iyo kung paano magtrabaho kasama ang isang implicit at tahasang paghihintay. Dapat mong palaging subukang gumamit ng tahasang paghihintay sa iyong mga proyekto sa Selenium dahil susubukan ng Selenium na bawasan ang oras ng paghihintay hangga't maaari. Sa ganitong paraan, hindi ka maghihintay para sa isang tukoy na bilang ng mga segundo sa tuwing pinapatakbo mo ang iyong mga proyekto sa Selenium. Ang tahasang paghihintay ay dapat na makatipid ng maraming segundo.

Para sa karagdagang impormasyon tungkol sa paghihintay ng Selenium, bisitahin ang opisyal na Selenium Python Library ay naghihintay ng pahina ng Dokumentasyon .