『心善淵』Selenium3.0基礎 — 24、Selenium的expected_conditions模組詳細介紹

繁華似錦Fighting發表於2021-07-14

提示:下文中expected_conditions模組有時簡稱為EC模組。

1、EC模組介紹

  1. expected_conditions是Selenium的一個模組,主要用於對頁面元素的載入進行判斷,包括元素是否存在,可點選等等。
  2. expected_conditions模組的使用場景一般有兩種:
    • 直接在斷言中使用 。
    • WebDriverWait配合使用,顯示等待頁面上元素出現或者消失。
  3. 一般情況下,我們在使用expected_conditions模組時,都會對其進行重新命名,通過as關鍵字對其重新命名為EC
    from selenium.webdriver.support import expected_conditions as EC
    

2、EC模組常用類

  1. title_is(title)方法:用於判斷網頁title是否是特定文字(英文區分大小寫),若完全相同則返回True,否則返回False。
  2. title_contains(title)方法:用於判斷網頁title是否包含特定文字(英文區分大小寫),若包含則返回True,不包含返回False。
  3. presence_of_element_located(locator)方法(重點,常用):用於判斷一個元素存在於頁面DOM樹中,存在則返回元素本身,不存在則報錯。
    locator為一個(by, path)元祖,這個(by, path)by是Selenium的一個類selenium.webdriver.common.by.By,包括CLASS_NAMECSS_SELECTORIDLINK_TEXT,NAMEPARTIAL_LINK_TEXTTAG_NAMEXPATH,和我們8種基本元素定位中使用的方法相同。
  4. presence_of_all_elements_located(locator)方法:用於判斷定位的元素範圍內,至少有一個元素存在於頁面當中,存在則以list形式返回元素本身,不存在則報錯。
  5. visibility_of_element_located(locator)方法:用於判斷特定元素是否存在於DOM樹中並且可見,可見意為元素的高和寬都大於0,元素存在返回元素本身,否則返回False。
    這個類和presence_of_element_located(locator)有點像,但後者只強調元素存在於DOM樹中,可見不可見無所謂,而前者要求必須高和寬必須都大於0,因此後者在效能上會稍微快一點點。
  6. visibility_of(element)方法:visibility_of(element)同上面visibility_of_element_located(locator),不過引數從locator的元組變為元素。
  7. invisibility_of_element_located(locator)方法:判斷元素是否隱藏。
  8. text_to_be_present_in_element(locator,text)方法:判斷給定文字是否出現在特定元素中,若存在則返回True,不存在返回False。
  9. text_to_be_present_in_element_value(locator,text)方法:判斷某文字是否是存在於特定元素的value值中,存在則返回True,不存在則返回False,對於檢視沒有value值的元素,也會返回False。
  10. frame_to_be_available_and_switch_to_it(locator)方法:判斷某個frame是否可以切換過去,若可以則切換到該frame,否則返回False 。
  11. element_to_be_clickable(locator)方法:判斷某元素是否可訪問並且可啟用,比如能夠點選,若可以則返回元素本身,否則返回False。
  12. staleness_of(element)方法:判斷某個元素是否不再附加於於DOM樹中,不再附加的話返回True,依舊存在返回False。可以用於判斷頁面是否重新整理了。
  13. alert_is_present方法:判斷alert是否存在,若存在則切換到alert,若不存在則返回False。
  14. element_to_be_selected(element)方法:判斷某元素是否被選中。
  15. element_located_to_be_selected(locator) 方法:判斷某元素是否被選,locator為一個(by, path)元祖。
  16. element_selection_state_to_be (element, is_selected)方法:判斷某元素的選中狀態是否與預期相同,相同則返回True,不同則返回False。
  17. element_located_selection_state_to_be(locator, is_selected)方法: 判斷某元素是否與預期相同,相同則返回True,不同則返回False,locator為一個(by, path)元祖。

總結:這些方法與WebDriverWait類和 until()until_not()方法組合能使用,夠實現很多判斷功能,如果能自己靈活封裝,將會大大提高指令碼的穩定性。

