如何从网页成功提示中提取动态工单编号(Work Order Number)
问题:从动态成功提示中提取工单编号
需要从动态生成的成功提示消息里提取工单编号(格式如0000037282),用于后续页面操作。目标消息示例:
Work Order 0000037282 has been reissued.
期望提取结果:
x = 0000037282
前端HTML结构
<div class="row ng-scope" ng-if="successMessages.length"> <div class="col-lg-12"> <div class="alert alert-success"> <!-- ngRepeat: success in successMessages track by $index --> <div class="row ng-binding ng-scope" ng-repeat="success in successMessages track by $index" ng-bind="success.message">Invoice 0000026791 has been credited. Credit document HO0000000033 was created.</div> <!-- end ngRepeat: success in successMessages track by $index --> <div class="row ng-binding ng-scope" ng-repeat="success in successMessages track by $index" ng-bind="success.message">Work Order 0000037282 has been reissued.</div> <!-- end ngRepeat: success in successMessages track by $index --> </div> </div> </div>
当前实现代码
测试逻辑代码
await reissueWorkOrderConfirmationModal.ConfirmAsync(); string? workOrderNumber = await creditInvoiceModal.GetReissuedWorkOrderNumberAsync(); if (workOrderNumber != null) { Console.WriteLine($"Reissued Work Order Number: {workOrderNumber}"); } else { Console.WriteLine("Failed to retrieve the reissued work order number."); }
提取方法代码
public async Task<string?> GetReissuedWorkOrderNumberAsync() { // 执行JS获取所有成功消息文本 string successMessages = await _page.EvaluateAsync<string>("() => { const messages = Array.from(document.querySelectorAll('.alert.alert-success .row.ng-binding.ng-scope')); return messages.map(message => message.innerText).join('|'); }"); // 定义匹配工单编号的正则 string pattern = @"Work Order (\d+) has been reissued."; // 执行匹配 Match match = Regex.Match(successMessages, pattern); // 返回匹配结果 if (match.Success) { string workOrderNumber = match.Groups[1].Value; return workOrderNumber; } return null; }
实现验证与优化方案
现有实现的有效性
当前逻辑是可行的:
- 通过
document.querySelectorAll定位所有成功消息元素,收集文本后用正则匹配目标内容,能准确提取工单编号。 - 正则
Work Order (\d+) has been reissued.中的(\d+)可捕获连续数字,符合工单编号的格式要求。
优化方案1:浏览器端直接处理,减少数据传递
无需将所有消息文本传回C#再处理,直接在浏览器端筛选目标消息并提取编号,提升效率:
public async Task<string?> GetReissuedWorkOrderNumberAsync() { return await _page.EvaluateAsync<string?>("() => { const messageElements = document.querySelectorAll('.alert.alert-success .row.ng-binding.ng-scope'); for (const el of messageElements) { const text = el.innerText; if (text.includes('Work Order') && text.includes('has been reissued')) { const match = text.match(/Work Order (\\d+) has been reissued./); return match ? match[1] : null; } } return null; }"); }
优化方案2:精准匹配固定长度编号
如果工单编号是固定长度(比如10位),可修改正则实现更精准的匹配,避免误捕获其他数字:
string pattern = @"Work Order (\d{10}) has been reissued.";
优化方案3:按固定位置直接定位(若消息位置稳定)
如果目标消息始终是第二条,可直接通过索引获取,减少遍历开销:
public async Task<string?> GetReissuedWorkOrderNumberAsync() { return await _page.EvaluateAsync<string?>("() => { const messageElements = document.querySelectorAll('.alert.alert-success .row.ng-binding.ng-scope'); if (messageElements.length >= 2) { const text = messageElements[1].innerText; const match = text.match(/Work Order (\\d+) has been reissued./); return match ? match[1] : null; } return null; }"); }
注意事项
- 确保元素选择器
.alert.alert-success .row.ng-binding.ng-scope不会匹配无关元素,可根据页面实际结构调整选择器(比如添加更具体的父类限定)。 - 处理异步加载:若成功消息是操作后动态渲染的,需等待元素完全加载后再执行提取逻辑,避免因元素未就绪导致匹配失败。
内容的提问来源于stack exchange,提问作者Adymus
相关产品推荐
相关产品推荐

