测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架,这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外,同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。

由此可见,Playwright 不仅具备 Selenium 多语言、跨平台、多浏览器的优点。相较于 Selenium,Playwright 还有更加强大的优势。

Playwright 有哪些优点
  • 支持所有流行的浏览器。

  • 速度更快,更可靠的执行。

  • 更强大的自动化测试配置。

  • 强大的工具库:

    • Codegen:通过记录你的操作来生成测试。 将它们保存为任何语言。

    • Playwright inspector: 检查页面、生成选择器、逐步执行测试、查看点击点、探索执行日志。

    • Trace Viewer:捕获所有信息以调查测试失败,Playwright 跟踪包含测试执行截屏、实时 DOM 快照、动作资源管理器、测试源等等。

环境安装

Python 版本

  1. 安装 playwright 插件:pip install pytest-playwright

  2. 安装所需的浏览器:playwright install

Java 版本

  1. 在 pom.xml 中添加依赖。

 
  1. <!-- playwright依赖 -->

  2. <dependency>

  3. <groupId>com.microsoft.playwright</groupId>

  4. <artifactId>playwright</artifactId>

  5. <version>1.29.0</version>

  6. </dependency>

  7. <!-- maven编译使用的插件 -->

  8. <plugin>

  9. <groupId>org.apache.maven.plugins</groupId>

  10. <artifactId>maven-compiler-plugin</artifactId>

  11. <version>3.10.1</version>

  12. </plugin>

  1. 创建一个项目

 
  1. import com.microsoft.playwright.*;

  2. import java.nio.file.Paths;

  3. public class App {

  4. public static void main(String[] args) {

  5. try (Playwright playwright = Playwright.create()) {

  6. Browser browser = playwright.webkit().launch();

  7. Page page = browser.newPage();

  8. page.navigate("http://whatsmyuseragent.org/");

  9. page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("example.png")));

  10. }

  11. }

  12. }

  1. 编译并执行(注意:第一次编译执行的时候需要下载对应的依赖,耗时比较久。)

mvn compile exec:java -Dexec.mainClass="包名.文件名"
Codegen 录制功能

Codegen 在启动录制的时候,可以针对于不同的场景,设定不同的参数。比如设置一个特殊的窗口分辨率、颜色主题、指定手机设备等操作。

设定展示窗口大小

通过命令的--viewport-size参数可以指定录制时窗口展示的尺寸。用来测试当指定一个特殊的窗口展示尺寸时,界面显示是否还正常。​

  • Python 版本命令:

  1. # 设定展示窗口大小

  2. playwright codegen --viewport-size=800,600 地址

  • Java 版本命令:

  1. # 设定展示窗口大小

  2. mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen --viewport-size=800,600 地址"

指定设备

通过命令的--device参数可以指定录制时手机的设备型号。用来测试在使用手机浏览时,界面展示是否正常。

  • Python 版本命令:

  1. # 指定设备

  2. playwright codegen --device="iPhone 11" 地址

  • Java 版本命令:

  1. # 指定设备

  2. mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args='codegen --device="iPhone 11" 地址'

解决登录认证问题

通过参数--save-storage可以将认证信息保存在一个文件中。在执行命令后,会自动启动窗口,登录账号之后,手动关闭窗口。即可将认证信息保存下来:

然后通过--load-storage参数,可以再次启动浏览器,进入上次登录后的网站,发现已经登录成功:

  • Python 版本完整命令:

  1. # 保存登录状态

  2. playwright codegen --save-storage=auth.json

  3. # 加载认证信息

  4. playwright codegen --load-storage=auth.json 地址

  • Java 版本完整命令:

  1. # 保存登录状态

  2. mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen --save-storage=auth.json"

  3. # 加载认证信息

  4. mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen --load-storage=auth.json github.com/microsoft/playwright"

编写测试用例

