selenium WebDriverWait類等待機(jī)制的實(shí)現(xiàn)
在自動(dòng)化測(cè)試腳本的運(yùn)行過(guò)程中,可以通過(guò)設(shè)置等待的方式來(lái)避免由于網(wǎng)絡(luò)延遲或?yàn)g覽器卡頓導(dǎo)致的偶然失敗,常用的等待方式有三種:
一、固定等待(time)
固定待是利用python語(yǔ)言自帶的time庫(kù)中的sleep()方法,固定等待幾秒。這種方式會(huì)導(dǎo)致這個(gè)腳本運(yùn)行時(shí)間過(guò)長(zhǎng),不到萬(wàn)不得已盡可能少用。(注:腳本調(diào)試過(guò)程時(shí),還是可以使用的,方便快捷)
from selenium import webdriver import time #驅(qū)動(dòng)瀏覽器 driver = webdriver.Chrome() #設(shè)置窗口最大化 driver.maximize_window() driver.get('https://www.baidu.com/') #設(shè)置固定等待 time.sleep(2) driver.quit()
二、隱式等待(implicitly_wait())
webdriver類提供了implicitly_wait()方法來(lái)配置超時(shí)時(shí)間。隱式等待表示在自動(dòng)化實(shí)施過(guò)程中,為查找頁(yè)面元素或者執(zhí)行命令設(shè)置一個(gè)最長(zhǎng)等待時(shí)間。如果在規(guī)定時(shí)間內(nèi)頁(yè)面元素被找到或者命令被執(zhí)行完成,則執(zhí)行下一步,否則繼續(xù)等待直到設(shè)置的最長(zhǎng)等待時(shí)間截止
from selenium import webdriver #驅(qū)動(dòng)瀏覽器 driver = webdriver.Chrome() #設(shè)置隱式等待 driver.implicitly_wait(30) #設(shè)置窗口最大化 driver.maximize_window() driver.get('https://www.baidu.com/')
注:隱式等待的好處是不用像固定等待方法一樣死等時(shí)間N秒,可以在一定程度上提升測(cè)試用例的執(zhí)行效率。不過(guò)這種方法也存在一定的弊端,那就是程序會(huì)一直等待整個(gè)頁(yè)面加載完成,也就是說(shuō)瀏覽器窗口標(biāo)簽欄中不再出現(xiàn)轉(zhuǎn)動(dòng)的小圓圈,才會(huì)繼續(xù)執(zhí)行下一步。
三、顯式等待(WebDriverWait)
顯示等待會(huì)每個(gè)一段時(shí)間(該時(shí)間一般都很短,默認(rèn)為0.5秒,也可以自定義),執(zhí)行自定義的程序判斷條件,如果判斷條件成立,就執(zhí)行下一步,否則繼續(xù)等待,直到超過(guò)設(shè)定的最長(zhǎng)等待時(shí)間,然后拋出TimeOutEcpection的異常信息。
alert_is_present():判斷頁(yè)面是否出現(xiàn)alert框
# coding:utf-8 from selenium import webdriver #導(dǎo)入By類 from selenium.webdriver.common.by import By #導(dǎo)入顯示等待類 from selenium.webdriver.support.ui import WebDriverWait #導(dǎo)入期望場(chǎng)景類 from selenium.webdriver.support import expected_conditions driver = webdriver.Chrome() #alert_is_present():判斷頁(yè)面是否出現(xiàn)alert框 result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present()) print(result.text)
element_located_selection_state_to_be(locator,state):判斷一個(gè)元素的狀態(tài)是否是給定的選擇狀態(tài)
第一個(gè)傳入?yún)?shù)是一個(gè)定位器,定位器是一個(gè)元組(by,path);第二個(gè)傳入?yún)?shù)表示期望的元素狀態(tài),True表示選中狀態(tài),F(xiàn)lase表示未選中
#element_located_selection_state_to_be():判斷一個(gè)元素的狀態(tài)是否是給定的選擇狀態(tài) result=WebDriverWait(driver,10).until(expected_conditions.element_located_selection_state_to_be((By.ID,'kw'),True))
element_selection_state_to_be(driverObject,state):判斷給定的元素是否被選中
第一個(gè)傳入?yún)?shù)是一個(gè)webdriver對(duì)象,第二個(gè)參數(shù)是期望的元素的狀態(tài),True表示選中狀態(tài),F(xiàn)lase表示未選中
#element_selection_state_to_be():判斷給定的元素是否被選中 result=WebDriverWait(driver,10).until(expected_conditions.element_selection_state_to_be((driver.find_element_by_id('kw')),True))
element_located_to_be_selected(locator):期望某個(gè)元素處于被選中狀態(tài)
參數(shù)傳入的是一個(gè)定位器
#element_located_to_be_selected():期望某個(gè)元素處于被選中狀態(tài) result=WebDriverWait(driver,10).until(expected_conditions.element_located_to_be_selected((By.ID,'kw')))
element_to_be_selected():期望某個(gè)元素處于選中狀態(tài)
傳入?yún)?shù)是一個(gè)webdriver實(shí)例對(duì)象
#element_to_be_selected():期望某個(gè)元素處于選中狀態(tài) result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_selected(driver.find_element_by_id('kw')))
element_to_be_clickable():判斷元素是否可見并且能被單擊,條件滿足返回頁(yè)面元素對(duì)象,否則返回Flase
#element_to_be_clickable():判斷元素是否可見并且能被單擊,條件滿足返回頁(yè)面元素對(duì)象,否則返回Flase result=WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(driver.find_element_by_id('hh')))
frame_to_be_available_and_switch_to_it(parm):判斷frame是否可用
如果可用返回True并切入到該frame,參數(shù)parm可以是定位器locator(by,path)組成的元組,或者定位方式:id、name、index(frame在頁(yè)面上索引號(hào)),或者webelement對(duì)象。
#frame_to_be_available_and_switch_to_it():判斷frame是否可用 #傳入ID值‘kk' result1=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(By.ID,'kw')) #傳入frame的webelement對(duì)象 result2=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_id('kw'))) #傳入frame在頁(yè)面中索引號(hào) result3=WebDriverWait(driver,10,0.2).until(EC.frame_to_be_available_and_switch_to_it(1))
invisibility_of_element_located(locator):希望某個(gè)元素不可見或者不存在DOM中
滿足條件返回True,否則返回定位到的元素對(duì)象
#invisibility_of_element_located():希望某個(gè)元素不可見或者不存在DOM中,滿足條件返回True,否則返回定位到的元素對(duì)象 result8=WebDriverWait(driver,10,0.2).until(EC.invisibility_of_element_located(By.ID,'kw'))
visibility_of_element_located(locator):希望某個(gè)元素出現(xiàn)在DOM中并且可見
滿足條件返回該元素的頁(yè)面元素對(duì)象
#visibility_of_element_located():希望某個(gè)元素出現(xiàn)在DOM中并且可見,滿足條件返回該元素的頁(yè)面元素對(duì)象 result9=WebDriverWait(driver,10,0.2).until(EC.visibility_of_element_located(driver.find_element_by_id('kw')))
visibility_of(webelement):希望某個(gè)元素出現(xiàn)在頁(yè)面的DOM中,并且可見,滿足條件返回該元素的頁(yè)面元素對(duì)象
#visibility_of():希望某個(gè)元素出現(xiàn)在頁(yè)面的DOM中,并且可見,滿足條件返回該元素的頁(yè)面元素對(duì)象 result10=WebDriverWait(driver,10,0.2).until(EC.visibility_of(driver.find_element_by_id('kw'))
visibility_of_any_elements_located(locator):希望某個(gè)元素出現(xiàn)在DOM中并且可見
如果滿足條件返回該元素的頁(yè)面元素對(duì)象
#visibility_of_any_elements_located():希望某個(gè)元素出現(xiàn)在DOM中并且可見 result11=WebDriverWait(driver,10,0.2).until(EC.visibility_of(By.TAG_NAME,'input'))
presence_of_all_elements_located(locator):判斷頁(yè)面至少有一個(gè)如果元素出現(xiàn),如果滿足條件,返回所有滿足定位表達(dá)式的頁(yè)面元素
#presence_of_all_elements_located():判斷頁(yè)面至少有一個(gè)如果元素出現(xiàn),如果滿足條件,返回所有滿足定位表達(dá)式的壓面元素 result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_all_elements_located(By.ID,'kw'))
presence_of_element_located(locator):判斷某個(gè)元素是否存在DOM中,不一定可見,存在返回該元素對(duì)象
#presence_of_element_located():判斷某個(gè)元素是否存在DOM中,不一定可見,存在返回該元素對(duì)象 result12=WebDriverWait(driver,10,0.2).until(EC.presence_of_element_located(By.ID,'kw'))
staleness_of(webelement):判斷一個(gè)元素是否仍在DOM中,如果在規(guī)定時(shí)間內(nèi)已經(jīng)移除返回True,否則返回Flase
#staleness_of():判斷一個(gè)元素是否仍在DOM中,如果在規(guī)定時(shí)間內(nèi)已經(jīng)移除返回True,否則返回Flase result13=WebDriverWait(driver,10,0.2).until(EC.staleness_of(driver.find_element_by_id('kw')))
text_to_be_present_in_element():判斷文本內(nèi)容test是否出現(xiàn)在某個(gè)元素中,判斷的是元素的text
#text_to_be_present_in_element():判斷文本內(nèi)容test是否出現(xiàn)在某個(gè)元素中,判斷的是元素的text result15=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element(By.TAG_NAME,"p"))
text_to_be_present_in_element_value():判斷text是否出現(xiàn)在元素的value屬性值中
#text_to_be_present_in_element_value():判斷text是否出現(xiàn)在元素的value屬性值中 result16=WebDriverWait(driver,10,0.2).until(EC.text_to_be_present_in_element_value((By.ID,'kw'),'隨便'))
title_contains():判斷頁(yè)面title標(biāo)簽的內(nèi)容包含partial_title,只需要部分匹配即可
#title_contains():判斷頁(yè)面title標(biāo)簽的內(nèi)容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase result17=WebDriverWait(driver,10,0.2).until(EC.title_contains("你就知道"))
title_is():判斷頁(yè)面title內(nèi)容是與傳入的title_text內(nèi)容完全匹配
#title_is():判斷頁(yè)面title內(nèi)容是與傳入的title_text內(nèi)容完全匹配,匹配返回True,否則返回Flase result18=WebDriverWait(driver,10,0.2).until(EC.title_is("百度一下,你就知道"))
到此這篇關(guān)于selenium WebDriverWait類等待機(jī)制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)selenium WebDriverWait內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中還原JavaScript的escape函數(shù)編碼后字符串的方法
這篇文章主要介紹了Python中解析JavaScript的escape函數(shù)編碼后字符串的方法,即Python中如何還原JavaScript escape函數(shù)編碼后的字符串,需要的朋友可以參考下2014-08-08Python OpenCV 針對(duì)圖像細(xì)節(jié)的不同操作技巧
這篇文章主要介紹了Python OpenCV 針對(duì)圖像細(xì)節(jié)的不同操作,包括圖像像素的說(shuō)明,圖像屬性信息的獲取與修改以及圖像通道的知識(shí)(包括拆分通道和合并通道),需要的朋友可以參考下2021-08-08運(yùn)籌學(xué)-Python實(shí)現(xiàn)圖論與最短距離
需要求解任意兩個(gè)節(jié)點(diǎn)之間的最短距離,使用?Floyd?算法,只要求解單源最短路徑問(wèn)題,有負(fù)權(quán)邊時(shí)使用?Bellman-Ford?算法,沒(méi)有負(fù)權(quán)邊時(shí)使用?Dijkstra?算法,本節(jié)我們只討論Dijkstra?算法,需要的朋友可以參考一下2022-01-01Python使用Selenium WebDriver的入門介紹及安裝教程(最新推薦)
這篇文章主要介紹了Python使用Selenium WebDriver的入門介紹及安裝教程,本文使用環(huán)境為python3.11+win10 64位+firefox瀏覽器,所以本文使用的瀏覽器驅(qū)動(dòng)是Firefox的geckodriver ,如果你使用的是其他瀏覽器,那么選擇自己對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)程序即可,需要的朋友可以參考下2023-04-04