Python爬蟲之設置selenium webdriver等待


Python爬蟲之設置selenium webdriver等待

 

ajax技術出現使異步加載方式呈現數據的網站越來越多,當瀏覽器在加載頁面時,頁面上的元素可能並不是同時被加載完成,這給定位元素的定位增加了困難。

如果因為在加載某個元素時延遲而造成ElementNotVisibleException(不可見元素異常)的情況出現,那么就會降低自動化腳本的穩定性,設置元素等待可改善這種問題造成的不穩定。

一、強制等待

 強制等待是利用python語言自帶的time庫中的sleep()方法:

from selenium import webdriver
from time import sleep

def test():
    #打開瀏覽器
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    sleep(5)
    driver.quit()

sleep(5)會掛起這個腳本,五秒后再繼續執行,但是這種方式會導致這個腳本運行時間過長,不到萬不得已盡可能少用,特殊情況下,時間設置最好不超過1秒,一般0.5秒。

二、隱式等待

隱式等待:在腳本中我們一般看不到等待語句,但是它會在每個頁面加載的時候自動等待;隱式等待只需要聲明一次,一般在打開瀏覽器后進行聲明。聲明之后對整個drvier的生命周期都有效,后面不用重復聲明。 

設置一定的時長等待頁面上某元素加載完成,如果超出了設置的時長元素還沒有被加載,則拋出NoSuchElementException異常,沒有超過規定時間就繼續往下執行,WebDriver提供了implicitly_wait()方法來實現隱式等待,默認設置為0:

from selenium import webdriver

def test():
    #打開瀏覽器
    driver = webdriver.Firefox()
    #隱式等待 設置等待時間為10秒
    driver.implicitly_wait(10)
    driver.get('http://www.baidu.com')

注意:隱式等待中,如果元素在規定時間內加載出來,也得繼續等待到規定的時間結束。

 

三、顯示等待

顯示等待:顯示等待必須在每個需要等待的元素前面進行聲明。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

def test():
    #打開瀏覽器
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    #顯示等待
    element = WebDriverWait(driver,5,0.5).until(ec.presence_of_all_elements_located((By.ID,"kw")))
    driver.find_element_by_id("kw").send_keys("selenium")

顯示等待需要用到兩個類:

WebDriverWait和expected_conditions兩個類。

1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

屬性
driver:瀏覽器驅動
timeout:最長超時時間,默認以秒為單位
poll_frequency:檢測的間隔步長,默認為0.5s
ignored_exceptions:超時后的拋出的異常信息,默認拋出NoSuchElementExeception異常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是方法說明 :

until(method,message=”) 
method: 在等待期間,每隔一段時間(__init__中的poll_frequency)調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not(method,message=”) 
 與until相反,until是當某元素出現或什么條件成立則繼續執行,
 until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同。

 

2、expected_conditions類

各種類,達到某種條件,返回True和False

常用條件:

                       條件                            說明
presence_of_element_located      判斷某個元素是否被加到了DOM樹里,並不代表該元素一定可見
visibility_of_element_located     判斷某個元素是否可見,可見代表元素非隱藏,並且元素的寬和高都不等於0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM