引言:
在做UI自動化的過程中,我們有時候為了等待元素的出現,需要加一些等待時間來幫助,但是有時候時間加的過多或者過少,這個沒有辦法判斷,今天就介紹幾種等待時間,我們看看那種適合我們

一、強制等待
看到名稱就應該知道,強制等待,就是設置多少秒,就必須等待多少秒,才能繼續往下面操作
time.sleep()
def sleep(seconds): # real signature unknown; restored from __doc__
"""
sleep(seconds)
延遲指定的秒數
"""
pass
使用方法
# 直接在需要等待的地方添加 time.sleep(10)
二、隱式等待
隱式等待: implicitly_wait?() 默認參數的單位為妙,設置一個等待時間,它并不影響腳本的執行速度。當腳本執行到某個元素定位是,如果元素可以定位,則繼續執行,如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設在第六秒定位到了元素則繼續執行,若直到超出設置的時長10秒還沒有定位到元素,則拋出異常。

def implicitly_wait(self, time_to_wait):
"""
Sets a sticky timeout to implicitly wait for an element to be found,
or a command to complete. This method only needs to be called one
time per session. To set the timeout for calls to
execute_async_script, see set_script_timeout.
:Args:
- time_to_wait: Amount of time to wait (in seconds)
:Usage:
driver.implicitly_wait(30)
"""
if self.w3c:
self.execute(Command.SET_TIMEOUTS, {
'implicit': int(float(time_to_wait) * 1000)})
else:
self.execute(Command.IMPLICIT_WAIT, {
'ms': float(time_to_wait) * 1000})
使用方法:
# 在需要等待的地方直接添加 driver.implicitly_wait(10)
三、Activity等待
Activity等待: app特有一種等待,通過Activity的出現來幫助我們進行判斷是否到達這個頁面然后進行一系列的操作 ,通過wait_activity 進行判斷

def wait_activity(self, activity, timeout, interval=1):
"""等待一個activity,直到在規定時間內activity出現
This is an Android-only method.
:Args:
- activity - target activity
- timeout - max wait time, in seconds
- interval - sleep interval between retries, in seconds
"""
try:
WebDriverWait(self, timeout, interval).until(
lambda d: d.current_activity == activity)
return True
except TimeoutException:
return False
使用方法:
直接在需要等待元素出現的地方添加
# 添加activity,后面加上等待的時間,超過時間就報錯 driver.wait_activity('com.ali.user.mobile.login.ui.UserLoginActivity',30)

四、顯示等待
顯示等待本來準備等到寫selenium教程的時候在介紹,感覺后面會用,這里就直接給大家進行介紹了。 如果對軟件測試、接口測試、自動化測試、面試經驗交流。感興趣可以加測試交流群,還會有同行一起技術交流。

先看源碼:
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
"""
driver: 返回一個webdriver實例化
timeout:設置一個超時時長(S)
poll_frequency:循環讀取元素的時間,默認是0.5(s)
使用方法 :
from selenium.webdriver.support.ui import WebDriverWait n
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) n
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)). n
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
"""
self._driver = driver
self._timeout = timeout
self._poll = poll_frequency
# avoid the divide by zero
if self._poll == 0:
self._poll = POLL_FREQUENCY
exceptions = list(IGNORED_EXCEPTIONS)
if ignored_exceptions is not None:
try:
exceptions.extend(iter(ignored_exceptions))
except TypeError: # ignored_exceptions is not iterable
exceptions.append(ignored_exceptions)
self._ignored_exceptions = tuple(exceptions)
從源碼中分許出來三個參數的作用
driver:返回一個webdriver實例化
timeout:設置一個超時時長
poll_frequentcy:循環讀取元素時間

使用方法:
# 導入方法 from selenium.webdriver.support.ui import WebDriverWait element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))