3、EC模組的使用

我們練習expected_conditions模組中兩個功能,其他功能參照即可。

# 1.匯入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC

# 2.開啟Chrome瀏覽器
driver = webdriver.Chrome()

# 3.開啟註冊A頁面
url = "https://www.baidu.com"
driver.get(url)
sleep(3)

# 4.EC模組的使用
"""
1.EC模組單獨使用的語法
    EC.方法(引數)(driver) 或 EC.方法(引數).__call__(driver)
2.說明
    我們可以檢視title_is()原始碼
    class title_is(object):
        def __init__(self, title):
            self.title = title

        def __call__(self, driver):
            return self.title == driver.title
    我們可以看到,直接使用EC模組,就需要呼叫__call__()方法
    而__call__()方法是魔法方法,呼叫方式,就是上面1所說的兩種方式。
"""

# 4.1 EC模組中title_is()的使用
# 判斷網頁title是否是特定文字
# 正確匹配
title_is_result_True = EC.title_is("百度一下,你就知道")(driver)
print("title_is結果 =", title_is_result_True)
# 錯誤匹配
title_is_result_False = EC.title_is("百度一下,你就知道1").__call__(driver)
print(f"title_is結果 = {title_is_result_False}")

# 4.2 EC模組中presence_of_element_located(locator)的使用
# presence_of_all_elements_located(locator)同理
# 定位元素單數
# 定位百度首頁輸入框
# 4.2.1編寫locator(定位器)
# 正確定位
input_locator_True = ("id", "kw")
# 錯誤定位
input_locator_False = ("id", "kw1")

# 4.2.2 執行EC模組方法
element_located_True = EC.presence_of_element_located(input_locator_True).__call__(driver)
print("element_located結果 =", element_located_True)
# 定位不到會報錯
# element_located_False = EC.presence_of_element_located(input_locator_False)(driver)


# 5.關閉瀏覽器
sleep(2)
driver.quit()

4、EC模組綜合使用

WebDriverWait類和until()方法和EC模組這種組合的使用方法練習。

(1)title_is(title)示例

這個title_is(title)例子很簡單,作為一個入門示例。

"""
1.學習目標
    掌握EC模組中title_is的使用
2.操作步驟(語法)
    2.1 EC模組通用使用方法
        EC模組通常和WebDriverWait配合使用
        WebDriverWait(driver,timeout).until(EC.方法)
    2.2 title_is(指定的標題)
        判斷頁面標題是否和指定的標題一致,如果一致返回True,不一致返回Palse
        result=WebDriverWait(driver,timeout).until(EC.title_is(指定的標題))
        print(result)
3.需求
    使用title_is判斷百度首頁的標題title
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 2.開啟谷歌瀏覽器
driver = webdriver.Chrome()

# 3.輸入網址
url = "https://www.baidu.com"
driver.get(url)
sleep(3)

# 4.驗證頁面標題
result = WebDriverWait(driver, 5).until(EC.title_is("百度一下,你就知道"))
print("result =", result)

# 5.關閉瀏覽器
sleep(2)
driver.quit()
"""
輸出結果:
result = True
"""

(2)presence_of_element_located(locator)示例(常用)

這兩個方法比較常用:

  • presence_of_element_located(locator): 單個元素定位
  • presence_of_all_elements_located(locator):定位一組元素,複數形式

presence_of_element_located(locator)為例:

"""
1.學習目標:
    必須掌握EC模組中元素定位方法presence_of_element_located(locator)
