当前位置: 首页 > news >正文

UI自动化测试框架playwright--初级入门

 一、背景:UI自动化的痛点:

1、设计脚本耗时:

需要思考要如何模拟用户的操作,如何触发页面的事件,还要思考如何设计脚本,定位和操作要交互的元素、路径、位置,再编写代码逻辑,往复循环数次,要不停在浏览器和代码编辑器中进行切换。

2、调试脚本耗时:

初步完成元素定位和操作的脚本后,还要一 一进行测试验证程序运行是否符合预期,要反复进行调试。

3、维护成本较高:

面向用户的界面的迭代变化频率较高,基于界面元素构建的测试脚本也要跟着变,那么我们面临的就是不停的更新维护既有的UI自动化脚本

思考:如何可以不用考虑定位元素、不用手写代码、并且降低维护成本地完成UI自动化流程?

二、简介与安装

1、介绍-特点

Playwright是一个由微软开发的自动化测试框架,通过“录制为主,编写为辅”的方式来完成测试脚本。

1)playwright的优点

1)支持所有主流浏览器
•支持所有主流浏览器:基于Chromium内核的Chrome 和 Edge浏览器, WebKit内核的Safari 和 Firefox浏览器。
•支持跨平台:Windows、Linux 和macOS
•可用于模拟移动端WEB应用的测试,不支持在真机上测试。
•支持无头模式(默认)和有头模式2)快速可靠的执行
•自动等待元素(默认30s)
•Playwright基于Websocket协议,可以接受浏览器(服务端)的信号,也可在后台服务器完成。selenium采用的是HTTP协议,只能客户端发起请求。
•浏览器上下文并行:单个浏览器实例下创建多个浏览器上下文,每个浏览器上下文可以处理多个页面。
•有弹性的元素选择:可以使用文本、可访问标签选择元素。3)强大的自动化能力
•playwright不受页面内JavaScript执行范围的限制,可以自动化控制多个页面。
•自动生成测试代码:Playwright提供了一个CLI工具,可以记录用户在浏览器中的操作,并生成相应的测试代码。
•强大的网络控制:Playwright 引入了上下文范围的网络拦截来存根和模拟网络请求。
•现代web特性:支持Shadow DOM选择,元素位置定位,页面提示处理,Web Worker等Web API。
•覆盖所有场景:支持文件下载、上传、输入、点击,暗黑模式等。
•支持主流编程语言:python、Java、Node.js、C#、.Net等

2)playwright的局限性

1) Playwright不支持旧版Microsoft Edge或IE11。所以对浏览器版本有硬性要求的项目不适用。2) 需要SSL证书进行访问的网站可能无法录制,该过程需要单独定位编写。3) 移动端测试是通过桌面浏览器来模拟移动设备,无法控制真机。4) Playwright的社区规模相对较小,可能会导致在解决问题时的资源有限

3)与传统的selenium对比

2、安装playwright

建议使用镜像,不然比较慢

pip install playwright -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功

3、安装浏览器环境

此命令会一次性安装Chromium, Firefox 和 WebKit 内置浏览器,playwright就是通过这些浏览器操作web应用

playwright install

三、UI脚本录制:

1、录制脚本

在控制台,通过codegen命令,使用playwright进行脚本录制

#默认使用Chromium
playwright codegen URL#指定浏览器:
playwright codegen -- browser firefox URL#录制脚本自动保存到本地
playwright codegen -o D:\demo.py -b chromium URL
-o 生成自动化脚本的目录(默认地址为cmd运行命令的地址)
-b 指定浏览器驱动  

示例:

2、录制浏览器操作-自动生成脚本

playwright codegen https://www.baidu.com/

3、生成的脚本语言种类

支持自动生成:python、Java、Node.js、C#、.Net等编程语言

四、UI自动化结合接口自动化使用

