python time智能等待_Python Selenium智能等待
前言
在使用python selenium進(jìn)行自動(dòng)化測(cè)試實(shí)踐的過(guò)程中,經(jīng)常會(huì)遇到元素定位不到,彈出框定位不到等等各種定位不到的情況,在大多數(shù)的情況下,無(wú)非是以下兩種情況:
1、有frame存在,定位前,未switch到對(duì)應(yīng)的frame內(nèi)
2、元素未加載完畢(從界面看已經(jīng)顯示),但DOM樹(shù)還在load狀態(tài)或在加載js
那對(duì)于這類情況,怎么解決呢?
通俗的講法: 等待。
高大上點(diǎn):解決自動(dòng)化測(cè)試代碼與瀏覽器加載渲染之間的同步問(wèn)題。
下面我們分段講述各種處理方式:
一 強(qiáng)制等待
這種方式簡(jiǎn)單粗暴直接有效,不足的地方就是不夠靈活。下面看下代碼片段:
#_*_ coding:utf-8 _*_
__author__ = '苦葉子'
from selenium import webdriver
from time import sleep?? # 注意
if __name__ == '__main__':
driver = webdrivrer.Firefox()
driver.get('http://www.testingunion.com')
sleep(3)??? # 強(qiáng)制等待3s在執(zhí)行下一步
print u"當(dāng)前url:? ", driver.current
sleep(3)? ?#強(qiáng)制等待3s在執(zhí)行下一步
driver.quit()
注: 請(qǐng)注意加粗有刪除線的代碼行,用于實(shí)現(xiàn)強(qiáng)制等待
二、隱性等待
webdriver提供了基礎(chǔ)的同步方法,隱性等待implicitly_wait(xx),該方式的意義是:不論業(yè)務(wù)代碼運(yùn)行在那一步,都需要等待webdriver? xx秒,如果在等待的xx秒內(nèi) webdriver完成了對(duì)應(yīng)的動(dòng)作,則業(yè)務(wù)代碼和webdriver都正常繼續(xù)執(zhí)行;如果超過(guò)了xx秒,webdriver還未完成對(duì)應(yīng)的動(dòng)作,則業(yè)務(wù)代碼繼續(xù)執(zhí)行,而webdriver則會(huì)拋出異常(例如timeout或元素未找到等等異常),請(qǐng)看代碼實(shí)現(xiàn)片段:
#_*_ coding:utf-8 _*_
__author__ = '苦葉子'
from selenium import webdriver
if __name__ == '__main__':
driver = webdrivrer.Firefox()
driver.implicitly_wait(30)?? # 隱性等待,最長(zhǎng)等30s
driver.get('http://www.testingunion.com')
print u"當(dāng)前url: ", driver.current_url
driver.quit()
注:上述代碼中加粗刪除線的代碼通過(guò)調(diào)用webdriver提供的標(biāo)準(zhǔn)隱性等待方式來(lái)實(shí)現(xiàn)一種同步機(jī)制。其設(shè)置的是一個(gè)最長(zhǎng)等待時(shí)間,如果在規(guī)定的時(shí)間未完成,則進(jìn)入下一步。
不足:在實(shí)踐中,通常我們需要操作的元素已經(jīng)顯示出來(lái),但因網(wǎng)絡(luò)或其他因素,瀏覽器一直處于加載個(gè)別js或圖片或其他資源時(shí),隱性等待模式下,這時(shí)會(huì)依舊處于等待狀態(tài)直至頁(yè)面全部加載完畢才能進(jìn)入下一步。那有沒(méi)有更好的辦法呢?當(dāng)然是有的,請(qǐng)參見(jiàn)下一方式。
重要:隱性等待是全局性質(zhì)的,只需在driver實(shí)例化后,設(shè)置一次即可。
在實(shí)踐中,經(jīng)常見(jiàn)到新手把隱性等待當(dāng)做sleep來(lái)使用,在每個(gè)步驟后都用一次。
三、顯性等待
更為強(qiáng)大的方式是顯性等待來(lái)實(shí)現(xiàn)同步機(jī)制,需要WebDriverWait類,輔以u(píng)ntil()或until_not()方法,根據(jù)判斷條件進(jìn)行靈活的同步,它的主要機(jī)制是:程序在規(guī)定的時(shí)間內(nèi)每個(gè)xx秒看一下判斷條件是否成立,如果成立則執(zhí)行下一步,否則繼續(xù)等待,直至超過(guò)設(shè)置的最長(zhǎng)時(shí)間,然后拋出異常。請(qǐng)看具體的代碼片段:
#_*_ coding:utf-8 _*_
__author__ = '苦葉子'
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
if __name__ == '__main__':
driver = webdrivrer.Firefox()
# 隱性等待和顯性等待可以同時(shí)用,要注意的是:最大等待時(shí)間取決兩者之間的大值
driver.implicitly_wait(10)
driver.get('http://www.testingunion.com')
locator = (By.LINK_TEXT,? u'webdriver')
try:
# 在最長(zhǎng)20s內(nèi),每個(gè)0.5秒去檢查locator是否存在,如果存在則進(jìn)入下一步
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_located(locator))
# 提取該文本對(duì)應(yīng)的url,并打印出來(lái)
print driver.find_element_by_link_text(u'webdriver').get_attribute('href')
finally:
print u"異常了"
driver.quit()
在本示例中,我們?cè)O(shè)置了隱性等待和顯性等待,在其他的操作中隱性等待起決定性作用,在示例中的WebDriverWait設(shè)置了顯性等待的地方,則顯性等待起決定性作用,但要注意的是:最長(zhǎng)等待時(shí)間取決于兩者之間的大值,所以這里顯性等待的最長(zhǎng)時(shí)間為20s。
在這里我們主要用到了WebDriverWait類和expected_conditions模塊,讓我們近距離的接觸下它們。
WebDriverWait類
定義實(shí)現(xiàn)在wait模塊中,實(shí)現(xiàn)了webdriver的顯性等待機(jī)制,先看下它有哪些參數(shù)和方法:
selenium.webdriver.support.wait.WebDriverWait(類)
__init__(self,
driver,? # 傳入實(shí)例化的webdriver對(duì)象
timeout,? # 超時(shí)時(shí)間,等待的最大時(shí)間(需考慮同時(shí)考慮隱性等待時(shí)間)
poll_frequency=POLL_FREQUENCY,? # 調(diào)用until或until_not方法的間隔時(shí)間,上例為0.5s
ignored_exceptions=None? #指定忽略的異常,如果指定了要忽略的異常類型,則在調(diào)用until或until_not過(guò)程中,捕獲該類異常時(shí)不中斷代碼,繼續(xù)等待。默認(rèn)只有NoSuchElementException
)
until(self,
method,? ? # 在等待期間,每個(gè)一段時(shí)間調(diào)用這個(gè)傳入的方法,直到返回值為false
message='' # 如果超時(shí),則拋出TimeoutException,將message傳入給異常
)
until_not 與until相反,until是當(dāng)某個(gè)元素滿足某種條件時(shí)(出現(xiàn)、存在等等)繼續(xù)執(zhí)行;until_not則是當(dāng)某個(gè)元素不滿足某種條件時(shí)繼續(xù)執(zhí)行,參數(shù)含義相同
特別注意:
很多時(shí)候大家在使用until或until_not時(shí),會(huì)將一個(gè)WebElement對(duì)象傳入給method,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))???? # 這是錯(cuò)誤的用法
這里的參數(shù)一定要是可調(diào)用的,這個(gè)對(duì)象一定要有__call__()方法,否則會(huì)拋出異常:
TypeError: 'xxx' object is not callable
在這里,也可以用selenium2提供的expected_conditions模塊中提供的各種條件,也可用WebElement中的is_displayed(),is_selected(),is_enabled()方法或是自己封裝的方法均可。下面我們?cè)倏纯磗elenium提供了哪些條件,如圖所示:
結(jié)束語(yǔ)
本文就python selenium三種同步解決方式進(jìn)行了較為詳細(xì)的說(shuō)明,這是使用selenium進(jìn)行自動(dòng)化測(cè)試實(shí)踐的必備技能,希望對(duì)大家有所幫助。
總結(jié)
以上是生活随笔為你收集整理的python time智能等待_Python Selenium智能等待的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 数值变量_Java 中数值变量
- 下一篇: python网站框架下载_web.py首