細說 selenium 的等待條件
selenium 的顯示等待
在進行 UI 自動化測試的時候,我們為了保持用例的穩定性,往往要設定顯示等待,顯示等待就是說明確的要等到某個元素的出現或者元素的某些條件出現,比如可點選、可見等條件,如果在規定的時間之內都沒有找到,那麼就會丟擲Exception
.
上面是我用selenium
寫的一個測試用例,展示了selenium
中顯示等待的使用方式,其中會使用到expected_conditions
模組和WebDriverWait
類,注意這裡expected_conditions
是一個 py 檔案的檔名,也就是一個模組名,這個模組下面有很多的條件類,而我們用例中使用的title_is
就是一個條件類。
WebDriverWait
是一個類,這個類的作用就是根據一定的條件,不斷的檢查這個條件是否被滿足了。WebDriverWait
類只有兩個方法,一個是until
直到滿足某個條件,另一個是until_not
直到不滿足某個條件。
class WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
WebDriverWait
有四個引數分別是,driver
驅動, timeout
超時時間, poll_frequency=POLL_FREQUENCY
輪訓時間,也就是去判斷條件是否滿足的時間間隔,預設是 0.5 秒, ignored_exceptions=None
在等待的過程中需要忽略的異常,是一個可迭代的異常類集合,比如我們可以設定一個 list,裡面是[NoSuchElementException,NoSuchAttributeException,InvalidElementStateException....]
,預設情況下,是一個元組,只包含一個NoSuchElementException
,因為只有元素出現,才能去判斷條件是否滿足,在不斷輪訓的過程中,肯定會發生NoSuchElementException
,這個時候必須忽略掉這個異常,不然程式就會中斷。
其中driver
和timeout
是必傳的位置引數,另外兩個是選擇傳遞的關鍵字引數,如果不傳都有指定的預設值。
下面就進入我們今天的主題,selenium 中的等待條件的討論
等待條件
條件類的實現原理
在selenium.webdriver.support.expected_conditions
這個模組裡,存放著所有的等待條件,每個條件類的結構都是一樣的一個__init__
構造方法和一個__call__
方法。
在 python 中,如果想把型別的物件當做函式來使用,那麼就可以給這個類實現__call__
方法,如下:
class TestCase:
def __init__(self):
self.driver = webdriver.Chrome(executable_path="./driver/chromedriver")
self.driver.get('http://www.baidu.com')
# sleep(2)
def __call__(self):
print(self.driver.title)
if __name__ == '__main__':
case = TestCase()
case()
case()
物件的呼叫,就會執行__call__
方法裡面的邏輯列印當前頁面的標題,我們取一個 selenium 的實現類:
class presence_of_element_located(object):
def __init__(self, locator):
self.locator = locator
def __call__(self, driver):
return _find_element(driver, self.locator)
這個條件類的意思是判斷一個元素是否已經渲染到頁面當中,在使用這個條件的時候需要先例項化,傳入元素的定位,然後要進行判斷的時候需要對例項物件進行呼叫並傳入driver
,對例項物件進行呼叫的時候就會執行__call__
方法裡的條件判斷邏輯。
WebDriverWait
是如何進行條件判斷的
再回到文章開頭看一下我們使用顯示等待的程式碼:
wait = WebDriverWait(self.driver, 2)
wait.until(EC.title_is('百度一下,你就知道'))
先是例項化一個WebDriverWait
物件,然後再呼叫until
方法並且傳遞一個條件的例項物件,until
方法裡就會不斷的去輪訓條件是否滿足。
def until(self, method, message=''):
screen = None
stacktrace = None
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
method
這個引數就是我們傳遞進來的條件的例項物件,value = method(self._driver)
這裡就是進行物件的呼叫,也就是執行了__call__
方法裡的邏輯。
selenium 裡都有哪些條件
- title_is 判斷 title 是否出現
- title_contains 判斷 title 頁面標題是否包含某些字元
- presence_of_element_located 判斷某個元素是否被載入到了 dom 樹裡,但是並不代表這個元素可見
- url_contains 判斷當前 url 是否包含某個 url
- url_matches 判斷當前 url 是否符合某種格式
- url_to_be 判斷當前 url 是否出現
- url_changes 判斷當前 url 是否已經發生了變化
- visibility_of_element_located 判斷某個元素是否被新增到了 dom 樹裡,且寬高都大於 0
- visibility_of 判斷看某個元素是否可見
- presence_of_all_elements_located 判斷至少有一個元素存在於 dom 樹中,返回所有定位到的元素
- visibility_of_any_elements_located 判斷至少有一個元素在頁面中可見
- visibility_of_all_elements_located 判斷是否所有元素都在頁面中可見
- text_to_be_present_in_element 判斷指定的元素中是否包含了預期的字串
- text_to_be_present_in_element_value 判斷指定的元素屬性值中是否包含了預期的字串
- frame_to_be_available_and_switch_to_it 判斷 iframe 是否可以 switch 進去
- invisibility_of_element_located 判斷某個元素是否在 dom 中不可見
- element_to_be_clickable 判斷某個元素是否可見並且是 enable 的,也就是說是是否可以點選
- staleness_of 等待某個元素從 dom 中刪除
- element_to_be_selected 判斷某個元素是否被選中了,一般用於下拉選單中
- element_located_to_be_selected 與上面的意思一樣,只不過上面例項化的時候傳入的是元素物件,這個傳入的是定位
- element_selection_state_to_be 判斷某個元素的選中狀態是否符合預期
- element_located_selection_state_to_be 與上面一樣,只不過傳值不同而已
- number_of_windows_to_be 判斷當前視窗數是否等於預期
- new_window_is_opened 判斷是否有視窗增加
- alert_is_present 判斷頁面是否有彈窗
以上就是 selenium 支援的所有條件。
然後就是自定義了
說了那麼多條件,其實我們也可以自己實現一個條件類,
class page_is_load:
def __init__(self, expected_title, expected_url):
self.expected_title = expected_title
self.expected_url = expected_url
def __call__(self, driver):
is_title_correct = driver.title == self.expected_title
is_url_correct = driver.current_url == self.expected_url
return is_title_correct and is_url_correct
上面是自己實現的一個條件類,根據頁面的 url 和標題來判斷頁面是否被正確載入,
class TestCase:
def __init__(self):
self.driver = webdriver.Chrome(executable_path="./driver/chromedriver")
self.driver.get('http://www.baidu.com/')
# sleep(2)
def __call__(self):
print(self.driver.title)
def test_wait(self):
wait = WebDriverWait(self.driver, 2)
wait.until(page_is_load("百度一下,你就知道", "http://www.baidu.com/"))
歡迎大家去 我的部落格 瞅瞅
相關文章
- 細說selenium的等待條件
- Selenium等待條件
- Selenium的等待操作
- Python_Selenium的等待操作Python
- Selenium等待事件Waits事件AI
- selenium隱式等待
- 【selenium】強制等待,隱式等待,顯式等待
- Selenium 隱式等待與顯示等待的選擇
- Selenium裡的三種等待方式
- selenium中的三種等待方式
- selenium(7)強制等待,顯式等待和隱式等待。
- 『心善淵』Selenium3.0基礎 — 23、Selenium的元素等待
- selenium-三種等待方式
- 一定要會用selenium的等待,3種等待方式解讀
- python selenium的三種等待方式解讀Python
- Python selenium 三種等待元素方式Python
- 【TcaplusDB知識庫】條件過濾說明與更新
- 「譯」編寫更好的 JavaScript 條件式和匹配條件的技巧JavaScript
- Web自動化測試 五 ----- selenium的等待和切換Web
- Python Selenium等待(waits)頁面載入完成的三種方法PythonAI
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(三)條件變數AQS原始碼變數
- 條件渲染
- Selenium的安裝與Firefox配置以及Selenium基本用法(超詳細)Firefox
- “交叉引用”的條件格式
- drools中的條件 when
- ReentrantLock的條件佇列ReentrantLock佇列
- 談談raft fig8 —— 迷惑的提交條件和選舉條件Raft
- doxygen 宏定義/宏編譯/條件編譯/預處理/預編譯 不處理、忽略條件、分析所有條件、滿足所有條件的方法編譯
- selenium+python 操作滾動條Python
- Python Selenium自動化測試框架 元素等待機制Python框架
- If條件倒裝
- 條件函式函式
- 屈服條件8
- openGauss 前提條件
- 條件語句
- Excel 條件格式Excel
- PL/SQL 條件SQL
- react 條件渲染React