以下是关于 poium 测试库 的详细介绍,涵盖其核心功能、使用方法及与原生 Selenium 的对比,帮助快速掌握这一工具:
1. poium 简介
-  定位:基于 Selenium 的 Page Object 模式增强库,专注于简化元素定位和页面操作。 
-  核心目标: -  通过简洁的 API 提升代码可读性。 
-  减少样板代码,提升测试脚本开发效率。 
-  内置智能等待、链式调用等实用功能。 
 
-  
-  适用场景:Web 自动化测试(尤其适合中大型项目需要维护 Page Object 的场景)。 
2. 安装 poium
bash
复制
pip install poium3. 核心功能与使用
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 模式的项目。