从零开发短视频电商 端到端测试Playwright实战CSDN搜索

文章目录

    • 背景
    • 脚本录制
    • 配置
      • 窗口大小
      • UserAgent
      • 设置全局默认超时时间
      • 保留登录身份信息
      • 加载登录身份信息
    • 测试框架建议

背景

假设我是csdn的测试人员,我想测试如下流程:

1.用户进入站点https://www.csdn.net

2.在搜索框输入"lakernote"

3.点击搜索按钮

4.切换为用户tab

5.断言列表中是否包含lakernote

相关源码在:https://gitee.com/lakernote/easy-auto-uitest

Playwright 内置了自动等待功能,它会在执行操作之前等待元素可操作。

Playwright 提供了assertThat重载来编写断言。

浏览器上下文 Playwright 为每个测试创建一个浏览器上下文。浏览器上下文相当于一个全新的浏览器配置文件。这提供了零开销的完整测试隔离。创建新的浏览器上下文只需几毫秒。

登录一次 保存上下文的身份验证状态并在所有测试中重用它。这绕过了每个测试中的重复登录操作,但提供了独立测试的完全隔离。

脚本录制

当您在浏览器中执行操作时,Playwright 的录制器能够为您生成测试代码。录制器将查看您的页面并找出最佳定位器,确定角色、文本和测试 ID 定位器的优先级。如果生成器找到与定位器匹配的多个元素,它将改进定位器,使其具有唯一标识目标元素的弹性。

运行下面代码以启动录制器

import com.microsoft.playwright.*;

public class Example {
  public static void main(String[] args) {
    try (Playwright playwright = Playwright.create()) {
      BrowserType chromium = playwright.chromium();
      // Make sure to run headed.
      Browser browser = chromium.launch(new BrowserType.LaunchOptions().setHeadless(false));
      // Setup context however you like.
      BrowserContext context = browser.newContext(/* pass any options */);
      context.route("**/*", route -> route.resume());
      // Pause the page, and start recording manually.
      Page page = context.newPage();
      page.pause();
    }
  }
}

录制器各按钮功能介绍

配置

窗口大小

设置浏览器页面的视口大小。

browser.newContext(new Browser.NewContextOptions()
                    .setViewportSize(1280, 720)
                    .setUserAgent("laker"));

UserAgent

browser.newContext(new Browser.NewContextOptions()
  					.setUserAgent("My user agent"));

设置全局默认超时时间

BrowserContext context = browser.newContext();
// 设置全局等待时间,默认是30s
context.setDefaultTimeout(5000); // 5秒

将更改所有接受超时选项的方法的默认最大时间。
注意:Page.setDefaultNavigationTimeout()、Page.setDefaultTimeout() 和 BrowserContext.setDefaultNavigationTimeout() 优先于 BrowserContext.setDefaultTimeout()。

保留登录身份信息

我们在录制脚本时配置storageState,用于保存浏览器中cookie和localStorage的信息到指定文件。

这对于单独记录身份验证步骤并在稍后记录更多测试时重复使用非常有用。

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

public class Example {
    public static void main(String[] args) {
        try (Playwright playwright = Playwright.create()) {
            BrowserType chromium = playwright.chromium();
            // Make sure to run headed.
            Browser browser = chromium.launch(new BrowserType.LaunchOptions().setHeadless(false));
            // Setup context however you like.
            BrowserContext context = browser.newContext(new Browser.NewContextOptions()
                    .setViewportSize(1280, 720)
                    .setUserAgent("laker"));
            context.route("**/*", Route::resume);
            // Pause the page, and start recording manually.
            Page page = context.newPage();
            page.pause();
            // 把登录状态,即浏览器的cookie和localstorage存储到文件中。
            context.storageState(new BrowserContext.StorageStateOptions().setPath(Paths.get("auth.json")));
        }
    }
}

执行身份验证并关闭浏览器后(关闭一定要在Playwright Inspector点击关闭),auth.json将包含您可以在测试中重用的存储状态。

确保auth.json仅在本地使用,因为它包含敏感信息。将其添加到.gitignore

加载登录身份信息

