You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从网页成功提示中提取动态工单编号(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:24:58