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

news2024/11/27 14:49:01

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 中添加依赖。

<!-- playwright依赖 -->
<dependency>
  <groupId>com.microsoft.playwright</groupId>
  <artifactId>playwright</artifactId>
  <version>1.29.0</version>
</dependency>
<!-- maven编译使用的插件 -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.10.1</version>
</plugin>
  1. 创建一个项目

import com.microsoft.playwright.*;
import java.nio.file.Paths;

public class App {
  public static void main(String[] args) {
    try (Playwright playwright = Playwright.create()) {
      Browser browser = playwright.webkit().launch();
      Page page = browser.newPage();
      page.navigate("http://whatsmyuseragent.org/");
      page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("example.png")));
    }
  }
}
  1. 编译并执行(注意:第一次编译执行的时候需要下载对应的依赖,耗时比较久。)

mvn compile exec:java -Dexec.mainClass="包名.文件名"

Codegen 录制功能

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

设定展示窗口大小

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

  • Python 版本命令:

# 设定展示窗口大小
playwright codegen --viewport-size=800,600 地址
  • Java 版本命令:

# 设定展示窗口大小
mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen --viewport-size=800,600 地址"

指定设备

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

  • Python 版本命令:

# 指定设备
playwright codegen --device="iPhone 11" 地址
  • Java 版本命令:

# 指定设备
mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args='codegen --device="iPhone 11" 地址'

解决登录认证问题

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

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

  • Python 版本完整命令:

# 保存登录状态
playwright codegen --save-storage=auth.json
# 加载认证信息
playwright codegen --load-storage=auth.json 地址
  • Java 版本完整命令:

# 保存登录状态
mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="codegen  --save-storage=auth.json"
# 加载认证信息
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 版本的实现

from playwright.sync_api import sync_playwright, expect
def test_playwright():
    # 实例化playwright
    playwright = sync_playwright().start()
    # 打开chrome浏览器,headless默认是True,无头模式,这里设置为False方便查看效果
    browser = playwright.chromium.launch(headless=False)
    # 打开一个窗口页面
    page = browser.new_page()
    # 在当前窗口页面打开测试人网站
    page.goto("https://ceshiren.com/")
    # 定位搜索按钮并点击
    page.locator("#search-button").click()
    # 定位搜索框并输入web自动化
    page.locator("#search-term").fill("web自动化")
    # 使用keyboard.down模拟键盘的enter事件
    page.keyboard.down("Enter")
    # 断言搜索结果
    result = page.locator(".list>li:nth-child(1) .topic-title>span")
    expect(result).to_contain_text("自动化测试")
    # 截图
    page.screenshot(path='screenshot.png')
    # 用例完成后先关闭浏览器
    browser.close()
    # 然后关闭playwright服务
    playwright.stop()
  • Java 版本的实现

import com.microsoft.playwright.*;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.nio.file.Paths;

import static com.microsoft.playwright.Playwright.create;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class PlaywrightTest {
    public static Playwright playwright;
    @BeforeAll
    static void setupClass(){
        playwright = create();
    }
    @Test
    void playwrightDemo() {
        // 初始化一个浏览器实例
        Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
        // 初始化一个page实例
        Page page = browser.newPage();
        // 打开 ceshiren 页面
        page.navigate("https://ceshiren.com/");
        // 点击搜索按钮
        page.locator("#search-button").click();
        // 输入搜索信息
        page.locator("#search-term").fill("Appium");
        // 按下回车按钮
        page.keyboard().down("Enter");
        // 获取搜索结果的第一条
        Locator result = page.locator(".results .item:nth-child(1) .topic-title");
        // 断言搜索结果是否包含关键字
        assertTrue(result.innerText().contains("Appium"));
    }
}

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 版本实现

from playwright.sync_api import sync_playwright, expect


def test_ceshiren():
    # 实例化一个playwright对象
    playwright = sync_playwright().start()
    # 启动谷歌浏览器,模式使用无头模式
    browser = playwright.chromium.launch(headless=False)
    # =========== trace 的配置
    # 1. 生成 一个 context 实例
    context = browser.new_context()
    # 2. 添加 trace 的配置信息
    context.tracing.start(screenshots=True, snapshots=True, sources=True)
    # 3. 使用填加了trace 配置的 context 实例,去实例化一个page对象
    page = context.new_page()
    # 跳转到ceshiren页面
    page.goto("https://ceshiren.com/")
    # 点击搜索按钮, 输入css定位
    page.locator("#search-button").click()
    # 输入搜索的内容, 输入css定位
    page.locator("#search-term").fill("Appium")
    # 按下回车键
    page.keyboard.down("Enter")
    # time.sleep(3)
    result = page.locator(".results .item:nth-child(1) .topic-title")
    expect(result).to_contain_text("Appium")
    # 4. 在关闭浏览器之前,一定要结束trace
    context.tracing.stop(path="ceshiren.zip")
    browser.close()
  • Java 版本实现

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

