三类架构下C# Selenium网页文本获取与列表对比技术问询
实现方案:Selenium提取文本转List并完成列表对比
没问题,我来帮你贴合三个类的架构需求,完成从网页提取文本、转成列表,再和硬编码列表对比的功能。下面是分步实现的代码和说明:
1. 第一个类:Selenium方法封装类
这个类负责封装Selenium的网页元素操作,把你原来的方法修改为返回List<string>,直接提取下拉框里的所有选项文本:
using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using System.Collections.Generic; using System.Linq; public class SeleniumChecklistService { // 注入WebDriver实例,避免硬编码依赖 private readonly IWebDriver _webDriver; public SeleniumChecklistService(IWebDriver webDriver) { _webDriver = webDriver; } public List<string> GetWebChecklistRecords() { // 定位Benefit Checklist对应的下拉控件 var checklistDropdownElement = _webDriver.FindElement(By.XPath("//div[contains(text(),'Benefit Checklist')]")); var recordsDropdown = new SelectElement(checklistDropdownElement); // 提取所有选项的文本,转成List<string>,同时做归一化处理(去空格) var webChecklistItems = recordsDropdown.Options .Select(opt => opt.Text.Trim()) .ToList(); return webChecklistItems; } }
2. 第二个类:方法调用类
这个类的职责很简单,就是调用上面的封装类,获取网页数据:
using OpenQA.Selenium; using System.Collections.Generic; public class ChecklistDataFetcher { public List<string> FetchWebChecklist(IWebDriver driver) { var seleniumService = new SeleniumChecklistService(driver); return seleniumService.GetWebChecklistRecords(); } }
3. 第三个类:逻辑执行与对比类
这里实现核心的对比逻辑,你可以根据需求选择对比方式——比如找出差异项、验证完全匹配等,下面是通用的对比实现:
using System.Collections.Generic; using System.Linq; public class ChecklistComparator { public void CompareChecklists(List<string> webItems, List<string> hardcodedItems) { // 先做文本归一化,避免大小写、空格导致的匹配误差 var normalizedWeb = webItems.Select(item => item.ToLowerInvariant().Trim()).ToList(); var normalizedHardcoded = hardcodedItems.Select(item => item.ToLowerInvariant().Trim()).ToList(); // 计算差异项 var webOnlyItems = normalizedWeb.Except(normalizedHardcoded).ToList(); var hardcodedOnlyItems = normalizedHardcoded.Except(normalizedWeb).ToList(); var matchingItems = normalizedWeb.Intersect(normalizedHardcoded).ToList(); // 输出对比结果(你可以改成日志、断言或者业务逻辑处理) if (webOnlyItems.Any()) { System.Console.WriteLine("⚠️ 网页存在但硬编码未包含的检查项:"); foreach (var item in webOnlyItems) System.Console.WriteLine($" - {item}"); } if (hardcodedOnlyItems.Any()) { System.Console.WriteLine("⚠️ 硬编码存在但网页未显示的检查项:"); foreach (var item in hardcodedOnlyItems) System.Console.WriteLine($" - {item}"); } if (!webOnlyItems.Any() && !hardcodedOnlyItems.Any()) { System.Console.WriteLine("✅ 两个检查列表完全匹配!"); } } }
整合使用示例
在你的主程序或者测试代码里,这样串联三个类:
using OpenQA.Selenium.Chrome; using System.Collections.Generic; class Program { static void Main(string[] args) { // 初始化WebDriver(这里用ChromeDriver,你可以换成其他浏览器驱动) using (var driver = new ChromeDriver()) { driver.Navigate().GoToUrl("你的目标网页地址"); // 硬编码的检查列表 var hardcodedChecklist = new List<string> { "Medical Benefit", "Dental Benefit", "Vision Benefit" }; // 调用类获取网页数据 var dataFetcher = new ChecklistDataFetcher(); var webChecklist = dataFetcher.FetchWebChecklist(driver); // 执行对比逻辑 var comparator = new ChecklistComparator(); comparator.CompareChecklists(webChecklist, hardcodedChecklist); } } }
关键注意事项
- 文本归一化:一定要对提取的网页文本和硬编码文本做统一处理(比如转小写、去空格),否则很容易因为网页文本的格式问题导致对比错误。
- 依赖注入:把WebDriver通过构造函数传入服务类,避免代码耦合,也方便后续做单元测试。
- 灵活调整对比逻辑:如果只需要验证两个列表是否完全一致,可以直接用
normalizedWeb.SequenceEqual(normalizedHardcoded)来快速判断。
内容的提问来源于stack exchange,提问作者Nidhii Singh
相关产品推荐
相关产品推荐

