WebDriverWait元素等待和全局設置


 

 

由於現在部分web應用加載方式的選擇,頁面會需要一定時間逐漸加載完畢,也就是說有的頁面元素先加載出來,有的元素后加載出來。如果直接定位所查找的元素的話,可能會由於此元素尚未加載完畢找不到元素從而報錯,由於網絡不穩定這種情況出現的幾率會大很多,一般解決方法的話,time.sleep()函數可以避免一些這種狀況,但是缺少了靈活性。在selenium中有關於等待的方法可以比較靈活的解決這個問題,這次主要講解selenium中元素等待WebDriverWait的使用,以及全局的設置。

一、關於全局設置超時時間
三個全局設置時間的方法中,設置的時間單位為秒,例如implicitly_wait(30),意思是超過30秒沒有定位到一個元素,程序就會報錯拋出異常,期間會一直輪詢查找定位元素。

設置全局元素查找的超時時間

implicitly_wait(time_to_wait)
time_to_wait:超時時間(秒)
設置全局js異步腳本超時時間

set_script_timeout(time_to_wait)
time_to_wait:超時時間(秒)
設置全局頁面載入超時時間

set_page_load_timeout(time_to_wait)
time_to_wait:超時時間(秒)
二、關於WebDriverWait的使用以及方法介紹(顯示等待)
個人理解:WebDriverWait可以當做元素等待,靈活的設置查找元素時的判斷條件,同時由於方法中包含了大量webdriver自帶的判斷方法,只返回True和False,所以個人認為也可以靈活的當做斷言來使用。

2.1基礎格式(webDriverWait+until+(判斷條件)):
這個格式的結構有點像語言中主謂賓的結構,實例的意思是程序每0.5秒檢查,是否滿足:標題包含“百度一下”這個條件,檢查是否滿足條件的最長時間為:15秒,超過15秒仍未滿足條件則拋出異常

WebDriverWait(driver, 15, 0.5).until(expected_conditions.title_contains("百度一下"))
2.2導入庫 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
2.3WebDriverWait
滿足條件后繼續執行,否則在設置時間過后拋出異常

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

driver 所創建的瀏覽器driver
timeout 最長時間長度(默認單位:秒)
poll_frequency 間隔檢測時長(每)默認0.5秒
ignored_exceptions  方法調用中忽略的異常,默認只拋出:找不到元素的異常
2.4 until / until_not
直到調用的方法返回值為True

until(method, message='')

method:expected_conditions庫中定義的方法
message :自定義報錯信息
直到調用的方法返回值為False

until_not(method, message='')

method:expected_conditions庫中定義的方法
message :自定義報錯信息
2.5 expected_conditions庫中的方法

1.title_is:判斷當前頁面的title是否完全等於預期字符串,返回布爾值

 
         

2.title_contains:判斷當前頁面的title是否包含預期字符串,返回布爾值

 
         

3.presence_of_element_located:判斷某個元素是否被加到dom樹下,不代表該元素一定可見

 
         

4.visibility_of_element_located:判斷某個元素是否可見,可見代表元素非隱藏,並且元素的寬和高都不為0

 
         

5.visibility_of:跟上面的方法是一樣的,只是上面需要傳入locator,這個方法直接傳定位到的element就好

 
         

6.presence_of_all_elements_located:判斷是否至少一個元素存在於dom樹中,舉個例子,如果頁面上有n個元素的class都是'coumn-md-3',name只要有一個元素存在,這個方法就返回True

 
         

7.text_to_be_present_in_element:判斷某個元素中的text文本是否包含預期字符串

 
         

8.text_to_be_present_in_element_value:判斷某個元素中的value屬性值是否包含了預期字符串

 
         

9.frame_to_be_availabe_and_switch_to_it:判斷該frame是否可以switch進去,如果可以,則返回True並且switch進去,否則返回False

 
         

10.invisibility_of_element_located:判斷某個元素是否不存在於dom樹或不可見

 
         

11.element_to_be_clickable:判斷某個元素是見並且是enable(有效)的,這樣的話才叫clickable

 
         

12.staleness_of:等某個元素從dom樹下移除,返回True或False

 
         

13.element_to_be_selected:判斷某個元素是否被選中,一般用於select下拉表

 
         

14.element_selection_state_to_be:判斷某個元素的選中狀態是否符合預期

 
         

15.element_located_selection_state_to_be:跟上面的方法一樣,只是上面的方法傳入定位到的element,這個方法傳入locator

 
         

16.alert_is_present:判斷頁面上是會否存在alert

 
三、實例展示:全局設置元素定位超時時間 全局設置只需要一行代碼,這里為了演示,分別在設置前和設置后分別定位一次元素,元素本身不存在,用來模擬網絡波動導致尚未加載出來的狀態;然后統計這兩次定位所需的時間,發現直接定位只有一次,如果找不到就直接拋出異常了,設置定位超時時間后,在這個時間段內會一直來查找元素。 

from selenium import webdriver import datetime
driver
= webdriver.Chrome()
driver.get(
"https://tieba.baidu.com")

# 未定義全局等待時,直接定位元素
start1 = datetime.datetime.now()
try:
# 使用一個不存在的元素,模擬還沒有加載出來的狀態
driver.find_element_by_css_selector("aaaa[title = '娛樂明星']").click()
except:
  print("沒有定位到元素") end1 = datetime.datetime.now()
  print("設置前等待時間: %s 秒" % (end1-start1).total_seconds())
# 設置全局等待后,再進行定位元素
driver.implicitly_wait(10) start2 = datetime.datetime.now()
try:
  driver.find_element_by_css_selector(
"aaaa[title = '娛樂明星']").click()
except:
  print("沒有定位到元素") end2 = datetime.datetime.now()
  print("設置后等待時間: %s 秒" % (end2-start2).total_seconds())

運行結果: 沒有定位到元素 設置前等待時間:
0.015992 秒 沒有定位到元素 設置后等待時間: 10.045907
四、實例展示:WebDriverWait返回類型以及拋出異常
這里主要展示下WebDriverWait中,大部分的返回類型是True\False,部分方法,
例如presence_of_element_located返回類型為一個元素,我們可以定位元素之后,直接對返回的元素進行click、send_keys等操作。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as Expect
driver
= webdriver.Chrome() driver.get("https://tieba.baidu.com")
# 部分關於元素定位的判斷返回類型為:元素
assert_ele = WebDriverWait(driver, 15, 0.5).until(Expect.presence_of_element_located(("id", "wd1"))) assert_ele.send_keys("測試") print("返回類型 %s" % assert_ele)
# 大部分方法返回類型為True\False assert_judge = WebDriverWait(driver, 15, 0.5).until_not(Expect.title_is("網易"))
print("返回類型 %s" % assert_judge)
# 判斷失敗后會報錯 assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("網易"), "錯誤信息:網頁標題不是網易")
運行結果:
返回類型
<selenium.webdriver.remote.webelement.WebElement (session="961ec35d6f354c9b5ca65a80cd096104", element="0.5643114406724057-1")>
返回類型 False Traceback (most recent call last): File
"D:/1git/cenpur_uitest/test_case/demo.py", line 17,
in <module> assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("網易"), "錯誤信息:網頁標題不是網易")
File
"C:\Users\test\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\support\wait.py", line 80,
in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
原文鏈接:https://blog.csdn.net/CCGGAAG/article/details/86763952

 

 

————————————————
轉載原文鏈接:https://blog.csdn.net/CCGGAAG/article/details/86763952


免責聲明!

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



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