以下为测试人论坛搜索功能的测试步骤,请使用 Playwright 自动化测试代码实现:

  1. 打开测试人论坛https://ceshiren.com/。

  2. 点击搜索按钮。

  3. 输入搜索信息,按下回车键。

  4. 查看搜索的结果是否包含搜索的信息。

  • Python 版本的实现

  1. from playwright.sync_api import sync_playwright, expect

  2. def test_playwright():

  3. # 实例化playwright

  4. playwright = sync_playwright().start()

  5. # 打开chrome浏览器,headless默认是True,无头模式,这里设置为False方便查看效果

  6. browser = playwright.chromium.launch(headless=False)

  7. # 打开一个窗口页面

  8. page = browser.new_page()

  9. # 在当前窗口页面打开测试人网站

  10. page.goto("https://ceshiren.com/")

  11. # 定位搜索按钮并点击

  12. page.locator("#search-button").click()

  13. # 定位搜索框并输入web自动化

  14. page.locator("#search-term").fill("web自动化")

  15. # 使用keyboard.down模拟键盘的enter事件

  16. page.keyboard.down("Enter")

  17. # 断言搜索结果

  18. result = page.locator(".list>li:nth-child(1) .topic-title>span")

  19. expect(result).to_contain_text("自动化测试")

  20. # 截图

  21. page.screenshot(path='screenshot.png')

  22. # 用例完成后先关闭浏览器

  23. browser.close()

  24. # 然后关闭playwright服务

  25. playwright.stop()

  • Java 版本的实现

  1. import com.microsoft.playwright.*;

  2. import org.junit.jupiter.api.BeforeAll;

  3. import org.junit.jupiter.api.Test;

  4. import java.nio.file.Paths;

  5. import static com.microsoft.playwright.Playwright.create;

  6. import static org.junit.jupiter.api.Assertions.assertEquals;

  7. import static org.junit.jupiter.api.Assertions.assertTrue;

  8. public class PlaywrightTest {

  9. public static Playwright playwright;

  10. @BeforeAll

  11. static void setupClass(){

  12. playwright = create();

  13. }

  14. @Test

  15. void playwrightDemo() {

  16. // 初始化一个浏览器实例

  17. Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));

  18. // 初始化一个page实例

  19. Page page = browser.newPage();

  20. // 打开 ceshiren 页面

  21. page.navigate("https://ceshiren.com/");

  22. // 点击搜索按钮

  23. page.locator("#search-button").click();

  24. // 输入搜索信息

  25. page.locator("#search-term").fill("Appium");

  26. // 按下回车按钮

  27. page.keyboard().down("Enter");

  28. // 获取搜索结果的第一条

  29. Locator result = page.locator(".results .item:nth-child(1) .topic-title");

  30. // 断言搜索结果是否包含关键字

  31. assertTrue(result.innerText().contains("Appium"));

  32. }

  33. }

Trace Viewer 追踪功能

在做自动化测试过程中,常常会碰到的一个痛点问题:自动化测试明明发现了代码的 BUG,但是复现比较困难,研发又不认账。

碰到这种场景,Playwright 的 Trace 功能可以完美的解决。因为一旦设定了 Trace,代码执行过程中的每一个步骤,都有详细的截图,日志,时长的信息,比起功能测试的过程记录信息还要更加全面。

而且 Trace 的使用也非常简单,整体来说只需要两个步骤:

  1. 在代码中添加 Trace 配置。

  2. 打开 trace 记录文件,查看 trace 记录。