2.語法
    2.1 presence_of_element_located(locator) 單個元素定位
    2.2 presence_of_all_elements_located(locator)  定位一組元素,複數形式
        其實是將find_element()方法做二次封裝
        find_element_by_id("id屬性值")
    2.3 locator--定位器是一個資料型別元組
            ("元素定位方式","方式對應的值")
            ("id","id屬性值")
            ("class name","class屬性值")
            ("xpath","xpath表示式")
            ("partial link text","連線部分文字")
            ("name","name屬性值")
        具體可以看selenium.webdriver.common.by.By這個類
        第一個引數可寫形式
            By.ID = "id",也就是(By.ID ,"id屬性值")
            By.XPATH = "xpath", (By.XPATH,"xpath表示式")
    2.3 總結:
        EC模組中的方法一般和顯示等待配合使用
        EC模組使用步驟:
            1.編寫定位器locator
            2.配合webdriverWait一起使用

3.需求
    使用EC模組中元素定位方法presence_of_element_located(locator)
    定位百度首頁搜尋框
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 2.開啟Chrome瀏覽器
driver = webdriver.Chrome()

# 3.開啟頁面
url = "https://www.baidu.com"
driver.get(url)
sleep(3)

# 4.EC模組的使用
# 4.1 定位單個元素
# 4.1.1 編寫locator(定位器)
# 定位百度首頁輸入框
input_locator = ("id", "kw")
# 定位百度首頁"百度一下"
button_loator = ("id", "su")

# 4.1.2 定位元素
# 結合顯式等待和EC模組實現元素定位
bd_input = WebDriverWait(driver, 5).until(EC.presence_of_element_located(input_locator))
bd_button = WebDriverWait(driver, 5).until(EC.presence_of_element_located(button_loator))

# 5.操作元素
bd_input.send_keys("『心善淵』Selenium3.0基礎")
sleep(2)
bd_button.click()

# 6.關閉瀏覽器
sleep(5)
driver.quit()

(3)text_to_be_present_in_element(locator,text)示例

鞏固練習:

"""
1.學習目標:
    必須掌握EC模組中元素定位方法
    text_to_be_present_in_element(locator,text)
2.語法
    2.1 text_to_be_present_in_element(locator,text)
        判斷文字是否在元素中,如果存在返回true,如果不存在返回false
    2.2 text_to_be_present_in_element_value(locator,text)
        判斷文字是否存在於元素的value屬性值中,如果存在返回true,如果不存在返回false
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 2.開啟谷歌瀏覽器
driver = webdriver.Chrome()

# 3.輸入網址
url = "https://www.baidu.com"
driver.get(url)
sleep(2)

# 4.EC模組的使用
# 4.1 判斷text是否存在於文字中

# 4.1.1 編寫定位器locator
link_loc = ("link text", "hao123")

# 4.1.2 定義期望值
text_link = "hao123"

# 4.1.3 判斷文字是否在元素中,如果存在返回true,如果不存在返回false
result = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element(link_loc, text_link))
print("present_in_element判定結果:", result)

# 4.2 判斷text是否存在於元素的value屬性中
# 判斷百度首頁的"百度一下"
# 4.2.1 編寫定位器locator
button_loc = ("id", "su")

# 4.2.2 定義期望值
text_button = "百度一下"

# 4.2.3 判斷文字是否存在於元素的value屬性值中,如果存在返回true,如果不存在返回false
result_val = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element_value(button_loc, text_button))
print("present_in_element_value判定結果:", result_val)

# 5.關閉瀏覽器
sleep(2)
driver.quit()

"""
輸出結果:
present_in_element判定結果: True
present_in_element_value判定結果: True
"""

(4)注意:(重要)

上面所有的練習,都必須正確找到需求的定位元素,否則會拋TimeoutException異常。

因為WebDriverWait類和until()方法和EC模組這種組合的使用方法

WebDriverWait(driver, 5).until(EC.presence_of_element_located(input_locator))

如果沒有定位到元素,會返回until()方法的返回結果,until()方法的返回結果是,在規定時間內沒有找到需要定位的元素,就會丟擲selenium.common.exceptions.TimeoutException: Message: 異常。

所以我們上邊寫的例子就是讓自己熟悉WebDriverWait類和until()方法和EC模組這組合的用法,以後我們會進行異常處理和封裝,讓我們的程式碼更加可讀,可複用。

相關文章