import com.microsoft.playwright.*;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.nio.file.Paths;

import static org.junit.jupiter.api.Assertions.assertTrue;
// 直接调用 trace 报错,报错原因是 trace 需要设置 PLAYWRIGHT_JAVA_SRC 一个环境变量
// com.microsoft.playwright.PlaywrightException: Source root directory must be specified via PLAYWRIGHT_JAVA_SRC environment variable when source collection is enabled
// 解决方案: 设置 PLAYWRIGHT_JAVA_SRC=src/test/java
public class PlaywrightTraceTest {
    public static Playwright playwright;

    @BeforeAll
    static void setupClass(){
        playwright = Playwright.create();

    }
    @Test
    void ceshiren(){
        // 默认是使用无头模式,添加 false 的配置
        Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
        BrowserContext context = browser.newContext();
        // 添加trace 的配置
        // 添加trace配置
        context.tracing().start(new Tracing.StartOptions()
                .setScreenshots(true)
                .setSnapshots(true)
                .setSources(true));
        Page page = context.newPage();
//        Page page = browser.newPage();
        page.navigate("https://ceshiren.com/");
        // 使用css定位
        // 点击搜索框
        page.locator("#search-button").click();
        // 输入搜索内容
        page.locator("#search-term").fill("Appium");
        // 按下回车键
        page.keyboard().down("Enter");
        // 找到第一个标题
        String res = page.locator(".results .item:nth-child(1) .topic-title").innerText();
//        System.out.println(res);
        page.screenshot(new Page.ScreenshotOptions()
                .setPath(Paths.get("ceshiren.png")));
        // 在测试用例执行完成之后,结束追踪
        context.tracing().stop(new Tracing.StopOptions()
                .setPath(Paths.get("ceshiren.zip")));
        // 断言找到的标题里面包含Appium关键字
        assertTrue(res.contains("Appium"));
    }

}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx编译安装vts监控模块

目录 1、环境准备 2、编译安装Nginx源码 2.1、安装依赖 2.2、编译安装Nginx 2.3验证Nginx安装 3、Nginx添加配置 3.11、Http模块下面添加 3.1.2、添加status访问页面 4、启动Nginx 4.3、访问前端页面 1、环境准备 参考Github vts模块参考Github nginx-1.20.2.tar.…

《Kotlin核心编程》笔记:val 和 var 字符串

Kotin重要特性&#xff1a;类型推导&#xff1a;定义变量不再需要显示声明类型&#xff0c;由编译器自动推导出变量的类型 如 val a "hello” val b 5 val c 10L表达式函数: fun sum(x: Int, y: Int) x y // 省略了{}&#xff0c;Kotlin支持这种用单行表达式与等号…

Git——git分支操作

1 什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

ArcGIS基础实验操作100例--实验52导出点要素的坐标值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验52 导出点要素的坐标值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

flutter:如何实现局部导航管理?

引言 今天&#xff0c;小编给大家分享如何在 flutter 中实现 ‘局部导航’。开始之前我们先来统一一下关于 局部导航 的概念。 局部导航是什么&#xff1f; 我们在 flutter 中使用 navigator 来管理 app 的页面堆栈&#xff0c;主要包括 push、pop 这两种操作。而当我们UI设…

gitee实现项目托管

一、下载git官网链接&#xff1a;Git - Downloads安装参考:https://blog.csdn.net/weixin_44950987/article/details/102619708二、登录gitee&#xff08;码云&#xff09;&#xff0c;添加SSH公钥2.1、生成SSH公钥过程2.2、打开刚刚下载的git 然后跟着步骤来&#xff1a;2.3、…

C程序设计教程(02)—— 概述部分练习题

C程序设计教程&#xff08;02&#xff09;—— 概述部分练习题 一、填空题 1、结构化程序设计采用顺序结构、&#xff08;分支结构或选择结构&#xff09;和循环结构等三种基本结构编写程序。 2、程序由&#xff08;一个或多个函数&#xff09;组成&#xff0c;其中必须有且…

2.ISAAC 环境配置

ISAAC 环境配置 本文档介绍了如何开始使用 Isaac SDK 和 Isaac Sim 进行开发。 完成本文档中的步骤后&#xff0c;您应该准备好开始使用 Isaac SDK 开发机器人应用程序。 预安装 Isaac 目前仅支持 Ubuntu 18.04 LTS 从您的工作站进行开发和模拟。 请确保在您的工作站上安装最…