在代码中添加配置主要注意以下几点:

  1. 通过 browser 实例生成一个 context 实例

  2. 通过 context 实例的 tracing 配置启动参数

  3. 通过 context 实例生成 page 实例对象。并且想要 trace 的操作,必须都使用这个 page 实例对象

  4. 在想要结束追踪的地方,添加 tracing 的结束配置。

  • Python 版本实现

  1. from playwright.sync_api import sync_playwright, expect

  2. def test_ceshiren():

  3. # 实例化一个playwright对象

  4. playwright = sync_playwright().start()

  5. # 启动谷歌浏览器,模式使用无头模式

  6. browser = playwright.chromium.launch(headless=False)

  7. # =========== trace 的配置

  8. # 1. 生成 一个 context 实例

  9. context = browser.new_context()

  10. # 2. 添加 trace 的配置信息

  11. context.tracing.start(screenshots=True, snapshots=True, sources=True)

  12. # 3. 使用填加了trace 配置的 context 实例,去实例化一个page对象

  13. page = context.new_page()

  14. # 跳转到ceshiren页面

  15. page.goto("https://ceshiren.com/")

  16. # 点击搜索按钮, 输入css定位

  17. page.locator("#search-button").click()

  18. # 输入搜索的内容, 输入css定位

  19. page.locator("#search-term").fill("Appium")

  20. # 按下回车键

  21. page.keyboard.down("Enter")

  22. # time.sleep(3)

  23. result = page.locator(".results .item:nth-child(1) .topic-title")

  24. expect(result).to_contain_text("Appium")

  25. # 4. 在关闭浏览器之前,一定要结束trace

  26. context.tracing.stop(path="ceshiren.zip")

  27. browser.close()

  • Java 版本实现

注意:Java 版本需要配置临时环境变量PLAYWRIGHT_JAVA_SRC=src/test/java

  1. import com.microsoft.playwright.*;

  2. import org.junit.jupiter.api.BeforeAll;

  3. import org.junit.jupiter.api.Test;

  4. import java.nio.file.Paths;

  5. import static org.junit.jupiter.api.Assertions.assertTrue;

  6. // 直接调用 trace 报错,报错原因是 trace 需要设置 PLAYWRIGHT_JAVA_SRC 一个环境变量

  7. // com.microsoft.playwright.PlaywrightException: Source root directory must be specified via PLAYWRIGHT_JAVA_SRC environment variable when source collection is enabled

  8. // 解决方案: 设置 PLAYWRIGHT_JAVA_SRC=src/test/java

  9. public class PlaywrightTraceTest {

  10. public static Playwright playwright;

  11. @BeforeAll

  12. static void setupClass(){

  13. playwright = Playwright.create();

  14. }

  15. @Test

  16. void ceshiren(){

  17. // 默认是使用无头模式,添加 false 的配置

  18. Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));

  19. BrowserContext context = browser.newContext();

  20. // 添加trace 的配置

  21. // 添加trace配置

  22. context.tracing().start(new Tracing.StartOptions()

  23. .setScreenshots(true)

  24. .setSnapshots(true)

  25. .setSources(true));

  26. Page page = context.newPage();

  27. // Page page = browser.newPage();

  28. page.navigate("https://ceshiren.com/");

  29. // 使用css定位

  30. // 点击搜索框

  31. page.locator("#search-button").click();

  32. // 输入搜索内容

  33. page.locator("#search-term").fill("Appium");

  34. // 按下回车键

  35. page.keyboard().down("Enter");

  36. // 找到第一个标题

  37. String res = page.locator(".results .item:nth-child(1) .topic-title").innerText();

  38. // System.out.println(res);

  39. page.screenshot(new Page.ScreenshotOptions()

  40. .setPath(Paths.get("ceshiren.png")));

  41. // 在测试用例执行完成之后,结束追踪

  42. context.tracing().stop(new Tracing.StopOptions()

  43. .setPath(Paths.get("ceshiren.zip")));

  44. // 断言找到的标题里面包含Appium关键字

  45. assertTrue(res.contains("Appium"));

  46. }

  47. }

在执行完成之后,查看项目根目录是否有生成对应的追踪文件夹。如果正常生成,即可使用以下命令查看 trace 的结果。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/581497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

数据库常考理论

