UI自动化:poium测试库

news/2025/3/18 11:44:23

以下是关于 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, Element
    
    class 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 asserts
    
    asserts.assert_title("首页")                     # 断言页面标题
    asserts.assert_element_text(login.submit, "登录") # 断言元素文本

4. 完整示例

Page Object 定义

python

复制

from poium import Page, Element

class 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 对比

功能原生 Seleniumpoium
元素定位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

  1. 目录结构

    复制

    project/
      ├── pages/          # 存放Page Object类
      ├── tests/          # 测试用例
      ├── conftest.py     # pytest配置(如driver初始化)
      └── utils/          # 工具函数(如数据生成)
  2. 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()
  3. 数据驱动(结合 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, Element


class 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 报告集成?

  • 步骤

    1. 安装 pytest-allure

      bash

      复制

      pip install allure-pytest
    2. 运行测试并生成报告:

      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 模式的项目。


http://www.niftyadmin.cn/n/5890855.html

相关文章

嵌入式软件测试的东方智慧:WinAMS工具的技术哲学与实践启示——一名汽车电子工程师的七年工具演进观察

引言:在丰田精益生产线上诞生的测试哲学 2017年参与某日系车企的ECU(电子控制单元)联合开发时,我第一次在名古屋工厂见到产线旁部署的WinAMS测试站。不同于欧美工具强调的“全流程覆盖”,这个诞生于日本制造业精益文化…

车削和铣削

车削 (Turning) 车削是一种切削加工方法,主要特点是: 工作原理:工件旋转,刀具沿特定方向移动进行切削设备:主要在车床上进行,包括普通车床、数控车床等应用范围:适合加工轴类、盘类等旋转体零…

JavaWeb基础三(Servlet、Cookie、Session)

HttpServletResponse web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象。 如果要获取客户端请求过来的参数,找HttpServletRequest如果要给客…

【探秘海洋伤痕】海洋环境污染损害的警世启示

在地球这个蓝色星球上,广袤无垠的海洋孕育了无数生命,支撑着地球的生态平衡与人类的生存发展。然而,随着工业化和现代化的加速,海洋环境遭受的伤害日益严重,海洋环境污染损害成为了我们必须直面的严峻问题。本文将带您…

2025年渗透测试面试题总结-阿里巴巴-阿里云安全 一面、三面(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 阿里巴巴-阿里云安全 一面 一、WAF管理平台压力测试(2025实践方案) 1. 压力测…

避免15个常见的API测试错误

避免15个常见的API测试错误 理解并避免常见的API测试错误可以增强API的可靠性、可扩展性和安全性。作为一个全方位的API开发、测试和监控工具,Apipost提供了自动化测试、动态数据处理和安全性测试等功能,是进行有效API测试的完美伴侣。 API测试是现代软…

SpringMVC——REST简介及入门案例

REST简介 REST(Representational State Transfer)即表现层状态转移,是一种基于HTTP协议的网络应用程序的架构风格。它强调客户端和服务器之间的交互操作,通过对资源的表现形式进行操作来实现对资源的管理。REST风格的API设计具有简…

新闻网页信息抽取

1. 网页信息抽取 问题定义:对新闻网页(输入为HTML)提取结构化信息,包括标题、发布时间、作者、正文、图片等。 https://www.dailypolitical.com/2025/02/27/walter-public-investments-inc-purchases-3634-shares-of-msci-inc-ny…