通过调用提供出的接口,可以做UI自动化的前置或者后置的 造数、清数、设置mock,以及调用各业务线维护的P0级用例等等均可

1、接口的token

2、示例

使用 Playwright 框架模拟了一个 POST 请求,完成接口的调用,在发起放款流程前,清除在途贷款单。

plywright本身也可以应用在接口自动化

五、UI自动化断言

page = browser.new_page(timeout=60000)  # 设置 timeout 为 60 秒
page.goto("https://example.com", wait_until="networkidle")  # 使用 waitUntil将等待网络请求停止后再继续执行

1、自动断言

playwright本身支持自动生成对元素的基本断言代码,例如:元素是否可见、元素的文本是否匹配、元素的属性值是否一致、元素的快照等

2、常用的用于断言方法

对页面文本断言、对元素断言 ,对URL断言

    # 断言页面标题expect(page).to_have_title("Example Domain")# 断言 h1 文本内容expect(page.locator('h1')).to_have_text('Example Domain')# 断言元素可见expect(page.locator('text="More information..."')).to_be_visible()# 断言元素不可见# 假设页面上有一个隐藏的元素,ID为hidden-element# expect(page.locator('#hidden-element')).not_to_be_visible()# 断言元素属性# 假设页面上有一个按钮,ID为submit-button,其属性为disabled# expect(page.locator('#submit-button')).to_have_attribute('disabled', 'true')# 断言元素数量# 假设页面上有三个div元素,类名为item# expect(page.locator('div.item')).to_have_count(3)# 断言 URLexpect(page).to_have_url('https://example.com')# 断言输入框的值# 假设页面上有一个输入框,名称为username,其值为testuser# expect(page.locator('input[name="username"]')).to_have_value('testuser')# 断言元素的 CSS 属性# 假设页面上有一个按钮,其背景颜色为rgb(0, 123, 255)# expect(page.locator('button')).to_have_css('background-color', 'rgb(0, 123, 255)')# 断言元素可编辑# 假设页面上有一个输入框# expect(page.locator('input')).to_be_editable()# 断言复选框已选中# 假设页面上有一个复选框# expect(page.locator('input[type="checkbox"]')).to_be_checked()

六、截图比对

可以对页面、元素等,进行截图并比对

1、图像比对方法:

本次介绍的图片比对方法:ImageChops.difference()需要引入pillow库,pip install pillow原理:将图像数据转换为 Image 对象,然后使用像素值进行比较1)图像对齐:首先,该方法会对齐两幅图像的大小和位置。如果两幅图像的大小不同,较小的图像会被扩展到与较大图像相同的大小。如果它们的位置不同,difference() 会尝试将它们对齐到相同的位置。2)像素值比较:然后,对于每个对应的像素点,该方法会计算它们的RGB值之间的差异。也就是计算每个通道(红、绿、蓝)中像素值的绝对差异,并将这些差异值合并成一个新的像素值。3)差异图像生成:最后,该方会创建一个新的图像:差异图像,其中每个像素的值表示了原始图像中对应像素的差异程度。差异图像通常显示为黑白图像,白色表示两个图像在该位置完全不同,黑色表示它们完全相同。

图像比对方法介绍:

选择哪种方法取决于你的具体需求和图像特性。

如果需要非常精确的对比,像素级对比可能是最好的选择;

如果你希望对比结果更符合人类视觉感知,SSIM 或 EMD 可能更合适。

1)Pillow (PIL):提供了基本的图像处理功能,包括像素级对比。
2)imagehash:实现了 Perceptual Hashing 算法。
3)scikit-image:提供了 SSIM 和其他图像相似性度量的计算函数。
4)pyemd:实现了 Earth Mover's Distance 算法。
5)TensorFlow 或 PyTorch:可以使用这些深度学习框架来构建和训练自己的图像对比模型。

2、截取某个元素

#定位元素
element = page.get_by_role("button", name="立即登录")# 对元素进行截图
screenshot = element.screenshot()