加载上面的auth.json`所有cookie和localStorage将被恢复,使大多数 Web 应用程序进入经过身份验证的状态,而无需再次登录。这意味着您可以继续从登录状态生成测试。

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.chromium().launch(new BrowserType.LaunchOptions()
                    .setHeadless(false));
            BrowserContext context = browser.newContext(new Browser.NewContextOptions()
                    .setViewportSize(1280, 720)
                    // 加载cookie和localstorage, 模拟登录态
                    .setStorageStatePath(Paths.get("auth.json")));
            Page page = context.newPage();
            page.navigate("https://gitee.com/lakernote/easy-admin");
            // 将停止执行脚本
            TimeUnit.SECONDS.sleep(20);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

你可以观察下是否已经处于登录态了。

测试框架建议

Playwright 和 Browser 实例可以在测试之间重用,以获得更好的性能。

我们建议在新的 BrowserContext 中运行每个测试用例,这样浏览器状态将在测试之间隔离。

JUnit中,您可以在**@BeforeAll方法中初始化PlaywrightBrowser并在@AfterAll**中销毁它们。

在下面的示例中,三种测试方法都使用相同的Browser。每个测试都使用自己的BrowserContextPage

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import org.junit.jupiter.api.*;

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

public class TestExample {
  // Shared between all tests in this class.
  static Playwright playwright;
  static Browser browser;

  // New instance for each test method.
  BrowserContext context;
  Page page;

  @BeforeAll
  static void launchBrowser() {
    playwright = Playwright.create();
    browser = playwright.chromium().launch();
  }

  @AfterAll
  static void closeBrowser() {
    playwright.close();
  }

  @BeforeEach
  void createContextAndPage() {
    context = browser.newContext();
    page = context.newPage();
  }

  @AfterEach
  void closeContext() {
    context.close();
  }

  @Test
  void shouldClickButton() {
    page.navigate("data:text/html,<script>var result;</script><button οnclick='result=\"Clicked\"'>Go</button>");
    page.locator("button").click();
    assertEquals("Clicked", page.evaluate("result"));
  }

  @Test
  void shouldCheckTheBox() {
    page.setContent("<input id='checkbox' type='checkbox'></input>");
    page.locator("input").check();
    assertTrue((Boolean) page.evaluate("() => window['checkbox'].checked"));
  }

  @Test
  void shouldSearchWiki() {
    page.navigate("https://www.wikipedia.org/");
    page.locator("input[name=\"search\"]").click();
    page.locator("input[name=\"search\"]").fill("playwright");
    page.locator("input[name=\"search\"]").press("Enter");
    assertEquals("https://en.wikipedia.org/wiki/Playwright", page.url());
  }
}

默认情况下,JUnit 将在单个线程上按顺序运行所有测试。

从 JUnit 5.3 开始,您可以更改此行为以并行运行测试以加快执行速度(请参阅此页)。由于在没有额外同步的情况下从多个线程使用相同的 Playwright 对象是不安全的,因此我们建议您为每个线程创建 Playwright 实例并专门在该线程上使用它。

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

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

相关文章

Excel技巧:如何对含有相同内容的列增加递增序号

如何在Excel中对含有相同内容的单元格自动添加递增序号 当我们在处理Excel数据时&#xff0c;经常会遇到需要根据某一列中的重复内容来对另一列的单元格进行编号的情况。例如&#xff0c;我们可能需要对所有含有特定字符的单元格进行标记&#xff0c;并在另一列中为它们分配一…

从 Language Model 到 Chat Application:对话接口的设计与实现

作者&#xff1a;网隐 RTP-LLM 是阿里巴巴大模型预测团队开发的大模型推理加速引擎&#xff0c;作为一个高性能的大模型推理解决方案&#xff0c;它已被广泛应用于阿里内部。本文从对话接口的设计出发&#xff0c;介绍了业界常见方案&#xff0c;并分享了 RTP-LLM 团队在此场景…

windows 安装 minio

座右铭&#xff1a;怎么简单怎么来&#xff0c;以实现功能为主。 欢迎大家关注公众号与我交流 1. 打开官网链接 https://www.minio.org.cn/ 2. 点击下载 3. 点击 windows&#xff0c;然后点击 MINIO SERVER 右侧的 DOWNLOAD 进行下载 4. 找到环境变量&#xff0c;新建系统变量…

推荐书籍《低代码平台开发实践:基于React》—— 提升开发效率,构建优质应用

写在前面 随着数字化转型的深入&#xff0c;企业对应用开发效率和灵活性的要求不断提高。低代码平台作为新兴的软件开发方式&#xff0c;通过可视化界面和预构建组件&#xff0c;极大简化了应用开发流程&#xff0c;降低了技术门槛。基于React的低代码平台以其组件化、响应式和…

JavaScript基础3之面向对象关于面向过程、函数式编程、对比、构造函数、原型

JavaScript基础 面向对象面向过程函数式编程命令式编程函数式编程特性副作用透明引用不可变变量函数是一等公民 常见的函数式编程模型 面向对象为什么要使用面向对象封装继承多态 对比面向过程函数式编程面向对象 构造函数原型constructor使用场景 对象原型 面向对象 面向过程…

关于制作Python游戏全过程(汇总1)

目录 前言: 1.plane_sprites模块: 1.1导入模块: 1.1.1pygame&#xff1a;一个用于创建游戏的Python库。 1.1.2random&#xff1a;Python标准库中的一个模块&#xff0c;用于生成随机数。 1.2定义事件代号: 1.2.1ENEMY_EVENT&#xff1a;自定义的敌机出场事件代号&#xf…

从一个word里面复制表格到另一个word时,表格变形的问题

复制过来保留源格式&#xff0c;检查段落、页边距里面的格式都和原始word一致后&#xff0c;仍然表格变形。 这时点页边距-自定义页边距-文档网格 看字符数是不是一致的

字节跳动热门的前端开源项目

字节跳动开源官网 Arco Dsign Arco Design 是一套设计系统&#xff0c;主要服务于字节跳动旗下中后台产品的体验设计和技术实现。它的目标在于帮助设计师与开发者解放双手、提升工作效率&#xff0c;并高质量地打造符合业务规范的中后台应用。它拥有系统的设计规范和资源&…

Nature 研究亮点(Volume 626 Issue 8001, 29 February 2024)

文章目录 激光雕刻肥皂膜卵细胞的回收系统巴斯克语的起源产后抑郁症的治疗 激光雕刻肥皂膜 研究者&#xff1a;Haitao Xu 和 Yu Zhao&#xff0c;清华大学&#xff0c;北京。 发现&#xff1a;在特定条件下&#xff0c;可以使用激光在肥皂膜上进行雕刻。肥皂膜由洗涤剂分子&am…

leetcode 11.盛最多水的容器

题目链接&#xff1a;https://leetcode.cn/problems/container-with-most-water/ 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以…

QT打包EXE

第一步构建 第二步 构建后会产生一个新的文件找到里面刚刚构建出来的exe&#xff0c;将此exe文件放到新的文件夹下 第三步 打包 找到对应的windeployqt.exe 文件 在新建的文件夹下运行 windeployqt.exe xxxx.exe即可 t.exe xxxx.exe即可

在亚马逊云科技上开启您的多机多卡分布式训练之旅

随着机器学习模型规模的扩大和数据量的增加&#xff0c;单个设备的计算能力和内存容量逐渐成为瓶颈。这导致训练过程变得缓慢且耗时长&#xff0c;限制了模型的进一步发展和改进。为了解决这个问题&#xff0c;分布式训练应运而生。它利用多个计算资源并行地执行计算任务&#…

爬虫逆向网站案例

一、相关网页 东方财富人气排行榜 二、查找url 三、寻找curl并复制 四、打开Convert curl commands to code (curlconverter.com) 五、修改并执行代码 import requestscookies {st_si: 73974981954644,st_pvi: 39724919122964,st_sp: 2024-03-05%2018%3A27%3A22,st_inirUrl:…

EdgeX Foundry - 连接 MQTT 设备

文章目录 一、概述1.安装说明2.MQTT 设备模拟器2.1.模拟器设计2.2.Spring Boot 程序源码2.2.1.MQTT2.2.2.JsonUtils2.2.3.Device 2.3.程序配置 二、连接 MQTT 设备1.docker-comepse2.设备配置文件3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.创建 MQTT 设备…

国产电脑替代后,办公软件不兼容,国产机成了摆设如何解决?

随着国家信创战略的推进&#xff0c;许多党政机关、行政事业单位、央国企已经采购了大量的国产CPU和国产操作系统的办公电脑&#xff0c;然而&#xff0c;在替代Windows系统电脑的过程中&#xff0c;许多企业遇到了一个严重的问题&#xff1a;办公软件的不兼容性。这导致许多国…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&#xf…

人事档案转出需要注意哪些方面

人事档案转出是指将员工的人事档案从一个部门、公司或组织转移到另一个部门、公司或组织的过程。这个过程需要注意以下几个方面&#xff1a; 1.法律合规&#xff1a;在进行人事档案转出前&#xff0c;要确保遵守相关的法律法规和公司内部规定。例如&#xff0c;要确保有合法的授…

华为Web举例:私网用户通过三元组NAT访问Internet

Web举例&#xff1a;私网用户通过三元组NAT访问Internet 介绍私网用户通过三元组NAT访问Internet的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网中10.1.1.0/24网段的用户可以正常访问Internet&#xff0c;需要在FW上配置源NAT策略。除了公网接口…

JavaScript的for循环与双重for循环,前端游戏开发

学习路线 第一阶段&#xff1a;网页制作 HTML&#xff1a;常用标签&#xff0c;锚点&#xff0c;列表标签&#xff0c;表单标签&#xff0c;表格标签&#xff0c;标签分类&#xff0c;标签语义化&#xff0c;注释&#xff0c;字符实体 CSS&#xff1a;CSS介绍&#xff0c;全局…

【SpringBoot3.x教程02】SpringBoot配置文件详解

前言&#xff1a;什么是配置文件 SpringBoot的配置文件是指用于定义和管理SpringBoot应用程序配置的文件。这些配置文件允许开发者调整和控制应用程序的行为&#xff0c;而无需改变代码。主要有两种格式的配置文件&#xff1a; 1、application.properties&#xff1a;这是一种使…