Selenium C# 嵌套循环

问题描述 投票:0回答:1

我有一个 HTML 表格,每页显示大约 20 个对/错问题。我有一个循环运行来随机回答每个问题。一旦页面上的问题完成,就会弹出一个按钮以进入下一页。不过大概有20页。我不想一遍又一遍地重复相同的步骤(specflow),而是想创建一个嵌套循环,但我无法让它工作。

我尝试过的一个例子。这将增加 TR,使其落在每个问题上并随机回答。然后,我尝试对一个元素执行 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>
c# selenium-webdriver
1个回答
0
投票

鉴于您提供的 HTML,我会这样写...

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;

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

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var table = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("table.table")));
Random random = new Random();
var questions = table.FindElements(By.CssSelector("tbody > tr.myClass"));
foreach (var question in questions)
{
    string value = random.Next(2) == 0 ? "T" : "F";
    question.FindElement(By.CssSelector($"input[value='{value}']")).Click();
}

driver.FindElement(By.CssSelector("button.btn-primary")).Click();

一些反馈...

  1. 我不熟悉
    Faker.RandomNumber
    所以我只使用标准的
    Random
  2. 不要将
    Random
    声明放在循环内...这可能会导致生成随机数的问题。
  3. 我建议您不要对数字/计数进行硬编码,而是从页面中获取问题的计数,然后循环遍历它们。这样,无论页面之间的问题数量有多少变化,您的计数始终是正确的。
  4. 有一个称为“DRY”的编程原则,又名不要重复自己。虽然您在 T v F 情况下技术上没有重复自己,但 99.9% 的代码是相同的,因此我将确定随机数是否表示“T”或“F”的代码提取到自己的行中并分配“T” ”或“F”至
    value
    。然后我可以将
    value
    插入 CSS 选择器并单击它以选择 T/F。

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

© www.soinside.com 2019 - 2024. All rights reserved.