机器学习记录

概念辨析&#xff1a; 人工智能包含机器学习&#xff0c;机器学习包含深度学习 机器学习 机器学习约等于&#xff1a;looking for Function 深度学习&#xff1a;Function就是一个类神经网络 如果输出是一个数值就就叫回归 如果输出是几种类别就是分类 自监督学习为机器学习…

逻辑漏洞渗透与攻防(四)之任意账号注册

目录 任意账号注册 未验证邮箱/手机号 批量注册 个人信息伪造 前端验证审核绕过 邮箱/手机号注册激活验证绕过 用户名覆盖 任意账号注册 未验证邮箱/手机号 未验证邮箱/手机号&#xff0c;目前很多应用为了方便用户记录自己的用户名与密码&#xff0c;都可以使用邮箱…

【Spring6核心源码系列】IOC之BeanDefinition的封装

哎呀&#xff0c;又是午夜时分&#xff0c;又是一个失眠的夜晚&#xff0c;和去年一样&#xff0c;记得去年今日&#xff0c;也是睡不着觉&#xff0c;就注册了csdn的账号&#xff0c;开始写东西&#xff0c;csdn真是深夜最好的安魂剂。 Spring都发布了6.0&#xff0c;这不赶紧…

什么是JSP,JSP的运行原理是什么?

在动态Web项目的开发中&#xff0c;经常需要动态生成HTML。内容(如系统中的当前在线人数需要动态生成)。如果使用Servlet实现HTML页面数据的统计&#xff0c;则需要使用大量的输出语句。同时&#xff0c;如果静态内容和动态内容混合在一起&#xff0c;那么也将导致程序非常臃肿…

Bandit算法学习[网站优化]03——Softmax 算法

Bandit算法学习[网站优化]03——Softmax 算法 参考资料 White J. Bandit algorithms for website optimization[M]. " O’Reilly Media, Inc.", 2013.https://github.com/johnmyleswhite/BanditsBook 实验环境&#xff1a;jupyter python 3.7 项目地址&#xff1…

【实践】百度APP Feed流业务架构变迁思考和升级实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图‍基于深度学习的个性化推荐系统实时化改造与升级.pdf推荐技术在vi…

图像数字识别、数字分割(OCR识别,毕业设计)

基本图像处理流程 这是我在测试图像处理中使用的原始图像。它有一些眩光点&#xff0c;但是图像相当干净。让我们逐步完成获取此源图像的过程&#xff0c;并尝试将其分解为单个数字。 影像准备 在开始图像处理流程之前&#xff0c;我们决定先调整一些图像属性&#xff0c;然后…

【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

目录 一、升级版的环形链表 1、题目说明 2、题目解析 二、复制带随机指针的链表 1、题目说明 2、题目解析 一、升级版的环形链表 1、题目说明 题目链接&#xff1a;升级版的环形链表 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&am…

桌面客户端性能提升,优化使用资源消耗

十二月末&#xff0c;MQTT X 团队发布了 1.9.1-beta.1 版本&#xff0c;这也是 MQTT X 的首个公共测试版。我们希望能够通过测试版本&#xff0c;让更多用户参与到 MQTT X 的测试中来&#xff0c;和我们一起打造一个更加稳定的版本&#xff0c;进而帮助用户轻松使用 MQTT X 完成…

LabVIEW传递接收C/C++DLL指针

LabVIEW传递接收C/CDLL指针传递指针C和C函数通常在其函数原型中接收指针。指针基本上是一个表示内存地址的整数值。要将指向DLL的指针&#xff08;即值的内存地址&#xff09;从LabVIEW传递到DLL&#xff0c;必须配置调用库函数节点&#xff0c;以通过引用而不是值传递数据。不…

【Linux】vim文本编辑器的使用

目录 一、为什么要学vim 1.原因 2.简单介绍 3.准备工作 二、vim最小集 1.各模式功能 2.编写代码示例 三、vim指令集 1.命令模式 1.1光标移动 1.2复制&#xff08;剪切&#xff09;粘贴 1.3 撤销 1.4 替换 / 删除/大小写切换 2.底行模式 2.1本文件内操作 2.2文件…

KITTI数据集可视化(二):点云多种视图与标注展示的可视化代码解析

如有错误&#xff0c;恳请指出。 文章目录1. 在图像上绘制2d、3d标注框2. 在图像上绘制Lidar投影3. Lidar绘制前视图(FOV)4. Lidar绘制前视图(FOV)3d box5. Lidar绘制鸟瞰图(BEV)6. Lidar绘制鸟瞰图(BEV)2d box7. Lidar绘制全景图(RV)8. Lidar绘制全景图(RV)2d box在对KITTI数据…