websocket服务执行playwright测试

news2024/12/25 23:58:15

  上一篇博客从源码层面分析了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 messages
        ws.on('message', message => {
                console.log(`Received message: ${message}`);

                // Parse the received message
                let 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 command
                        const 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 process
                        const testProcess = spawn(nodePath, args, { stdio: 'pipe' });

                        // Capture stdout and stderr
                        testProcess.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 exit
                        testProcess.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 close
        ws.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.coloradmin.cn/o/1846527.html

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

相关文章

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置,就是这个B函数,嗯......听起来好像有点奇怪,但是它确实叫B啊,笑死。不管了,看一下里面的逻辑是啥。 注意e参数的内容是: {"app_name":…

PS系统教学24

去水印 仿制图章工具修复画笔工具选区-编辑-填充-内容识别 人体皮肤亮度 人体皮肤发亮 减淡工具 缺点:不能对所有图层取样 选择减淡工具选择高光打完高光用中间调中和一下也可以用历史记录画笔工具进行修饰也可以用加深工具进行微调 图层中的模式 滤色 曝光过…

go语言day2

使用cmd 中的 go install ; go build 命令出现 go cannot find main module 错误怎么解决? go学习-问题记录(开发环境)go: cannot find main module; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

docker环境部署ruoyi系统前后端分离项目

创建局域网 docker network create net-ry 安装Redis 1 安装 创建两个目录 mkdir -p /data/redis/{conf,data} 上传redis.conf文件到/data/redis/conf文件夹中 cd /data/redis/conf 3.2 配置redis.conf文件 配置redis.conf文件: redis.conf文件配置注意&…

函数栈帧的创建和销毁,带动图详细解析,带你大致分析汇编代码

目录 1.什么是函数栈帧 2.理解函数栈帧有什么用? 3.函数栈帧的创建和销毁解析 3.1什么是栈? 3.2 认识相关寄存器和汇编指令 3.3函数栈帧的创建和销毁解析过程 3.4函数的调用 3.5汇编代码 3.5.1函数栈帧的创建 3.5.2main函数部分 3.5.3Add函数…

无线模块433MHz和2.4GHz的功能与适用性比较

433MHz和2.4GHz这两个频段常用于无线通信中的模块,今天我们就来介绍这两种频段无线模块各自的特点。433MHz和2.4GHz无线模块工作频段都属于国内免许可的ISM开放频段,因此二者使用较为广泛。 433MHz频段无线模块位于超高频(UHF)范围内,具体频…

人类启发的一区新算法|旅行徒步优化算法HOA原理及代码实现(Matlab/Python)

文章来源于我的个人公众号:KAU的云实验台,主要更新智能优化算法的原理、应用、改进 MATLAB PYTHON 目前,元启发式算法按其灵感来源可以分为: (i)群体启发,如粒子群PSO和灰狼优化算法GWO等&a…

wvp-GB28181-pro 源码分析-点播流程(三)

文章目录 一 、28181-2016标准文档中的点播流程二 、点播流程源码分析2.1 页面发起点播请求2.2 与ZLM协商SSRC信息2.3 订阅zlmediakit的hook消息及发送invite信令2.4 处理invite信令响应并应答2.5 收到ZLM的推流通知2.6 播放成功2.7 停止点播流程2024年6月20日下载的wvp-GB2818…

如何在华为 Ascend 设备上运行模型

模型转换:使用华为的模型转换工具 ATC ATC 在 ascend-cann-toolkit 包里 环境 Docker Image: ascendhub.huawei.com/public-ascendhub/ascend-pytorch:24.0.RC1-A2-2.1.0-ubuntu20.04 镜像版本CANN版本Pytorch版本变更项24.0.RC18.0.RC12.1.0基础镜像变更为 ubuntu20.04。p…

SAP ScreenPersonas

https://developers.sap.com/mission.screen-personas.html 跟着这个练习做一遍就了解了Personas 访问SAP提供的Personas练习系统 申请用户 登录练习系统 随便找一个可以支持Personas的程序搞起来,比如IW51 执行后等它出现这个图标就可以开始了.

Rocky9使用cockpitweb登陆时root用户无法登陆

Rocky9使用cockpitweb登陆时root用户无法登陆 [rootlvs ~]# vim /etc/cockpit/disallowed-users [rootlvs ~]# systemctl restart cockpit 取消disallowed-users中的root,即可访问 ip:9090 登陆。

模式分解的概念(下)-无损连接分解的与保持函数依赖分解的定义和判断、损失分解

一、无损连接分解 1、定义 2、检验一个分解是否是无损连接分解的算法 输入与输出 输入: 关系模式R(U,F),F是最小函数依赖集 R上的一个分解 输出: 判断分解是否为无损连接分解 (1&#x…

leetcode 动态规划(基础版)三角形最小路径和

题目&#xff1a; 题解&#xff1a; 一种可行的方案是从下到上&#xff0c;避免了从上到下的下标特判。走到每一个位置的最小值等于该位置的上两个位置中的最小值加上该位置的值。 int minimumTotal(vector<vector<int>>& triangle) {int dp[205][205]{0};f…

Origin电源维修高压发生器GEXUS-3 GEXUS-15R-02U

GEXUS-3电源维修 Origin高压发生器维修 Origin电源维修 光电设备电源维修 Origin高压电源维修故障分析应注意两点&#xff1a; 故障分析检测和故障硬件更换&#xff0c;根据高压电源故障提示和工作表现初步判断故障的类型和哪些硬件出了问题&#xff0c;再根据初步判断缩小检测…

rk3588 cpu npu gpu 定频 变频

网上的资料 cpu: npu&#xff1a; GPU: DDR:

现货黄金应用价格行为交易所需要的环境

在现货黄金投资中&#xff0c;投资者常用价格行为交易法来分析走势。简单来说&#xff0c;这种方法就是只看K线和支撑阻力位&#xff0c;顶多加一些简单的指标&#xff0c;以此构建分析和交易的系统。由于价格行为简单易学&#xff0c;现在的投资者或多或少都在使用这个方法。但…

云服务器可以从哪些方面降低开发运维难度

开发和运维工作面临着诸多挑战&#xff0c;如果说现在市场上有可以快速有效解决的方案&#xff0c;那么云服务器绝对是首选&#xff0c;云服务器从多个方面显著降低了其难度。 具象到云服务器的特质中&#xff0c;不得不提的还是云服务器的弹性伸缩&#xff0c;之前的文章里有…

busybox的基本使用记录壹

内核如何启动init进程 init/main.c static int __ref kernel_init(void *unused) {int ret;kernel_init_freeable();/* need to finish all async __init code before freeing the memory */async_synchronize_full();ftrace_free_init_mem();jump_label_invalidate_initmem()…

docker进阶篇

docker进阶篇 (重点) 1、docker run2、docker ps3、docker restart4、docker pull5、docker stop6、docker logs7、docker stats8、docker rm(重点) 9、docker exec10、查看本机镜像docker image11、发布镜像docker commit12、docker save(例如保存为tar给别人用)13、删除镜像1…

家居行业大洗牌,中国品牌“九牧现象”逆势进阶

两件印字白T&#xff0c;一件可能几十块就能买到&#xff0c;Gucci的售价却可达上千元&#xff1b;款式类似的珍珠耳环&#xff0c;有的可能上百元就能买到&#xff0c;香奈儿的却要过万…… 他们最大的差异在哪里&#xff1f;在品牌&#xff0c;以及品牌背后代表的品质与服务…