3、截取页面

#打开页面
page.goto('https://www.baidu.com/')#截取页面
page.screenshot(path='page.png')

4、比对方式

1)本地图片与测试流程中图片比对:

  #在URL页面中截图page1page.goto("URL1")page.screenshot(path='page1.png')image1 = Image.open('page1.png')#在本地通过绝对路径获取图片2image2 = Image.open('local path')diff = ImageChops.difference(image1, image2)if diff.getbbox():print("The two pages are different.")else:print("The two pages are same.")

2)测试流程中图片比对:

    page.goto("URL1")page.screenshot(path='page1.png')page.goto("URL2")page.screenshot(path='page2.png')image1 = Image.open('page1.png')image2 = Image.open('page2.png')diff = ImageChops.difference(image1, image2)if diff.getbbox():print("The two pages are different.")else:print("The two pages are same.")

七、模拟移动端

1、说明

playwright支持模拟特定设备的浏览器行为,例如用户代理、屏幕尺寸、视口以及是否启用了触摸。所有测试都将使用指定的设备参数运行。

2、示例:

通过配置UA结合device模拟移动端,小贷日常用于移动端测试、用户鉴权等场景

browser = playwright.chromium.launch(headless=False)
# browser2 = playwright.chromium.launch(channel='chrome', args=['--device', 'iPhone 15 Pro Max'])mobile_context = browser.new_context(user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/application=JDJR-App&clientType=ios&iosType=iphone&clientVersion=6.8.70&HiClVersion=6.8.60&isUpdate=0&osVersion=16.6.1&osName=iOS&screen=932*430&src=App Store&netWork=2&netWorkType=5&CpayJS=UnionPay/1.0 JDJR&stockSDK=stocksdk-iphone_4.2.3&sPoint=&jdPay=(*#@jdPaySDK*#@jdPayChannel=jdfinance&jdPayChannelVersion=6.8.60&jdPaySdkVersion=4.01.17.00&jdPayClientName=iOS*#@jdPaySDK*#@)",viewport={'width': 400, 'height': 700})page2 = mobile_context.new_page()

八、可视化测试报告输出

1、allure下载与安装

allure下载地址:Central Repository: io/qameta/allure/allure-commandline

需要配置环境变量

一切安装好之后,在cmd里面查看安装的版本号

allure --version

2、安装依赖

pip install -i https://pypi.douban.com/simple allure-pytest
npm install -g allure-playwright@2.13.5

3、应用

用例文件里分层标识信息

标题:
@allure.title("用例标题")步骤:
with allure.step("执行步骤"):描述:
def test_function():'''描述'''

main文件里使用

# 获得测试结果,并以allure的数据格式保留下来
1)pytest.main(["--alluredir", "allure_result", "--clean-alluredir","test_loan_pc_old.py"])•["--alluredir", "allure_result"] 表示将测试结果保存在 allure_result 文件夹中,用于后续生成报告。
•["--clean-alluredir"] 表示在运行测试之前,清空 allure_result 文件夹中的内容,避免与上一次测试的结果混淆。
•["test_loan_pc_old.py"] 指定要运行的测试用例文件名。# 通过allure的数据,进行报告的生成
2)allure generate --clean ./allure_result -o ./allure_report
根据 allure_result 的数据生成测试报告,并将报告保存在 allure_report 文件夹中
--clean 选项表示在生成报告之前清空 allure_result 文件夹中的内容。

4、运行结果

自动化脚本里面,对断言失败和用例执行情况进行可视化输出

1)一成功,一失败

对断言失败和用例执行情况进行可视化输出

2)用例执行均成功

九、PO模式 

相关文章:

UI自动化测试框架playwright--初级入门

一、背景:UI自动化的痛点: 1、设计脚本耗时: 需要思考要如何模拟用户的操作,如何触发页面的事件,还要思考如何设计脚本,定位和操作要交互的元素、路径、位置,再编写代码逻辑,往复循…...

