以下是關于?poium 測試庫?的詳細介紹,涵蓋其核心功能、使用方法及與原生 Selenium 的對比,幫助快速掌握這一工具:
1. poium 簡介
-
定位:基于 Selenium 的?Page Object 模式增強庫,專注于簡化元素定位和頁面操作。
-
核心目標:
-
通過簡潔的 API 提升代碼可讀性。
-
減少樣板代碼,提升測試腳本開發效率。
-
內置智能等待、鏈式調用等實用功能。
-
-
適用場景:Web 自動化測試(尤其適合中大型項目需要維護 Page Object 的場景)。
2. 安裝 poium
bash
復制
pip install poium
3. 核心功能與使用
3.1 元素定位
-
支持多種定位方式(語法更簡潔):
python
復制
from poium import Page, Elementclass LoginPage(Page):username = Element(id_="username", describe="用戶名輸入框") # id定位password = Element(css=".password", describe="密碼輸入框") # CSS選擇器submit = Element(xpath="//button[@type='submit']", describe="提交按鈕")
3.2 鏈式操作
-
流式調用提升代碼可讀性:
python
復制
LoginPage().username.input("admin").password.input("123456").submit.click()
3.3 智能等待
-
自動處理元素加載等待,無需手動編寫?
WebDriverWait
:python
復制
# 元素默認等待時間(全局配置) from poium import config config.timeout = 10 # 設置全局等待時間為10秒# 單個元素自定義等待 error_msg = Element(css=".error", timeout=5)
3.4 元素操作擴展
-
內置豐富操作方法:
python
復制
element.input("text") # 輸入文本 element.click() # 點擊 element.clear() # 清空內容 element.get_text() # 獲取文本 element.is_displayed() # 判斷元素是否可見
3.5 斷言增強
-
集成常用斷言方法:
python
復制
from poium import assertsasserts.assert_title("首頁") # 斷言頁面標題 asserts.assert_element_text(login.submit, "登錄") # 斷言元素文本
4. 完整示例
Page Object 定義
python
復制
from poium import Page, Elementclass BaiduSearchPage(Page):search_input = Element(id_="kw", describe="搜索框")search_button = Element(id_="su", describe="搜索按鈕")def search(self, keyword):self.search_input.input(keyword)self.search_button.click()
測試用例(結合 pytest)
python
復制
def test_baidu_search():page = BaiduSearchPage()page.open("https://www.baidu.com")page.search("poium")asserts.assert_title_contains("poium")
5. 與原生 Selenium 對比
功能 | 原生 Selenium | poium |
---|---|---|
元素定位 | driver.find_element(By.ID, "kw") | Element(id_="kw") |
元素操作 | element.send_keys("text") | element.input("text") |
等待處理 | 需手動編寫?WebDriverWait | 自動智能等待(可配置超時) |
代碼結構 | 需自行封裝 Page Object | 內置 Page 類,直接繼承即可 |
斷言 | 結合?unittest ?或?pytest ?斷言 | 內置?asserts ?模塊提供專用斷言方法 |
6. 實踐
poium + pytest + Allure
-
目錄結構:
復制
project/├── pages/ # 存放Page Object類├── tests/ # 測試用例├── conftest.py # pytest配置(如driver初始化)└── utils/ # 工具函數(如數據生成)
-
Driver 管理:
python
復制
# conftest.py import pytest from selenium import webdriver from poium import Browser@pytest.fixture(scope="session") def driver():driver = webdriver.Chrome()yield Browser(driver) # 將原生driver封裝為poium的Browser對象driver.quit()
- 數據驅動(結合?
pytest.mark.parametrize
):
????????python
????????復制
import pytest@pytest.mark.parametrize("keyword", ["selenium", "poium", "pytest"])
def test_search(driver, keyword):page = BaiduSearchPage(driver)page.open("https://www.baidu.com")page.search(keyword)asserts.assert_title_contains(keyword)
seldom + poium
import seldom
from poium import Page, Elementclass BaiduPage(Page):"""baidu page"""search_input = Element(id_="kw")search_button = Element(id_="su")class BaiduTest(seldom.TestCase):"""Baidu search test case"""def test_case(self):"""A simple test"""page = BaiduPage(self.driver, print_log=True)page.open("https://www.baidu.com")page.search_input.send_keys("seldom")page.search_button.click()self.assertTitle("seldom_百度搜索")if __name__ == '__main__':seldom.main(browser="chrome")
7. 常見問題
Q1:如何處理動態元素(如彈窗)?
-
方案:通過?
Element
?的?timeout
?參數調整等待時間,或結合?is_displayed()
?判斷。python
復制
class PopupPage(Page):confirm_btn = Element(css=".confirm", timeout=5)def test_handle_popup():if PopupPage().confirm_btn.is_displayed():PopupPage().confirm_btn.click()
Q2:如何與 Allure 報告集成?
-
步驟:
-
安裝?
pytest-allure
:bash
復制
pip install allure-pytest
-
運行測試并生成報告:
bash
復制
pytest --alluredir=./allure-results allure serve ./allure-results
-
Q3:如何復用公共頁面組件?
-
方案:通過類繼承或 Mixin 模式復用組件。
python
復制
class HeaderComponent(Page):home_link = Element(link_text="首頁")class HomePage(HeaderComponent):search_input = Element(id_="search")
8.總結
-
poium 優勢:簡化元素操作、內置智能等待、提升代碼可維護性,適合中大型項目。
-
適用項目:需要長期維護的 Web 自動化測試,尤其是遵循 Page Object 模式的項目。