Selenium C#嵌套循环实现多页判断题自动作答求助
解决方案:遍历多页判断题并随机答题
问题分析
你已实现单页随机答题逻辑,但无法通过循环遍历所有20页,核心问题大概率是随机数生成错误、页面加载未等待、元素定位不可靠或循环逻辑未适配页面切换导致的。
优化后的实现方案
1. 封装单页答题方法
将单页答题逻辑抽成独立方法,提升复用性,同时优化元素定位方式(避免依赖行索引,改用精准定位题目行):
private void AnswerCurrentPageQuestions() { // 获取当前页所有题目行(通过tr的class精准筛选) var questionRows = Browser.FindElements(By.XPath("//table[@class='table']//tbody/tr[@class='myClass']")); foreach (var row in questionRows) { // 生成0或1的随机数(原代码Next(0,1)只会返回0,改为Next(0,2)才能实现随机选择) var randomChoice = Faker.RandomNumber.Next(0, 2); var targetValue = randomChoice == 0 ? "T" : "F"; // 在当前题目行内查找对应选项,避免全局定位出错 var targetRadio = row.FindElement(By.XPath(".//td[@class='classy']/label/input[@value='" + targetValue + "']")); targetRadio.Click(); } }
2. 多页循环遍历逻辑
根据是否知晓总页数,可选择两种循环方式:
方式一:已知总页数(20页)
int totalPages = 20; for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { // 完成当前页答题 AnswerCurrentPageQuestions(); // 定位并点击Continue按钮(结合类型和文本定位,稳定性更高) var continueBtn = Browser.FindElement(By.XPath("//button[@type='submit' and contains(text(), 'Continue')]")); continueBtn.Click(); // 显式等待下一页加载完成,避免元素未就绪就执行操作 WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(10)); wait.Until(driver => driver.FindElements(By.XPath("//table[@class='table']//tbody/tr[@class='myClass']")).Count > 0); }
方式二:未知总页数(循环到无Continue按钮为止)
while (true) { AnswerCurrentPageQuestions(); // 检查是否存在Continue按钮 var continueBtns = Browser.FindElements(By.XPath("//button[@type='submit' and contains(text(), 'Continue')]")); if (continueBtns.Count == 0) { // 无下一页,退出循环 break; } continueBtns[0].Click(); // 等待下一页题目加载完成 WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(10)); wait.Until(driver => driver.FindElements(By.XPath("//table[@class='table']//tbody/tr[@class='myClass']")).Count > 0); }
关键修复点
- 随机数修正:原代码
Faker.RandomNumber.Next(0,1)仅会生成0,改为Next(0,2)才能随机得到0或1,实现真正的随机答题。 - 元素定位优化:通过
tr[@class='myClass']精准定位题目行,避免非题目行干扰;在当前行内查找选项,而非全局定位,提升稳定性。 - 页面等待机制:添加显式等待,确保点击Continue后下一页完全加载,避免因页面未就绪导致的元素找不到异常。
- 代码复用:将单页答题封装为方法,避免重复编写相同逻辑,符合DRY原则,也便于后续维护。
内容的提问来源于stack exchange,提问作者Dazed
相关产品推荐
相关产品推荐

