1. 程式人生 > 其它 >python+selenium 自動化測試——顯式等待詳解

python+selenium 自動化測試——顯式等待詳解

1.前言

之前有提到過等待函式,等待函式分為:強制等待(sleep)、隱式等待(implicitly_wait),顯示等待(WebDriverWait),這次以顯示等待方式專門做一次總結,因為我個人是比較喜歡用這種等待方式。

2.顯式等待

顯示等待:指定一個等待條件(元素),在一定時間間隔內檢測一次元素,程式會判斷在等待時間內條件是否滿足條件,如果滿足則執行下一步,如果不滿足會繼續等待,超過時間就會丟擲異常

#coding=utf-8
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

browser = webdriver.Firefox()
browser.get('https://www.xx.com/')
user = wait.until(EC.presence_of_element_located((By.ID, 'user')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search')))
print(user, button)

3.顯示等待函式

3.1 顯示等待函式應用一

WebDriverWai()一般由 unit()或 until_not()方法配合使用

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Firefox()
driver.get("https://www.xx.com")
#檢測元素id:someId出現為止,表示:10秒內每隔0.5毫秒掃描1次頁面變化,直到找到指定的元素
WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("someId"))
#檢測元素id:someId不再出現為止,表示:10秒內每隔0.5毫秒掃描1次頁面變化,直到找不到指定的元素
WebDriverWait(driver, 10).until_not(lambda driver:driver.find_element_by_id("someId"))


3.2 顯示等待函式應用二

通常使用WebDriverWait時,我們還會使用到EC即expected_condition,這裡展示了顯示等待的幾種函式之間的區別

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

#開啟谷歌瀏覽器
driver = webdriver.Chore()
#當隱式等待、顯示等待都存在時,超時時間取兩者較大者的時間 
driver.implicitly_wait(6)
#開啟網址
driver.get("http://www.xx.com")
#判斷標題是否為zn,返回布林值
WebDriverWait(driver,10).until(EC.title_is("zn"))

#判斷標題是否包含zn,返回布林值
WebDriverWait(driver,10).until(EC.title_contains("zn"))

#判斷某個元素是否被加到了dom樹裡,但並不代表該元素一定可見
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))

#判斷某個元素是否可見,並傳入定位元組locator,且寬和高都大於0
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))

#判斷元素是否可見,跟visibility_of_element_located有點類似,只是這個方法要傳定位到的element
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))

#判斷是否至少有1個元素存在於dom樹中,如果存在至少一個就返回列表
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.zn')))

#判斷某個元素中的text屬性是否包含了預期的字串
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'修改'))

#判斷某個元素中的value屬性是否包含了預期的字串
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#s'),u'查詢'))

#判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'kw')))

#判斷某個元素在是否存在於dom或不可見,如果可見返回False,不可見返回這個元素
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#Wrap')))

#判斷某個元素中是否可見並且是enable的,代表可被點選,只有這樣才能被clickable
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='ur']/div[1]/a[1]"))).click()

#等待某個元素從dom樹中移除,注意,這個方法也是返回True或False
WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'u')))

#判斷某個元素是否被選中了,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='ur']/option[2]")))

#判斷某個元素的選中狀態是否符合預期,這裡是傳入的是element
WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='ur']/option[1]"),True))

#判斷某個元素的選中狀態是否符合預期,這裡傳入的是locator
WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='ur']/option[1]"),True))

#判斷頁面上是否存在alert,如果有alert,就切換到alert並返回alert的內容
instance = WebDriverWait(driver,10).until(EC.alert_is_present())

#接受alert的內容
instance.accept()

#關閉瀏覽器
driver.close()

總結:

顯示等待的好處就是隻需要定位的元素載入完成就能夠進行下一步操作,無需全部元素全部載入完成。不僅如此,它還擁有很多定位元素的函式支援,所以我還是比較推薦大家使用這種等待方式。