Playwright + Pytest 实现 Web UI 自动化测试

已转战 Playwright node.js 版,不继续使用 Py3 版了
相关示例仓库:https://github.com/tomoyachen/e2e-playwright-scaffold

写这篇文章写的时候 Playwright 刚出来,而我比较熟悉 Py3,因此浅尝辄止了一下。
也许是因为 Py3 版 Playwright 我只用过还没到 1.0 的 beta 版,也许是因为 node 版 我用的时候已经是 1.0、1.3 版本。我的体验是 nodejs 版会好更多,更完善的系统,更强大的报告。

因此如果你现在想尝试 Playwright ,建议直接使用 nodejs 版,它与 Cypress 的用例编写体验相近。nodejs版 除了烦人的 await 基本上没有其他会踩到的坑了。

项目结构一模一样,只是 nodejs 版的仓库:https://github.com/tomoyachen/e2e-playwright-scaffold


前言

平时工作一直用的 Cypress,但是 Cypress 真的太慢了,就想看看有什么替代品。Selenium 我一直不太喜欢,正好看到微软出的 Playwright 好像蛮有意思的。虽然 Playwright 的 JS 版本 的 Star 是 Python 版本的十倍之多,不过我个人还是更喜欢 Python 和 Pytest,就还是用 Python 版的 Playwright 搭配 Pytest 来食用了。(其实是 js 不太熟悉 XD)

主流的 UI 自动化 框架对比可以参考这篇文章 [传送门]

本项目风格和我之前写的 api-test比较相似,越小越简单越好。

项目地址

Github:https://github.com/tomoyachen/playwright-test

本项目参考了虫师 & Yusuke Iwaki 的项目

分层

定位符、页面操作、业务逻辑三层:合并成了 page 类
测试用例层:test 类(基于 pytest)
数据层:yaml 文件 (config 数据 与 fixtures 数据)
结果层:HTML 报告(基于 pytest-html,感兴趣可以改成 allure),Log 日志(暂无)

在这里插入图片描述
* 图来自 陈晓伍 的 《Python Web自动化测试设计与实现》

test 类
page @pytest.fixture 来自 pytest-playwright
env 是自定义的 @pytest.fixture,用来读取当前环境的配置信息
在这里插入图片描述
使用内置的 browser @pytest.fixture 来 生成一个 page @pytest.fixture
提升作用域,以达到共用同一浏览器的效果
在这里插入图片描述

page 类
想了好几种方式,如何来使用page对象。本来想试试继承,但好像不行。
最终还是作为类属性来使用了。
在这里插入图片描述

config 数据,管理 base_url 等通用信息
fixtures 数据,就是测试用例的测试数据了,只是我习惯 Cypress 的命名方式了。

fixtures 我定义了2种获取方式。
一种是test 类中获取当前要用的测试对象的 yaml 文件

# test 类
@pytest.fixture()
def fixtures(self):
    yield Tools.get_fixtures("baidu_search")


# ---- 用法 -----
# test 类
fixtures['kerwords']

一种是放在conftest.py中,作为@pytest.fixture 来用

# conftest.py
@pytest.fixture(scope="class")
def fixtures():
    def _fixtures(filename: str):
        from common.tools import Tools
        return Tools.get_fixtures(filename)

    yield _fixtures


# ---- 用法 -----
# test 类
fixtures('baidu_search')['kerwords']

在这里插入图片描述

其他

虚拟环境使用的 poetry
在这里插入图片描述

conftest.py 文件中,pytest 钩子和 pytest-html 钩子都有详尽的注解
在这里插入图片描述

报告 用的 pytest-html,我还蛮喜欢的。
在这里插入图片描述

新功能

视频录制

Playwright 内置的视频录制,传入一个 路径就可以了。
还学到了一个新钩子

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, tmpdir_factory: pytest.TempdirFactory):
    return {
        **browser_context_args,
        "record_video_dir": os.path.join(OUTPUT_DIR, "videos")
        }

allure 报告

在 feature/allure 分支

有了截图和视频,再看 pytest-html 就有点磕碜了。所以就接了 allure。
目前是pytest-html 和 allure部分都保留了。

在这里插入图片描述

已知问题

  1. config 数据 和 fixtures 数据如何整合,目前还在思考

  2. Tools.get_config()、Tools.get_fixtures() 等依赖 env 信息的操作,只能放在__init__ 或 实例方法中。因为引入文件时会自动执行文件。此时还没有 env 信息,所以会报错。

# 错误
class BaiduSearchPage:

        host = Tools.get_config("base_url")
        
    def __init__(self, page: Page):
        self.page = page

# 正确
class BaiduSearchPage:

    def __init__(self, page: Page):
        self.page = page
        self.host = Tools.get_config("base_url")
  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Playwright+Pytest是一种常用的自动化测试框架组合,用于编写和执行Web应用程序的自动化测试。下面是一个简单的示例,展示了如何使用PlaywrightPytest进行自动化测试: 首先,确保已经安装了PlaywrightPytest模块。可以使用以下命令进行安装: ``` pip install playwright pytest ``` 接下来,创建一个pytest测试文件,例如 `test_example.py`,并导入所需的模块: ```python import pytest from playwright.sync_api import Playwright, sync_playwright # 使用fixture装饰器,创建一个Playwright实例 @pytest.fixture(scope="session") def playwright() -> Playwright: with sync_playwright() as playwright: yield playwright # 编写一个基本的测试用例 def test_example(playwright): # 启动一个浏览器实例 browser = playwright.chromium.launch() # 创建一个页面对象 page = browser.new_page() # 导航到目标网页 page.goto("https://www.example.com") # 断言页面标题 assert page.title() == "Example Domain" # 关闭浏览器 browser.close() ``` 在上面的示例中,使用`@pytest.fixture`装饰器创建了一个Playwright实例,作为测试用例的前置条件。然后,使用`playwright`夹具作为参数传递给测试用例函数。在测试用例中,使用Playwright的功能来启动浏览器、创建页面对象、导航到网页,并进行断言验证。 最后,使用以下命令运行测试: ``` pytest test_example.py ``` 这是一个简单的Playwright+Pytest自动化框架的示例,你可以根据实际需求扩展和定制测试用例。希望对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值