我有一个HTML Table,在每个页面上显示大约20个真/假问题.我有一个循环来随机回答每个问题.一旦问题在页面上完成,就会弹出一个按钮以进入下一页面.不过可能有20页.我不想一遍又一遍地重复相同的步骤(specFlow),而是想创建一个嵌套循环,但我无法让它工作.

我try 过的一个例子.这将增加TR,以便它落在每个问题上并随机回答.然后我try 对一个元素进行bool,看看接下来的问题是否存在,但我在嵌套循环中迷失了方向,因此它会迭代所有页面.建议?

for (int i = 0; i < count; i++)
{
    var rand = Faker.RandomNumber.Next(0, 1).ToString();
    if (rand == "0")
    {
        Browser.FindElement_byXPath(string.Format("//table[@class='table']//tr[{0}]//td[@class='classy']/label/input[@value= 'T']", i + 1)).Click();
    }
    else
    {
        Browser.FindElement_byXPath(string.Format("//table[@class='table']//tr[{0}]//td[@class='classy']/label/input[@value= 'F']", i + 1)).Click();
    }
}

然后继续下一页

HTML

<table class="table">
    <tbody>
        <tr class="myClass">
            <td>1. </td>
            <td>I Like Ducks? </td>
            <td class="classy">
                <label>
                    <input type="radio" name="Q1" value="T" checked="checked"> True</label>
                <label>
                    <input type="radio" name="Q1" value="F"> False</label>
            </td>
        </tr>
        <tr class="myClass">
            <td>2. </td>
            <td>I Like Cars? </td>
            <td class="classy">
                <label>
                    <input type="radio" name="Q2" value="T"> True</label>
                <label>
                    <input type="radio" name="Q2" value="F"> False</label>
            </td>
        </tr>
    </tbody>
</table>
<br>
<button type="submit" class="btn btn-primary pull-right"> Continue 
    <span class="classless"></span>
</button>

推荐答案

考虑到您提供的HTML,我会这样写.

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using System.Collections.ObjectModel;

driver = new ChromeDriver();
driver.Manage().Window.Maximize();
driver.Url = "<the url>";

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
Random random = new Random();

int numberOfPages = 20; // ideally this would be counted from something on the page instead of hard coded
for (int pageIndex = 0; pageIndex < numberOfPages; pageIndex++)
{
    IWebElement table = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("table.table")));
    ReadOnlyCollection<IWebElement> questions = table.FindElements(By.CssSelector("tbody > tr.myClass"));
    foreach (IWebElement question in questions)
    {
        string value = random.Next(2) == 0 ? "T" : "F";
        question.FindElement(By.CssSelector($"input[value='{value}']")).Click();
    }

    if (pageIndex != numberOfPages)
    {
        driver.FindElement(By.CssSelector("button.btn-primary")).Click();
    }
}

一些反馈.

  1. 我对Faker.RandomNumber不熟悉,所以我只用了标准的Random.
  2. 不要将您的Random声明放入循环中.它可能会导致生成随机数的问题.
  3. 我建议您从页面上获取问题的计数,然后循环浏览它们,而不是硬编码数字/计数.这样,无论页面之间的问题数量有多大差异,您的计数总是正确的.
  4. 有一个编程原则称为"DRY",又名Don't repeat yourself.虽然从技术上讲,在T v F的情况下您没有重复自己的内容,但99.9%的代码是相同的,因此我将代码取出,以确定随机数是否意味着它是"T"或"F"到自己的行中,并将"T"或"F"分配给value.然后我可以将value插入到我的CSS Select 器中并单击它以 Select T/F.

我在您提供的HTML上测试了此代码,它为两个问题 Select 了一个随机值,并成功单击"继续"按钮.

Csharp相关问答推荐

有没有一种方法可以将模拟实现委托给实际的类,而不必设置每个方法?

.NET通过版本自动增量设置包版本

错误NU 1301:无法加载源的服务索引

子组件:如何根据另一个组件的状态启用输入

获取ASP.NET核心身份认证cookie名称

使用yaml将Azure函数代码部署到FunctionApp插槽时出现问题(zip未找到)

如何分配对象后的class的属性?

C#方法从AJAX调用接收NULL

Mongo作为.NET中Testcontainers的副本集

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

在使用Audit.NET的AuditTrail实现中,如何逐月将数据摄取到AzureTableStorage?

正确处理嵌套的本机集合

.NET 8 DI GetServices<;对象&>不工作

有条件地定义预处理器指令常量

Postgres ENUM类型在第一次运行时对Dapper不可见

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

如何在特定环境中运行dotnet测试?

C#System.Commandline:如何向命令添加参数以便向其传递值?

Foreach非常慢的C#

如何解决System.StackOverflowException:抛出System.StackOverflowException类型的异常.&# 39;生成随机代码时发生异常?