selenium中的顯示等待,隱示等待,強制等待
我們在實際使用selenium或者appium時,等待下個等待定位的元素出現,特別是web端加載的過程,都需要用到等待,而等待方式的設置是保證腳本穩定有效運行的一個非常重要的手段,在selenium中(appium通用)常用的等待分為顯示等待WebDriverWait()、隱式等待implicitly_wait()、強制等待sleep()三種,下面我們就分別介紹一下這三種等待的區別:
1、顯式等待 WebDriverWait()
顯式等待是你定義的一段代碼,用於等待某個條件發生然後再繼續執行後續代碼。
在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException。
Example:
#encoding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait #獲取單個頁面元素對象,顯示等待 #locateType查找的方法類型 #locatorExpression查找的表達式 def getElement(driver,locateType,locatorExpression): try: element=WebDriverWait(driver,5).until (lambdax: x.find_element(by=locateType, value=locatorExpression)) except Exception, e: raise e
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 #available since 2.26.0 driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally: driver.quit()
2、隱式等待 implicitly_wait()
相當於設置全局的等待,在定位元素時,對所有元素設置超時時間。
隱式等待使得WebDriver在查找一個Element或者Element數組時,每隔一段特定的時間就會輪詢一次DOM,如果Element或數組沒有馬上被發現的話。
默認設置是0。一旦設置,這個隱式等待會在WebDriver對象實例的整個生命周期起作用。
Example:
from selenium import webdriver
driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get(http://www.xxx.com) myDynamicElement = driver.find_element_by_id("ElementID")
3、強制等待 sleep()
強制等待,設置固定休眠時間。
python 的 time 包提供了休眠方法 sleep() , 導入 time 包後就可以使用 sleep(),進行腳本的執行過程進行休眠。
Example:
import time
time.sleep(10)
4、顯示等待和隱式等待的區別:
你男朋友約你去電影院看電影的時候,在樓下等你:
隱式等待:就是等你化好妝,三十分鐘內能下樓就行,但是一定是先化好妝才能下來
顯式等待:就不一樣了。你男朋友隔五分鐘打一次電話,問你好了沒?然後說你先下來吧,到我車上化妝,然後人先下去,再車上繼續化妝打扮,到電影院時候化妝完成。
你說哪個省時間?
當然是顯式等待!!!你就是那個元素,化妝打扮是頁面上其它元素。
5、詳解webDriverWait():
WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(self,method,message=) 或者
WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until_not(self,method,message=)
self, 函數本身,在實際使用的時候不需要輸入
driver, webdriver的驅動程序,如(IE、FireFox、chrome、safari等)
timeout,超時時間,默認以秒為單位 poll_frequency,休眠時間(步長)的間隔,默認為0.5秒,即檢測元素是否存在的頻率
ignored_exceptions, 超時後的異常信息,默認情況下拋 “NoSuchElementException",大家可以定義忽略的異常信息
WebDriverWait一般由until或until_not配合使用
until(method,message=")調用該方法提供的驅動程序做為一個參數,直到返回值不為False
until_not(method,message=")調用該方法提供的驅動程序做為一個參數,直到返回值為False
實例:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import NoAlertPresentException,TimeoutException,NoSuchElementException driver=webdriver.Firefox() driver.get("http:www.baidu.com") WebDriverWait(driver,10,1,NoSuchElementException).until(lambda driver:driver.find_element_by_name("d_status"))
6、Lambda函數
知識擴展:(以下出處為:http://blog.csdn.net/imzoer/article/details/8667176)
lambda只是一個表達式,函數體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda表達式是起到一個函數速寫的作用。允許在代碼內嵌入一個函數的定義。
Example1:
定義了一個lambda表達式,求三個數的和。
Example2:
用lambda表達式求n的階乘。
------------------------------
lambda表達式也可以用在def函數中。
Example3:
這裏定義了一個action函數,返回了一個lambda表達式。其中lambda表達式獲取到了上層def作用域的變量名x的值。
a是action函數的返回值,a(22),即是調用了action返回的lambda表達式。
這裏也可以把def直接寫成lambda形式。如下
selenium中的顯示等待,隱示等待,強制等待