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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:58:14