SQL多表联查、自定义函数(字符串分割split)、xml格式输出

记录一个报表的统计,大概内容如下: 多表联查涉及的报表有:房间表、买家表、合同表、交易表、费用表、修改记录表 注意:本项目数据库使用的是sqlserver(mssql),非mysql。 难点1:业主信息&#…...

Fast API使用

相关的代码上都有注释,其中前端代码是用来提交表单的 此代码进行了跨域处理,允许前端直接提交表单,并正常返回 完整代码: from typing import Unionfrom fastapi import Header, Cookie from pydantic import BaseModel, Field f…...

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型,包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型,支持…...

MySQL 中删除重复数据 SQL 写法

要在 MySQL 中删除重复的数据并只保留一条,可以使用下面的方法(要用的时候直接复制小改下条件和表名称即即可) 方法一:使用 left join 子查询删除重复数据(推荐) 温馨提示:本人在 500w 数据下执行此 SQL 耗费 15s-30s…...

docker minio镜像arm64架构

minio版本为RELEASE.2021-09-03T03-56-13Z 原项目信创改造,服务器资源改为了arm64架构,统信uos docker镜像库内没有对应的minio镜像,当前镜像为拉取源码后,自编译打包镜像,亲测可用。 使用方式 将tar包导入到服务器…...

VUE3 监听器(watch)

在 Vue 3 中,监听器(watch)是用来观察响应式数据的变化,并在数据发生变化时执行相应操作的机制。watch 主要用于响应式数据变化时的副作用处理,比如异步操作、数据更新等。 1. 基础使用 在 Vue 3 中,watc…...

CAPL如何设置TCP/IP传输层动态端口范围

在TCP/IP协议中,应用程序通过传输层协议TCP/UDP传输数据,接收方传输层收到数据后,根据传输层端口号把接收的数据上交给正确的应用程序。我们可以简单地认为传输层端口号是应用程序的标识,这就是为什么我们说应用程序在使用TCP/IP协议通信时要打开传输层端口号或者绑定端口号…...

随记:有关Springboot项目中的时间格式实现的几种方式

