python+selenium顯示等待、隱式等待和強制等待的區別

在實際使用selenium或者appium時,等待下個等待定位的元素出現,特別是web端加載的過程,都需要用到等待,而等待方式的設置是保證腳本穩定有效運行的一個非常重要的手段,在selenium中(appium通用)常用的等待分爲:

 

顯示等待WebDriverWait()隱式等待implicitly_wait()強制等待sleep()三種,下面我們就分別介紹一下這三種等待的區別

  • sleep(): 強制等待,設置固定休眠時間。後腳本的執行過程中執行 sleep()後線程休眠,而另外兩種線程不休眠。
  • implicitly_wait():隱式等待,是設置的全局等待。設置等待時間,是對頁面中的所有元素設置加載時間,即整個頁面的加載時間;
  •                              如果超出了設置時間的則拋出異常。隱式等待可以理解成在規定的時間範圍內,瀏覽器在不停的刷新頁面,直到找到相關元素或者時間結束。
  • WebDriverWait():顯示等待,是針對於某個特定的元素設置的等待時間,在設置時間內,默認每隔一段時間檢測一次當前頁面某個元素是否存在,如果在規定的時間內找到了元素,則直接執行,即找到元素就執行相關操作,如果超過設置時間檢測不到則拋出異常。默認檢測頻率爲0.5s,默認拋出異常爲:NoSuchElementException。

 

注意:顯示等待是針對某一個元素進行相關等待判定;

          隱式等待不針對某一個元素進行等待,是全局元素等待;

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

selenium的頁面等待有顯示等待和隱式等待

隱式等待 :比較簡單,提供一個等待時間,單位爲秒,則等這個時間過去在去做其他操作。 driver.implicitly_wait(10),如果不設置默認爲0

顯示等待 :指定某個條件,然後設置最長等待時間。如果在這個時間還沒有找到元素,那麼便會拋出異常。只有該條件觸發,才執行後續代碼,這個使用更靈活。

 

主要涉及到selenium.webdriver.support 下的expected_conditions類

 

注意:隱形等待是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然後執行下一步。

           注意這裏有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,纔會執行下一步,

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

 

 

顯示等待:WebDriverWait()

導入包:

 

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

 

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

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

 

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

與until()或者until_not()方法結合使用

 

(1)WebDriverWait(driver,10).until(method,message="")
         調用該方法提供的驅動程序作爲參數,直到返回值爲True


(2)WebDriverWait(driver,10).until_not(method,message="")

         調用該方法提供的驅動程序作爲參數,直到返回值爲False

 

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

在設置時間(10s)內,等待後面的條件發生。如果超過設置時間未發生,則拋出異常。

 

在等待期間,每隔一定時間(默認0.5秒),調用until或until_not裏的方法,直到它返回True或False.

 

WebDriverWait與expected_conditions結合使用:


from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver,10,0.5)
element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")


# 此處注意,如果省略message=“”,則By.ID外面是兩層()

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

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver,10,0.5)
element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")
# 此處注意,如果省略message=“”,則By.ID外面是兩層()

===============================================================================

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver,10,0.5)
element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")

 

 

 

 

 

================================================================================

 

WebDriverWait() 語法格式如下:

 

WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(method,message=)

或者
WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until_not(method,message=)


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

 

 

================================================================================

 

 


expected_conditions類提供的預期條件判斷的方法

方法 說明
title_is                          判斷當前頁面的 title 是否完全等於(==)預期字符串,返回布爾值
title_contains               判斷當前頁面的 title 是否包含預期字符串,返回布爾值
presence_of_element_located             判斷某個元素是否被加到了 dom 樹裏,並不代表該元素一定可見
visibility_of_element_located               判斷元素是否可見(可見代表元素非隱藏,並且元素寬和高都不等於 0)
visibility_of                                            同上一方法,只是上一方法參數爲locator,這個方法參數是 定位後的元素
presence_of_all_elements_located      判斷是否至少有 1 個元素存在於 dom 樹中。

                                                             舉例:如果頁面上有 n 個元素的 class 都是’wp’,那麼只要有 1 個元素存在,這個方法就返回 True
text_to_be_present_in_element           判斷某個元素中的 text 是否 包含 了預期的字符串
text_to_be_present_in_element_value 判斷某個元素中的 value 屬性是否包含 了預期的字符串
frame_to_be_available_and_switch_to_it 判斷該 frame 是否可以 switch進去,如果可以的話,返回 True 並且 switch 進去,否則返回 False
invisibility_of_element_located                 判斷某個元素中是否不存在於dom樹或不可見
element_to_be_clickable                          判斷某個元素中是否可見並且可點擊
staleness_of                                             等某個元素從 dom 樹中移除,注意,這個方法也是返回 True或 False
element_to_be_selected                          判斷某個元素是否被選中了,一般用在下拉列表
element_selection_state_to_be                判斷某個元素的選中狀態是否符合預期
element_located_selection_state_to_be 跟上面的方法作用一樣,只是上面的方法傳入定位到的 element,而這個方法傳入 locator
alert_is_present                                        判斷頁面上是否存在 alert


 

====================================================================================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章