使用HtmlAgilityPack解析同目录下多个HTML测试报告文件
使用HtmlAgilityPack解析批量测试报告HTML文件
我来帮你搞定用HtmlAgilityPack解析同目录下这批TestReport*.html测试报告的需求,下面是具体的实现步骤和代码示例:
1. 安装HtmlAgilityPack
首先你需要通过NuGet包管理器安装HtmlAgilityPack库:
- 使用Package Manager Console:
Install-Package HtmlAgilityPack
- 使用.NET CLI:
dotnet add package HtmlAgilityPack
2. 编写解析代码
下面是完整的C#代码示例,它会遍历当前目录下所有匹配TestReport*.html的文件,提取其中的测试结果统计数据:
using HtmlAgilityPack; using System; using System.IO; class Program { static void Main() { // 获取当前目录下所有TestReport开头的HTML文件 string[] htmlFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "TestReport*.html"); foreach (string filePath in htmlFiles) { Console.WriteLine($"正在处理文件:{Path.GetFileName(filePath)}"); HtmlDocument doc = new HtmlDocument(); try { // 加载HTML文件 doc.Load(filePath); // 提取Passed状态的用例数量 var passedCountNode = doc.DocumentNode.SelectSingleNode("//li[@class='Passed']//span[@class='summaryCount']"); if (passedCountNode != null) { if (int.TryParse(passedCountNode.InnerText.Trim(), out int passedCount)) { Console.WriteLine($" Passed用例数:{passedCount}"); } else { Console.WriteLine(" 无法解析Passed用例数量"); } } else { Console.WriteLine(" 未找到Passed统计节点"); } // 提取Inconclusive状态的用例数量(兼容你提供的片段里的Incon...节点) var inconclusiveCountNode = doc.DocumentNode.SelectSingleNode("//li[contains(@class, 'Incon')]//span[@class='summaryCount']"); if (inconclusiveCountNode != null) { if (int.TryParse(inconclusiveCountNode.InnerText.Trim(), out int inconclusiveCount)) { Console.WriteLine($" Inconclusive用例数:{inconclusiveCount}"); } else { Console.WriteLine(" 无法解析Inconclusive用例数量"); } } else { Console.WriteLine(" 未找到Inconclusive统计节点"); } Console.WriteLine("------------------------"); } catch (Exception ex) { Console.WriteLine($" 处理文件出错:{ex.Message}"); Console.WriteLine("------------------------"); } } Console.WriteLine("所有文件处理完成!"); Console.ReadKey(); } }
3. 代码关键说明
- 文件遍历:用
Directory.GetFiles匹配TestReport*.html模式,精准定位目标文件。 - HTML解析:
HtmlDocument.Load加载本地HTML文件,通过XPath表达式定位目标节点://li[@class='Passed']//span[@class='summaryCount']:精准定位class为Passed的li下的统计数字节点//li[contains(@class, 'Incon')]//span[@class='summaryCount']:用contains匹配部分class名称,兼容你片段里的Incon...节点
- 异常处理:加入try-catch块避免单个文件处理失败导致整个程序崩溃,同时用
int.TryParse代替直接int.Parse,避免数字格式错误引发异常。
内容的提问来源于stack exchange,提问作者Junior.junior
相关产品推荐
相关产品推荐

