在UI自動化的過程中,妳不可避免的會遇到加載問題,環境不穩定,網速慢。如果什麽都不做,會因為找不到元素而報錯。
還有壹種情況是頁面使用了ajax異步加載機制(現在是resetful,客戶端和服務器是分離的),不知道頁面什麽時候到的。這個時候我們會使用wait,在Selenium中,我們有三種等待,分別是固定等待、隱式等待和顯式等待。
時間.睡眠
固定等待,本質:讓當前線程休眠,本質是線程阻塞,通過等待來實現。
缺點:網絡條件好浪費時間,嚴重影響項目的性能。
好處:可以使用調試腳本。
隱式等待
隱式等待,本質上是:在腳本開始時設置壹個最大等待時間。如果網頁是在指定時間內加載的,則執行下壹步,否則可能會拋出異常。隱式等待是對整個驅動周期起作用的,剛開始的時候設置壹次就可以了,不要把它當成固定等待。
缺點:JavaScript通常加載在我們身體的末端。事實上,頁面的所有元素都已經加載了,但是我們仍然在等待所有頁面的加載。
WebDriverWait
顯式等待,本質:動態等待,判斷壹個元素是否已經出現,比如標題是叫百度還是百度搜索,根據壹些動態條件進行輪詢,它會不斷輪詢檢測條件是成功還是失敗,比如0.5s檢測壹次元素是成功還是失敗,同時設置輪詢的超時。
如果同時設置了顯式等待和隱式等待,就看誰設置的等待時間長,誰的超時等待時間長,誰就執行。
顯式等待
組件
從selenium . web driver . support . wait導入WebDriverWait
WebDriverWait的源代碼
#許可給軟件自由保護協會(SFC)
#或多個貢獻者許可協議。參見通知文件
#隨本書壹起分發,以獲取更多信息
#關於版權歸屬。SFC許可該文件
#根據Apache許可證2.0版(即
#“許可證”);除非符合規定,否則不得使用本文件
#帶著執照。您可以從以下網址獲得許可證的副本
#
# mon.exceptions導入NoSuchElementException
從selenium.common.exceptions導入超時異常
POLL_FREQUENCY = 0.5 #方法調用之間的睡眠時間
IGNORED _ EXCEPTIONS =(NoSuchElementException,)#調用方法時忽略的異常
類WebDriverWait(對象):
def __init__(自身,驅動程序,超時,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None):
" " "構造函數,采用WebDriver實例,超時以秒為單位。
:參數:
-驅動程序WebDriver的實例(即Firefox、Chrome或Remote)
- timeout -超時前的秒數
- poll_frequency -呼叫之間的睡眠間隔
默認情況下,它是0.5秒。
- ignored_exceptions -調用期間忽略的異常類的iterable結構。
默認情況下,它只包含NoSuchElementException。
示例:
從selenium.webdriver.support.ui導入WebDriverWait
element = WebDriverWait(驅動程序,10)。until(lambda x:x . find _ element _ by _ id(" someId "))
is _ impressed = web driver wait(driver,30,1,(ElementNotVisibleException))。
until _ not(lambda x:x . find _ element _ by _ id(" someId ")。is_displayed())
"""
自我。_driver =驅動程序
自我。_timeout =超時
自我。_ poll = poll _頻率
#避開零點
如果自我。_poll == 0:
自我。_ poll = POLL _頻率
異常=列表(IGNORED_EXCEPTIONS)
如果ignored_exceptions不為None:
嘗試:
exceptions . extend(ITER(ignored _ exceptions))
例外類型錯誤:# ignored_exceptions不可叠代
exceptions.append(忽略_異常)
自我。_ignored_exceptions = tuple(異常)
def __repr__(self):
返回“”。格式(
型(自我),自我。_driver.session_id)
def until(self,method,message= ' '):
" " "調用驅動程序提供的方法作為參數,直到
返回值不為假。"""
屏幕=無
stacktrace =無
end_time = time.time() + self。_超時
雖然正確:
嘗試:
價值=方法(自我。_驅動程序)
如果值:
返回值
除了自我。_ ignored _形式的異常:
screen = getattr(exc,' screen ',None)
stacktrace = getattr(exc,' stacktrace ',None)
time.sleep(自我。_poll)
if time . time()& gt;結束時間:
破裂
引發超時異常(消息、屏幕、堆棧跟蹤)
def until_not(self,method,message= ' '):
" " "調用驅動程序提供的方法作為參數,直到
返回值為假。"""
end_time = time.time() + self。_超時
雖然正確:
嘗試:
價值=方法(自我。_驅動程序)
如果不是值:
返回值
除了自我。_忽略_異常:
返回True
time.sleep(自我。_poll)
if time . time()& gt;結束時間:
破裂
引發超時異常(消息)
參數:
三種等待模式的示例
從selenium導入web驅動程序
從時間進入睡眠
從selenium . web driver . support . wait導入WebDriverWait
從selenium.webdriver.support導入預期條件作為EC
#三種等待方法
類測試用例(對象):
def __init__(self):
self.driver = webdriver。鉻合金()
self.driver.get(' ')
睡眠(2)
def test_sleep(自我):
self . driver . find _ element _ by _ id(' kw ')。send_keys("selenium ")
sleep(2) #線程在阻塞等待模式下的實現
self . driver . find _ element _ by _ id(' su ')。單擊()
睡眠(3)
self.driver.quit()
def time_implicitly(自身):
self . driver . implicitly _ wait(10)
self . driver . find _ element _ by _ id(' kw ')。send_keys("webdriver ")
self . driver . find _ element _ by _ id(' su ')。單擊()
#睡眠(2)
self.driver.quit()
定義時間_等待(自身):
wait = WebDriverWait(self.driver,2,0.5)
Wait.until(EC.title_is('百度壹下,妳就知道'))
self . driver . find _ element _ by _ id(' kw ')。send_keys("webdriver ")
self . driver . find _ element _ by _ id(' su ')。單擊()
睡眠(2)
self.driver.quit()
if __name__=="__main__ ":
案例=測試案例()
#案例.測試_睡眠()
# case.time_implicitly()
case.time_wait()