天河高端网站建设游戏ui素材网站
2026/4/18 10:52:58 网站建设 项目流程
天河高端网站建设,游戏ui素材网站,php做门户网站,网站开发完整视频使用 Playwright 监听 Selenium 自动化测试中的 WebSocket 消息#xff08;二#xff09; 文章目录使用 Playwright 监听 Selenium 自动化测试中的 WebSocket 消息#xff08;二#xff09;六、Selenium 与 Playwright 的生命周期协同设计6.1 一个常见但不明显的问题6.2 一…使用 Playwright 监听 Selenium 自动化测试中的 WebSocket 消息二文章目录使用 Playwright 监听 Selenium 自动化测试中的 WebSocket 消息二六、Selenium 与 Playwright 的生命周期协同设计6.1 一个常见但不明显的问题6.2 一个相对稳妥的调用顺序七、为何需要“按操作切片”的 WebSocket 捕获机制7.1 问题本质7.2 基于序号的切片思路八、WebSocket 消息方向与 Action 字段的处理策略8.1 抽象消息方向8.2 关于“空消息”的处理九、从 WebSocket 消息中提取并统计 Action9.1 Action 提取与计数9.2 在测试中的使用方式十、实现过程中遇到的典型问题与取舍10.1 CDP 连接失败ECONNREFUSED10.2 关于方案边界的说明六、Selenium 与 Playwright 的生命周期协同设计在将 Playwright 引入到现有 Selenium 框架时真正需要谨慎处理的并不是 API 使用本身而是两个工具在生命周期上的协同关系。Playwright 的ConnectOverCDPAsync本质上是一个主动连接行为它假设目标浏览器已经启动并且在指定端口上暴露了 Chrome DevTools Protocol 服务。如果在浏览器尚未完成启动、或者启动时未正确携带--remote-debugging-port参数的情况下尝试连接连接失败是一个合理且可预期的结果。6.1 一个常见但不明显的问题在测试框架中以下两段逻辑往往分散在不同层级Selenium WebDriver 的创建通常发生在TestInitialize或更底层Playwright 的 CDP 连接通常写在测试辅助类或工具类中如果不对调用顺序加以控制很容易出现如下问题Playwright 连接逻辑执行得过早浏览器进程尚未监听调试端口最终表现为ECONNREFUSED6.2 一个相对稳妥的调用顺序在本文的实现中采用了如下顺序类级别初始化ClassInitialize仅生成调试端口创建 WebSocket 监听器对象不做连接用例初始化TestInitialize调用base.TestInitialize()由 Selenium 启动浏览器浏览器携带--remote-debugging-port再显式调用 Playwright 的EnsureConnected()我们必须选择在浏览器已经处于稳定运行状态后再附加监听。七、为何需要“按操作切片”的 WebSocket 捕获机制在真实的前端系统中WebSocket 消息往往是持续产生的并不严格对应某一个 UI 操作。例如页面加载完成后的初始化消息心跳包其他用户触发的协同事件如果在测试中直接对“当前页面收到的所有 WS 消息”做断言很容易引入噪音难以判断精确地对指定的操作进行验证。7.1 问题本质测试关注的并不是“页面是否收到过某类消息”而是“某一个明确的用户操作是否触发了预期数量和类型的 WebSocket 消息”因此测试需要一种方式将消息流按时间切割。7.2 基于序号的切片思路在实现中并未引入复杂的时间戳或异步同步机制而是采用了一个简单但可控的方式为每一条捕获到的 WebSocket 消息分配递增序号在执行 UI 操作前记录当前序号操作完成后仅保留序号大于该值的消息示例代码如下privateListWsMessageCaptureCore(ActionuiAction,intwaitMs){varstartSeqInterlocked.Read(ref_seq);uiAction();Thread.Sleep(waitMs);return_messages.Where(mm.SeqstartSeq).OrderBy(mm.Seq).ToList();}这种方式并不能保证“绝对只包含该操作的消息”但在大多数前端交互场景下可以显著降低噪音并提高断言稳定性。八、WebSocket 消息方向与 Action 字段的处理策略在 Chrome DevTools 中WebSocket 消息通常以“方向”区分客户端 → 服务端服务端 → 客户端在 Playwright 中这一差异体现在两个事件上FrameSentFrameReceived8.1 抽象消息方向在监听器内部将方向抽象为字符串标识classWsMessage{publiclongSeq{get;set;}publicstringMessageType{get;set;}// Sent / ReceivedpublicstringText{get;set;}}这种抽象并不依赖具体协议细节仅用于后续过滤与分析。8.2 关于“空消息”的处理在实际观察中一部分 WebSocket 帧内容可能为{}空字符串不包含业务字段的控制帧这些消息在多数业务断言中并不具备价值因此在工具方法中提供了可选的过滤能力publicIEnumerablestringOnlyReceived(IEnumerableWsMessagelist,boolcontainEmptyfalse){returnlist.Where(mm.MessageTypeReceived).Where(mcontainEmpty||(!string.IsNullOrWhiteSpace(m.Text)m.Text!{})).Select(mm.Text);}这种设计允许测试在“完整保留原始数据”和“聚焦业务字段”之间进行选择。九、从 WebSocket 消息中提取并统计 Action在许多实时系统中WebSocket 消息的核心语义体现在某个字段上例如{Action:EditRecord,Data:{...}}测试关注的往往不是消息的完整结构而是是否出现了某种 Action出现了几次是否符合预期行为模型9.1 Action 提取与计数实现上采用了较为保守的 JSON 解析方式非 JSON 或结构异常的消息直接忽略只在存在Action字段时才参与统计privateDictionarystring,intCountActions(IEnumerablestringmessages){varresultnewDictionarystring,int();foreach(vartextinmessages){if(string.IsNullOrWhiteSpace(text)||text{})continue;try{varjJObject.Parse(text);varaction(string)j[Action];if(string.IsNullOrEmpty(action))continue;result[action]result.GetValueOrDefault(action)1;}catch{// 非预期结构忽略}}returnresult;}9.2 在测试中的使用方式vartexts_wsCollector.CaptureTexts((){UIAction();});varactionCountCountActions(texts);Assert.AreEqual(1,actionCount.GetValueOrDefault(SelectionChange));Assert.AreEqual(1,actionCount.GetValueOrDefault(EditRecord));这种断言方式的优势在于明确表达“期望行为的次数”对多余或缺失消息都具备可观测性十、实现过程中遇到的典型问题与取舍10.1 CDP 连接失败ECONNREFUSED通常由以下原因引起Playwright 连接过早调试端口未正确注入使用localhost导致 IPv6 解析问题在实现中采用了以下应对方式延迟连接到TestInitialize之后使用127.0.0.1显式指定 IPv410.2 关于方案边界的说明该方案的目标并非替代 Selenium也不是尝试“全面接管浏览器调试能力”而是在既有框架和版本约束下提供一种可控、可维护的 WebSocket 可观测手段。在以下情况下可能需要重新评估方案对性能指标有强需求需要跨浏览器非 Chromium希望统一迁移到 Playwright

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询