1. 程式人生 > >selenium中的顯示等待,隱示等待,強制等待

selenium中的顯示等待,隱示等待,強制等待

一段 elf family 就會 周期 輸入 cit csdn AD

我們在實際使用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            (lambda
x: 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中的顯示等待,隱示等待,強制等待