首页 > 其他分享 >playwright自动化项目搭建

playwright自动化项目搭建

时间:2023-11-03 10:33:06浏览次数:44  
标签:case playwright html pytest 自动化 path page 搭建

这是关于playwright系列介绍的最后一篇。搭建基于 playwright 的自动化项目。

GitHub地址: https://github.com/defnngj/playwright-pro

具备功能

关键技术:

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

非关键技术:

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

实现功能:

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

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

使用方式

  • 安装依赖
$ pip install -r requirements.txt

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

  • 配置

config.py 文件配置

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 run.py

设计细节

  • 关于page object设计模式

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

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

# 输入
page.type('#kw', "playwright")
# 点击
page.click('#su')

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

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

在测试用例中的使用

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 实现截图动作。

@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的驱动,截图判断逻辑有点复杂,不过我已经实现了。

总结

  • playwright还不稳定,我在使用的时候时常报一些错误,错误日志也不友好。计划在正式项目中使用的谨慎考虑,估计有一些坑要踩。
  • 不熟悉playwright的API,可以通过官方文档,或者是项目自带的测试用例,或者阅读项目源码都是很好的学习方式。

标签:case,playwright,html,pytest,自动化,path,page,搭建
From: https://blog.51cto.com/fnngj/8162065

相关文章

  • Ubuntu 修改主机名和hosts文件并克隆虚拟机初步搭建集群
    进入终端输入 sudovim/etc/hosts像红框里一样,添加自己虚拟机的主机名称映射然后终端输入reboot重启虚拟机然后操作参考Ubuntu20虚拟机克隆以及克隆后静态IP和主机名的修改_ubuntu克隆后修改ip-CSDN博客 ......
  • 创建一个vue项目---全局环境搭建
    全局环境搭建一、环境准备1、安装node.js下载地址:https://nodejs.org/en/2、检查是否安装成功:输出版本号说明安装成功3、安装淘宝镜像(淘宝镜像速度比较快)npminstall-gcnpm-registry=https://registry.npm.taobao.org4、检查cnpm是否安装成功cnpm-v二、搭......
  • Seata 分布式事务服务器搭建
    1.Seata安装包下载网址:https://github.com/seata/seata/releases下载:seata-server-1.5.2.zip2.Seata配置文件修改解压安装包,seata/conf文件夹找到application.yml配置文件,修改如下:server:port:7091spring:application:name:seata-serverlogging:c......
  • nebula-br local-store 模式,快速搭建主备集群实践
    因为线上图数据库目前为单集群,数据量比较大,有以下缺点:单点风险,一旦集群崩溃或者因为某些查询拖垮整个集群,就会导致所有图操作受影响很多优化类但会影响读写的操作不好执行,比如:compact、balanceleader等;双集群在升级的时候也非常有优势,完全可以做到不影响业务运行,比如先升级......
  • 揭秘!自动化测试效率提升30%如何达成
      一个全新的应用需要经过需求设计、应用开发、应用测试,及应用上架等几个阶段之后,才能到达用户手中。在应用测试中,测试的类型根据不同的开展时机,可以分为单元测试、集成测试、专项测试,以及上架测试。单元测试指对软件中的最小可测试单元进行验证,围绕函数、类、方法等展开,大......
  • 搭建 Zerotier Moon为异地组网网络加速
    由于Zerotier服务器在国外,导致在国内的速度不快,所以官方推荐设置自己的moon服务器做节点加速。moon服务器需要24小时不挂机,并且有固定ip,对硬件要求不高,所以云服务器比较符合做moon服务器第一步:在云服务器linux上安装Zerotier客户端:curl-shttps://install.zerotier.com/|sud......
  • 麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器
    原文链接:麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章01-新创建软件仓库服务器,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上搭建内网软件仓库源,本系列共有三个内容,欢迎大家浏览分享转发。关......
  • 自动化构建工具make/makefile详解
    一、工具介绍1.1为什么需要使用自动化项目构建工具呢在我看来,在平时写较少代码,只有1个源文件的时候,用make和不用make感觉差别不大,但是当项目源文件一多,需要一个个的去输入gcc进行编译,显然是十分麻烦的。所以make这个工具可以极大的提高项目完成后的测试工作。1.2make/makefile介绍......
  • 《软件测试52讲》读书笔记(十四) —— 让自动化测试脚本更好地描述业务
    如何把控操作函数的粒度?操作函数的粒度:一个操作函数到底应该包含多少操作步骤才是最合适的。很大程度上取决于项目的实际情况,以及测试用例步骤的设计。可以遵循的设计依据:以完成一个业务流程为主线,抽象出其中的“高内聚低耦合”的操作步骤集合,操作函数就由这些操作步骤集合构......
  • (1)微信UI自动化-篇章开启(C#)
    ​近期看到很多人用HOOK钩子的方式来拦截微信的消息来实现微信的外挂操作。我觉得在当下的互联网环境下反编译别人的软件进行注入已属于违规甚至非法操作,但是使用软件本身的UI对象进行自动化来辅助办公是一种趋势和潮流,比较重复的工作交给计算机是最合适的。解放双手!!!所以我利用业......