Selenium成長之路-15設定等待時間
為了保證執行的指令碼正常載入,我們需要的是設定等待時間,具體有以下幾種:
sleep():設定固定等待時間,主要由time包提供,也可叫強制等待,
也就是說不管頁面是否載入完成,都會等待這些時間。
程式碼如下:
# coding = utf-8 from selenium import webdriver import time from selenium.webdriver.common.by import By # from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() url = 'http://www.baidu.com'driver.get(url) #在百度輸入框輸入python browser = driver.find_element(By.ID,'kw') browser.send_keys("pythonn") time.sleep(5) driver.quit()
implicitly_wait():webdriver包提供的一個等待方法,也叫隱私等待,
隱式等待是設定了一個最長等待時間,如果規定時間內網頁載入完成,則進行下一步,否則一直等到時間截止,再進行下一步。
程式碼如下:
# coding = utf-8 from selenium import webdriver import time fromselenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() url = 'http://www.baidu.com' driver.get(url) #在百度輸入框輸入python browser = driver.find_element(By.ID,'kw') inp=browser.send_keys("pythonn") driver.implicitly_wait(3) #刪除一個n browser.send_keys(Keys.BACK_SPACE) driver.implicitly_wait(3) #回車鍵 browser.send_keys(Keys.ENTER) driver.implicitly_wait(10) driver.quit()
WebDriverWait():同樣也是 webdirver 提供的方法,也叫顯示等待,
語法結構如下:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:webdriver.Chrome() 主要就是指webdriver的驅動程式
timeout:超時時間,預設單位是秒
poll_frequency:休眠時間的間隔時間,預設0.5秒
ignored_exceptions:超時後的異常資訊,預設丟擲NoSuchElementException異常
配合該類的until()和until_not()方法使用,詳細如下:
until(method,message=''):呼叫該方法提供的驅動程式作為一個引數,直到返回值不為False
unitl_not(method,message=''):呼叫該方法提供的驅動程式作為一個引數,直到返回值為False
主要是:程式每個xx秒檢視一次,如果條件成立,則執行下一步,否則繼續等待,直到超過設定的最長時間,然後丟擲TimeoutException
程式碼如下:
# coding = utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait driver = webdriver.Chrome() url = 'http://www.baidu.com' driver.get(url) browser = driver.find_element(By.ID,'kw') #設定現實等待,NoSuchElementException 可以不寫 # WebDriverWait(driver,10,1).until(lambda driver:browser) try: WebDriverWait(driver,10,2,NoSuchElementException).until(lambda driver:browser) print("test pass") except Exception as e: print("test file ",format(e)) driver.quit()
這裡應用了一個新函式:lambda 表示式,也叫匿名函式,宗旨就是能一句話寫完的程式碼不需要寫兩句話,把def函式簡單化
不懂得可以看一下廖大大的Python教程:點選這裡
一般在實際專案中,隱式等待使用的頻率會更高一些,但是並不是說現實等待或者強制等待不會去使用。
所以具體怎麼去使用以及使用什麼方法,只要能保證指令碼正常執行不出錯,就是可行的。