playwright自动化项目搭建

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)【持续更新最新版】-CSDN博客

具备功能

关键技术:

  • pylaywright测试库
  • pytest单元测试框架
  • pytest-playwright插件

非关键技术:

  • pytest-html插件
  • pytest-rerunfailures插件
  • seldom 测试框架

实现功能:

  • 元素定位与操作分离
  • 失败自动截图并保存到HTML报告
  • 失败重跑
  • 可配置不同的浏览器执行
  • 可配置headless/headful 模式
  • 实现参数化读取数据文件

一个自动化具备的基本功能差不多就这些了。其实主要是使用了一堆框架和插件,主要是整合能力。

使用方式

  • 安装依赖

    $ pip install -r requirements.txt

注:安装requirements.txt指定依赖库的版本,这是经过测试的,有时候新的版本可会有错。

  • 配置

config.py 文件配置

python 复制代码
class RunConfig:
    """
    运行测试配置
    """
    # 运行测试用例的目录或文件
    cases_path = "./test_dir/test_parametrize.py"

    # 配置浏览器驱动类型(chromium, firefox, webkit)。
    browser = "chromium"

    # 运行模式(headless, headful)
    mode = "headful"

    # 配置运行的 URL
    url = "https://www.baidu.com"

    # 失败重跑次数
    rerun = "0"

    # 当达到最大失败数,停止执行
    max_fail = "5"
  • 运行

运行测试

python 复制代码
$ python run.py

设计细节

  • 关于page object设计模式

page object是自动化测试最常用的设计模式。

但 playwright 中的只提供了操作方法,元素定位测试数据都只是参数。

python 复制代码
# 输入
page.type('#kw', "playwright")
# 点击
page.click('#su')

我们依然,可以将元素定位单独封装一层。

python 复制代码
class BaiduElem:
    search_input = "#kw"  # 搜索框
    search_button = "#su"  # 搜索按钮
    settings = "#s-usersetting-top"  # 设置
    search_setting = "#s-user-setting-menu > div > a.setpref"  # 搜索设置
    save_setting = 'text="保存设置"'  # 保存设置

在测试用例中的使用

python 复制代码
from element.baidu_element import BaiduElem
from playwright.sync_api import Page


def test_baidu_search(page: Page, base_url):
    """
    """
    page.goto(base_url)
    page.type(BaiduElem.search_input, text="playwright")
    page.click(BaiduElem.search_button)
    sleep(2)
    assert page.title() == "playwright_百度搜索"

这肯定不是什么好的设计。用例层写起来会比较啰嗦, 最好可以page.elem.type("playwright") 的语法实现,这就需要在playwright的基础上再封装一套API, 看playwright 源码还是有些复杂的,主要是用了很多就异步,成本比较大,暂时先这么用。

  • 关于自动截图

自动截图需要 pytest/pytest-html 和 playwright 配合完成, pytest/pytest-html 判断用例实现,并把图片插入到报告中。 playwright 实现截图动作。

python 复制代码
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
    """
    用于向测试用例中添加用例的开始时间、内部注释,和失败截图等.
    :param item:
    """
    pytest_html = item.config.pluginmanager.getplugin('html')
    outcome = yield
    report = outcome.get_result()
    report.description = description_html(item.function.__doc__)
    extra = getattr(report, 'extra', [])
    page = item.funcargs["page"]
    if report.when == 'call':
        xfail = hasattr(report, 'wasxfail')
        if (report.skipped and xfail) or (report.failed and not xfail):
            case_path = report.nodeid.replace("::", "_") + ".png"
            if "[" in case_path:
                case_name = case_path.split("-")[0] + "].png"
            else:
                case_name = case_path

            capture_screenshots(case_name, page)
            img_path = "image/" + case_name.split("/")[-1]
            if img_path:
                html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \
                       'onclick="window.open(this.src)" align="right"/></div>' % img_path
                extra.append(pytest_html.extras.html(html))
        report.extra = extra

def capture_screenshots(case_name, page):
    """
    配置用例失败截图路径
    :param case_name: 用例名
    :return:
    """
    global driver
    file_name = case_name.split("/")[-1]
    if RunConfig.NEW_REPORT is None:
        raise NameError('没有初始化测试报告目录')
    else:
        image_dir = os.path.join(RunConfig.NEW_REPORT, "image", file_name)
        page.screenshot(path=image_dir)

通过page = item.funcargs["page"] 拿到playwright的驱动,截图判断逻辑有点复杂,不过我已经实现了。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
大耳朵-小飞象8 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技8 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
微硬创新8 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
生活爱好者!11 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
尽兴-13 小时前
企业业务系统架构选型与渐进式演进
运维·系统架构·devops
通信小小昕13 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
壮哥_icon13 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
RD_daoyi14 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
电商API_1800790524714 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
张小姐的猫14 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式