1.注解 JsonFormat DateTimeFormat import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDateTime;public class Event {// 序列化和反序列化时生效JsonFormat(pattern "yyyy-MM…...

IntelliJ IDEA 优化设置

针对 Java 开发,IntelliJ IDEA 有许多优化设置,可以帮助提高代码编写、调试、构建和运行的效率。以下是一些针对 Java 开发的优化建议: 1. 增加 JVM 内存和性能优化 增加堆内存: 通过调整 idea.vmoptions 文件,增加 IntelliJ ID…...

jsp企业财务管理系统设计与实现

企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用,企业发展速度在不断加快,在这种市场竞争冲击下企业财务管理系统必须优先发展,这样才能保证在竞争中处于优势地位。对此企业必须实现财务管理…...

EscherNet运行笔记

文章标题:EscherNet: A Generative Model for Scalable View Synthesis 1. 环境配置 conda env create -f environment.yml -n eschernet conda activate eschernet 2. 数据下载 wget https://tri-ml-public.s3.amazonaws.com/datasets/views_release.tar.gz 3…...

Java中的反射机制及其应用场景

目录 什么是Java反射机制? 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制? Java反射机制是一种强大的工具,它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射,开发者可以在不知道类的具体实现…...

信息科技伦理与道德3:智能决策

1 概述 1.1 发展历史 1950s-1980s:人工智能的诞生与早期发展热潮 1950年:图灵发表了一篇划时代的论文,并提出了著名的“图灵测试”;1956年:达特茅斯会议首次提出“人工智能”概念;1956年-20世纪70年代&a…...

青少年编程与数学 02-006 前端开发框架VUE 16课题、组件基础

青少年编程与数学 02-006 前端开发框架VUE 16课题、组件基础 一、定义一个组件二、使用组件三、传递 props四、监听事件五、通过插槽来分配内容六、动态组件七、DOM 内模板解析注意事项1、大小写区分2、闭合标签3、元素位置限制 课题摘要:本文介绍了Vue.js中的组件基础&#xf…...

25/1/11 算法笔记 Yolov8物体识别

这几天做了给Yolov8检测物体的小任务,今天来做下总结。 首先介绍下整个Yolov8检测的步骤吧,安装库那些就不讲了。 这是我的文件包的对象树。 有images包,里面装了训练和验证的图像。 labels包,装了标注好的labels的txt文件&…...

水水水水水水

为了拿推广卷,但不想把我原本完整的文章拆成零散的多篇,只能出此下策随便发一篇,认真写的都笔记专栏里 网络技术:数字时代的基础设施 在当今社会,网络技术无疑是推动现代生活和经济发展的核心动力之一。从简单的信息传…...

XS5037C一款应用于专业安防摄像机的图像信号处理芯片,支持MIPI和 DVP 接口,内置高性能ISP处理器,支持3D降噪和数字宽动态

XS5037C是一款应用于专业安防摄像机的图像信号处理芯片,支持MIPI和 DVP 接口,最 大支持 5M sensor接入。内置高性能ISP处理器,支持3D降噪和数字宽动态。标清模拟输出支 持960H,高清模拟输出支持HDCCTV 720P/1080P/4M/5M。高度集成…...

机器学习无处不在,AI顺势而为,创新未来

机器学习无处不在: 1、推荐广告和搜索:推广搜不分家,属于数据科学中,对人的行为进行理解 2、计算机视觉CV:对人看到的东西进行理解 3、自然语言处理:对人交流的东西进行理解 4、数据挖掘和数据分析&…...

pandas处理json的相关操作

Pandas 是一个强大的数据处理库,它提供了丰富的功能来处理 JSON 数据。以下是 Pandas 中处理 JSON 的所有常见操作: 1. 读取 JSON 文件 使用 pandas.read_json() 函数可以从 JSON 文件或 JSON 字符串中读取数据。 从 JSON 文件读取 import pandas as …...

linux内存泄露定位过程(kmemleak和slab debug)

1,当遇到内存增加过多时,或者由于内存导致系统oom时我们怎么定位呢,定位时需要确认是内核态还是用户态内存泄露。 排查步骤 top查看VIRT和RES内存 rootubuntu2004:~# top top - 21:05:39 up 7 min, 1 user, load average: 5.01, 4.09, 2.…...

2025年安卓面试复习总结

文章目录 深入理解并熟练运用常用设计模式及反射原理,能够自定义注解及泛型,多次通过设计模式对 app 代码进行高效重构,显著提升代码的可维护性与扩展性。设计模式自定义注解泛型Kotlin泛型 精通多线程原理,对 ThreadPoolExecutor…...

JS scrollIntoView 技巧揭秘:解锁网页流畅交互

文章目录 一.基本概念二.语法和参数基本语法:element.scrollIntoView();参数详解: 三.应用场景和示例场景一:点击目录点位到相应的位置React 示例代码:Vue3 示例代码: 场景二:轮播图定位到指定图片示例代码…...

【Ubuntu 24.04】常见问题解决

1.24开启3D加速黑屏 参考文章:Ubuntu24开机黑屏,VMware卡死,虚拟机繁忙解决方案 没有3D加速就没有动画,所以我们需要开启3D加速,但是直接开启3D加速会黑屏 由于Ubuntu24内部的图形加速驱动异常,因此需要更新…...

前端依赖安装指南

前端依赖安装指南 一、NVM管理工具安装 1.在 Windows 上安装 下载 NVM for Windows 的安装程序:(最新版本可以在 nvm-windows Releases 页面 找到)运行下载的安装程序并按步骤操作。 2.配置 NVM exe安装自动配置环境变量 3. 验证 NVM 安装 验证 NVM 是否成功…...

灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设

项目背景 本项目聚焦于黑龙江某一灌区的现代化改造工程,该灌区覆盖广阔,灌溉面积高达7.5万亩,地域上跨越6个乡镇及涵盖17个村庄。项目核心在于通过全面的信息化建设,强力推动节水灌溉措施的实施,旨在显著提升农业用水的…...

ELK实战(最详细)

一、什么是ELK ELK是三个产品的简称:ElasticSearch(简称ES) 、Logstash 、Kibana 。其中: ElasticSearch:是一个开源分布式搜索引擎Logstash :是一个数据收集引擎,支持日志搜集、分析、过滤,支持大量数据…...

《大型语言模型与强化学习的融合:探索问题的新解决方案与开源验证需求》

强化学习在2020年代初期通过开源项目如CleanRL的多学习者PPO算法取得了显著进展,但在语言模型领域未能充分利用其潜力 1. 开源项目CleanRL的贡献 CleanRL 是一个致力于提供简单、高效且易于理解的强化学习(RL)算法实现的开源项目。该项目通…...

springboot 默认的 mysql 驱动版本

本案例以 springboot 3.1.12 版本为例 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> </parent> 点击 spring-…...

10分钟快速了解OceanGPT(沧渊)

10分钟快速了解OceanGPT(沧渊) 海洋科学任务的大语言模型——OceanGPT OceanGPT是如何训练的?为了训练 OceanGPT (沧渊) ,收集了一个跨越多个领域的海洋科学语料库。由于每个子领域和主题都有其独特的数据特征和模式,因此提出了一个特定于领域的指令生成框架,称为 DoDirec…...

wordpress 离线更新/人民网 疫情

网友 oneway_01 问了我一个问题&#xff0c;对于工作流形业务建模提出了一些疑问。这是好问题&#xff0c;值得讨论&#xff0c;特意将它发表出来。另一方面&#xff0c;能够做出这样的思考&#xff0c;说明oneway_01同学对用例方法的认知已经很深入了。恭喜一下&#xff01;**…...

西客站网站建设/百度下载免费安装

我觉得我很亲近&#xff0c;但我无法解决这个问题。我只想打印字段tpnc的数值结果。只有一个数字要打印。在 我的代码是&#xff1a;import httplib, urllib, base64, json, requests headers { # Request headers Ocp-Apim-Subscription-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX…...

wordpress home插件/百度关键词排名手机

"运行时"要求各个类型最终都从 System.Object 派生。&#xff08;显示继承/隐式继承&#xff09; 提供公共方法&#xff08;public&#xff09;&#xff1a; Equals 判断两个对象相等&#xff0c;true 表示相等。GetHashCode 返回对象的哈希值。ToString 默认返回类型…...

底价网站建设/网络公司排名

青岛大学10数据结构911计算机专业综合青岛大学2013年硕士研究生入学考试试题科目代码&#xff1a; 911 科目名称&#xff1a; 计算机专业综合 (共 13 页)请考生写明题号&#xff0c;将答案全部答在答题纸上&#xff0c;答在试卷上无效须知&#xff1a;本试卷共包括4门专业课程试…...

做网站收费吗/网络卖货平台有哪些

#第一种方法 s1 “k:1|k1:2|k2:3|k3:4” d {} print(s1) s2 s1.split(’|’) print(s2) for n in s2: n1 n.split("? d[str(n1[0])] n1[1] print(d) #第二种方法 s1 “k:1|k1:2|k2:3|k3:4” d {} print(s1) s2 s1.split(’|’) print(s2) for n in s2: n1 …...

wordpress olve/长沙网站制作

为什么80%的码农都做不了架构师&#xff1f;>>> 转载于:https://my.oschina.net/liyangke/blog/2981231...