1 笛卡尔积X与自然连接∞的区别 2 求候选键 3 无损连接及函数依赖 4 范式判断 笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&#xff0c;并且S1中每条记录依次和S2中所有记录 组合成一条记录&#xff0c;最终属性列为S1S2属性列&#xff0c;记录数为S1*S2记…

mamba 和conda 安装R包

**1. 下载miniconda3 ** wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh这个命令是在linux终端中输入的,miniconda3管理起来更方便。 2. 安装miniconda3 sh Miniconda3-latest-Linux-x86_64.sh接下来会有一些回车(ente…

「C++ 内存管理篇 1」C++动态内存分配

目录 〇、C语言的动态内存分配方式 一、C的动态内存分配方式 1. 什么是C的动态内存分配&#xff1f; 2. 为什么需要C的动态内存分配&#xff1f; a. new的优势 b. new的不足 c. delete的优势 d. 总结 3. 怎么使用new和delete? a. 对于内置类型 b. 对于自定义类型 c. 为什么ne…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

Flutter应用开发-几种保存简单配置的方式

文章目录 简单配置保存的几种方式使用 shared_preferences 插件优点缺点 使用 hive 插件优点 缺点使用文件存储&#xff1a;优点缺点 简单配置保存的几种方式 在 Flutter 开发的 Android 应用中&#xff0c;保存应用配置并下次启动时读取&#xff0c;有以下几种比较合适的方式…

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

Docker | 入门:安装与配置

Docker | 入门&#xff1a;安装与配置 Docker 和传统虚拟机区别 对于传统虚拟机&#xff1a; 虚拟出一套硬件&#xff0c;运行一个完整的操作系统&#xff0c;并在这个操作系统上安装和运行软件。 对于 Docker: 将一个个容器隔离开。 容器内的应用直接运行在宿主机的内容&am…

软件模型(简洁明了)

《 软件测试基础持续更新中》 一、软件开发模型 1.1 大爆炸模型 优点&#xff1a;思路简单&#xff0c; 通常可能是开发者的“突发奇 想” 缺点&#xff1a;开发过程是非工程化的&#xff0c;随意性大&#xff0c;结果不可预知 测试&#xff1a;开发任务完成后&#xff0c;…

一个自卑的人怎么变得自信

一个自卑的人怎么变得自信 自卑感是一种常见的心理状态&#xff0c;它可能源于个人对自己能力、外貌、价值等方面的负面评价。自卑感不仅会影响一个人的情绪状态&#xff0c;还可能阻碍其在生活、学习和工作中的表现。然而&#xff0c;自信并非一蹴而就的品质&#xff0c;它需要…

基础款:Dockerfile 文件

# bash复制代码# 使用 Node.js 16 作为基础镜像 # 指定一个已经存在的镜像作为模版&#xff0c;第一条必须是from FROM node:16# 将当前工作目录设置为/app # WORKDIR /app# 方法一&#xff1a;用dockerfile命令&#xff1a;进行下载打包文件 # 将 package.json 和 package-loc…

MySQL 之 主从复制

1. 主配置文件&#xff08;win下是my.ini&#xff0c;linux下是my.cnf&#xff09; #mysql 服务ID,保证整个集群环境中唯一 server-id1 #mysql binlog 日志的存储路径和文件名 log-bin/var/lib/mysql/mysqlbin #错误日志,默认已经开启 #log-err #mysql的安装目录 #basedir #mys…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…

穷人想要改命,是选择打工还是创业? 2024创业项目小成本!2024轻资产创业!2024风口行业!2024普通人做什么行业赚钱?

今日话题穷人想要改命&#xff0c;是选择打工还是创业&#xff1f; 改命的方式就是跳进水里&#xff0c;忍受呛水&#xff0c;学会游泳&#xff0c;这个过程越年轻实现越好&#xff0c;就像小鹰往山崖下跳&#xff0c;要么学会飞&#xff0c;要么就狠狠的被摔死。打工思维和创…