selenium中的三種等待方式(顯示等待WebDriverWait()、隱式等待implicitly()、強制等待sleep())---基於python


我們在實際使用selenium或者appium時,等待下個等待定位的元素出現,特別是web端加載的過程,都需要用到等待,而等待方式的設置是保證腳本穩定有效運行的一個非常重要的手段,在selenium中(appium通用)常用的等待分為顯示等待WebDriverWait()隱式等待implicitly_wait()強制等待sleep()三種,下面我們就分別介紹一下這三種等待的區別

在前面的博文中簡單介紹了《強制等待和隱士等待的區別和理解,本文再詳細的結合案例進行理解。

 

  • sleep(): 強制等待,設置固定休眠時間。 python time 包提供了休眠方法 sleep() , 導入 time 包后就可以使用 sleep(),進行腳本的執行過程進行休眠。
  • implicitly_wait():隱石等待,也叫智能等待,是 webdirver 提供的一個超時等待。隱的等待一個元素被發現,或一個命令完成。如果超出了設置時間的則拋出異常。
  • WebDriverWait():顯示等待,同樣也是 webdirver 提供的方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException

下面通過一個實例來加深理解:

#coding=utf-8
from selenium import webdriver
#導入 WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#導入 time
from sleep import  sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#WebDriverWait()方法使用
element=WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("kw"))        #
element.send_keys("selenium")
#添加智能等待
driver.implicitly_wait(30)               #implicitly_wait()方法比 sleep() 更加智能,后者只能選擇一個固定的時間的等待,前者可以在一個時間范圍內智能的等待
driver.find_element_by_id("su").click()
#添加固定休眠時間
sleep(5)                     #sleep()方法以秒為單位,假如休眠時間小時 1 秒,可以用小數表示。
driver.quit()

關於強制等待和隱式等待在上面注釋中已做了說明

下面主要介紹一下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"))
 

 知識擴展:(截取出處為:http://blog.csdn.net/imzoer/article/details/8667176)

lambda只是一個表達式,函數體比def簡單很多。

lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。

lambda表達式是起到一個函數速寫的作用。允許在代碼內嵌入一個函數的定義。

如下例子:

定義了一個lambda表達式,求三個數的和。

再看一個例子:

用lambda表達式求n的階乘。

------------------------------

lambda表達式也可以用在def函數中。

看例子:

這里定義了一個action函數,返回了一個lambda表達式。其中lambda表達式獲取到了上層def作用域的變量名x的值。

a是action函數的返回值,a(22),即是調用了action返回的lambda表達式。

這里也可以把def直接寫成lambda形式。如下

 


免責聲明!

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



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