websocket服务执行playwright测试

  上一篇博客从源码层面分析了playwright vscode插件实现原理,在上一篇博客中提到,backend服务是一个websocket服务。这遍博客将介绍如何封装一个websocket服务,通过发送消息来执行playwright测试。

  初始化项目

  第一步是初始化项目和安装必要的依赖,这里需要安装playwright, @playwright/test和ws两个依赖包。后面启动执行测试的cli.js文件就是来源于@plawright/test这个包。

mkdir playwright-ws-server
cd playwright-ws-server
npm init -y
npm install ws playwright @playwright/test

 实现websocket服务

  下面的代码中,通过new WebSocket.Server启动一个websocket服务,监听在8085端口。当监听到message.command==“runtest”时,通过spawn启动node进程,执行playwright的测试文件。并把测试结果通过消息发送出去。

const WebSocket = require('ws');
const { spawn } = require('child_process');
const path = require('path');// WebSocket server setup
const wss = new WebSocket.Server({ port: 8085 });// Event listener for new connections
wss.on('connection', ws => {console.log('Client connected');// Event listener for incoming messagesws.on('message', message => {console.log(`Received message: ${message}`);// Parse the received messagelet command;try {command = JSON.parse(message);} catch (e) {console.error('Invalid JSON:', e);ws.send(JSON.stringify({ error: 'Invalid JSON' }));return;}// Check if the command is "runtest"if (command.action === 'runtest') {const testFilePath = command.testFilePath;const options = command.options;// Construct the Playwright test commandconst nodePath = '/opt/homebrew/bin/node';const cliPath = path.resolve('./node_modules/@playwright/test/cli.js');const configPath = 'playwright.config.js';const args = [cliPath,'test','-c', configPath,testFilePath,`--headed`,`--project=${options.project}`,`--repeat-each=${options.repeatEach}`,`--retries=${options.retries}`,`--timeout=${options.timeout}`,`--workers=${options.workers}`];console.log('Executing command:', `${nodePath} ${args.join(' ')}`);// Spawn the Playwright test processconst testProcess = spawn(nodePath, args, { stdio: 'pipe' });// Capture stdout and stderrtestProcess.stdout.on('data', data => {console.log(`stdout: ${data}`);ws.send(JSON.stringify({ output: data.toString() }));});testProcess.stderr.on('data', data => {console.error(`stderr: ${data}`);ws.send(JSON.stringify({ error: data.toString() }));});// Handle process exittestProcess.on('close', code => {console.log(`Child process exited with code ${code}`);ws.send(JSON.stringify({ exitCode: code }));});} else {ws.send(JSON.stringify({ error: 'Unknown action' }));}});// Event listener for connection closews.on('close', () => {console.log('Client disconnected');});
});console.log('WebSocket server is running on ws://localhost:8085');

    node server.js命令启动上面的websocket服务,再安装wscat工具,通过wscat工具给服务发送消息,发送后即可看到测试脚本执行结果。

//安装wscat
npm install -g wscat//连接ws的命令
wscat -c ws://localhost:8080//发送的message
{"action": "runtest","testFilePath": "/Users/taoli/study/playwrightDemo/tests/test-1.spec.ts:3","options": {"headed": true,"project": "chromium","repeatEach": 1,"retries": 0,"timeout": 0,"workers": 1}
}

  也可以编写client.js文件来发送消息执行测试。下面是client.js的代码。

const WebSocket = require('ws');const ws = new WebSocket('ws://localhost:8085');ws.on('open', () => {const message = {action: 'runtest',testFilePath: '/Users/taoli/study/playwrightDemo/tests/test-1.spec.ts:3',configPath: 'playwright.config.js',options: { "project": "chromium", "repeatEach": 1, "retries": 0, "timeout": 0, "workers": 1 }};ws.send(JSON.stringify(message));
});ws.on('message', data => {console.log('Received:', data);
});

  启动server,在另外一个terminal中执行client.js文件,可以看到websocket接受到的message,实际执行的命令如下图红框所示。stdout部分打印了测试执行结果。在执行测试过程中,因为设置--headed模式,所以可以看到开启了浏览器,在浏览器中打开被测应用进行测试。

spawn提供哪些功能

  在前面的介绍中,多次提到了spawn,那么spawn有哪些功能呢?spawn 是 Node.js 的 child_process 模块提供的一个方法,用于创建一个新的进程来执行给定的命令。它与 exec 类似,但 spawn 更适合处理长时间运行的进程,并且可以与子进程进行流式交互。

  spawn可以启动任何可执行文件,包括 Node.js 程序。这是因为 spawn 本质上是在操作系统中运行一个新进程,将命令和参数传递给这个新进程,即可完成执行操作。

  除了执行 Node.js 程序,spawn 可以用来执行几乎任何可执行文件或命令,包括但不限于:
Shell 命令:执行操作系统的命令,如 ls, grep, ping 等。
其他脚本语言:执行 Python, Ruby, Perl 等脚本语言编写的脚本。
系统服务:启动、停止或重启系统服务。
编译工具:运行编译器如 gcc, javac 等。
应用程序:启动其他应用程序或工具,如 git, docker, npm 等。

  可以看到spawn功能非常强大,例如python编写的程序,也可以通过spawn来运行,当然,这个运行也可以封装到一个websocket服务中,通过发送和监听消息来执行。

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

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

相关文章

LangChain入门学习笔记(三)—— Model I/O之Prompts

如果说LCEL是粘合剂,那么它需要粘合起来的要素就是各种组件。其中最核心的要素就是LangChain官方文档中定义的Model I/O:Prompts、Chat Models、LLMs和Output Parsers。这4个基本组件,可以处理基本的用户输入并通过大模型处理后按要求输出。 …

没有超头、最低价的视频号618战况如何?有何趋势变化?| 视频号618观察

转眼618大促已接近尾声,今年的你有剁手哪些好物吗?对618的整体感觉又是如何呢? 这是12年来,第一个电商平台没有预售付定金的618,当然或许此后的双11、每一次大促也将逐渐回归传统,回归本质。 而对于视频号来…

拒绝吸烟,远离慢阻肺——朗格力复合营养素助力守护肺部健康

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 你知道吗?慢阻肺这一疾病在我国的患者数量已突破亿级大关,尤其在40岁以上的成年人中,平均每7个人中就有1位可能受其困扰。然而,很多人对慢阻肺的严重性认识不足,常常将其视为一种普通的咳嗽或喘息,忽视了它潜在的危…

js 将日期转换成大写格式

最近做了个需求将日期转换成大写汉字,网上搜的不对。进行改正后如下: function dateToChinese(date) {var chinese [零, 一, 二, 三, 四, 五, 六, 七, 八, 九];var y date.getFullYear().toString();var m date.getMonth().toString();var d date.g…

Java——访问修饰符

一、访问修饰符是什么 Java中的访问修饰符用于控制类、接口、构造函数、方法和数据成员(字段)的可见性和访问级别。 Java提供了四种访问修饰符: 访问修饰符同一类内同一包内不同包的子类不同包的非子类适用对象public可见可见可见可见类、…

gorm存储json

在一些存储配置文件的场景下,我们需要在mysql中存储json。最直接的方法是在存储时通过json.Marshall()序列化方法将需要存储的对象转化为json字符串,然后再存入mysql中。需要使用时,从mysql中取出,再进行json.Unmarshall()。具体操…

fataadmin导出Exel文件图片太大

// 导出图片过大处理 exportOptions: {ignoreColumn: [0, operate],onBeforeSaveToFile: function (data, fileName, type, charset, encoding, bom) {return $.fn.bootstrapTable.defaults.extend.savestatus;},onCellHtmlHyperlink: function ($cell, rowIndex, colIndex, hr…

Pytorch Geometric(PyG)入门

PyG (PyTorch Geometric) 是建立在 PyTorch 基础上的一个库,用于轻松编写和训练图形神经网络 (GNN),适用于与结构化数据相关的各种应用。官方文档 Install PyG PyG适用于python3.8-3.12 一般使用场景:pip install torch_geometric 或conda …

AI大模型部署Ubuntu服务器攻略

一、下载Ollama 在线安装: 在linux中输入命令curl -fsSL https://ollama.com/install.sh | sh 由于在linux下载ollama需要经过外网,网络会不稳定,很容易造成连接超时的问题。 离线安装: 步骤一: 下载Ollama离线版本…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一, 文档描述二, Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一, 文档描述 RT600的启动模式共支持4种: 1&am…

【jdk】jdk11 jdk17 jdk21的新特性

前言:按照博主的个人理解,一般来说 除了jdk8时代 说jdk8的新特性是特指jdk8这一个版本的特性,之后例如jdk11 jdk17新特性 都是泛特性 什么意思呢? 比如jdk11新特性,一般是指jdk9——jdk11 这一个泛版本的所有新特性&am…

第十五届蓝桥杯Python大学B组国赛/决赛 I题题解

大概题目 某国王要给n个岛之间修桥,桥是双向的,国王可以将a岛和b岛连接起来,也可以将两座岛的桥炸掉,国王想知道经过一系列操作之后两座岛之间是否连接。 输入:岛屿数量n,每行第一个数是选择,…

【C++】类的六个默认成员函数

文章目录 类的六个默认成员函数一、构造函数二、析构函数三、拷贝构造函数四、赋值运算符重载五、const成员六、取地址及const取地址操作符重载 类的六个默认成员函数 如果一个类中什么成员都没有,称为空类。空类中真的什么都没有吗?并不是,…

CRMEB 多店商品详情页装修说明

一、功能介绍 商家可调整商品详情各板块样式,可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息,排行榜 控制商品详情页面会员信息及排行榜的…

SRM供应商管理系统是什么?企业为何都非常重视供应商管理?

企业与供应商之间的关系就像一张错综复杂的网,维系着生产的顺利进行。但是,这张网也时常让企业感到焦虑和困扰。例如, 如何准确地评估供应商的信誉和实力? 如何高效地与众多供应商沟通,确保信息的及时传递和反馈&…

自动驾驶车辆路径规划

在自动驾驶领域,轨迹搜索(Trajectory Searching)和轨迹生成(Trajectory Generation)是两个密切相关但有所不同的概念,它们都是自动驾驶车辆规划其行驶路径的关键步骤。 轨迹搜索(Trajectory Se…

虚拟机安装镜像文件时候报错VT-x

在虚拟机(VM)安装操作系统时,特别是在 VMware 或 VirtualBox 中,常见的需要修改 BIOS 设置的情况包括启用硬件虚拟化和调整启动顺序等。这些设置对于确保虚拟机能够正常启动和操作非常重要。 常见需要修改的 BIOS 设置包括&#…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1,预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

基于DPU的云原生裸金属服务快速部署及存储解决方案

1. 背景介绍 1.1. 业务背景 在云原生技术迅速发展的当下,容器技术因其轻量级、可移植性和快速部署的特性而成为应用部署的主流选择,但裸金属服务器依然有其独特的价值和应用场景,是云原生架构中不可或缺的一部分。 裸金属服务器是一种高级…

主机游戏也可以上云桌面玩了?

最近steam夏季促销活动也快到了,对于很多钟情于主机游戏的小伙伴们,是不是也在摩拳擦掌了? 但有时候现实想愉快地玩到自己想玩的游戏实在是太难了! 当你一直关注的新游戏终于上线Steam时,你的钱包是这样的… 而游戏的…