【问题标题】:Checking a box by label or index with a variable in Selenium C#在 Selenium C# 中通过标签或索引使用变量检查框
【发布时间】:2017-10-26 17:46:42
【问题描述】:

我有一个表单可以通过用户输入自动执行页面上的任务,但我无法与页面上的元素交互。这是一个具有动态名称和元素数量的 CheckBoxList。 HTML 如下所示:

    <ol id="ratingModification_SupplierContact_content">

                    <label><input type="checkbox" name="searchQuery.vehicleGroups[0].isSelected" value="on" class="vehGrp">&nbsp;abcd ef (ghi)</label> <br>

                    <label><input type="checkbox" name="searchQuery.vehicleGroups[1].isSelected" value="on" class="vehGrp">&nbsp;jklm no (pqr)</label> <br>

                </ol>

其中“abcd ef (ghi)”是第一个复选框的标签。

我已经有一个按钮,可以从元素中提取标签并将它们放入在用户帮助下设计的数组中:

    var vehicleGroupInputElements = Builder.Driver.FindElements(By.ClassName("vehGrp"));

    var vehicleGroupNames = vehicleGroupInputElements.Select(f => f.FindElement(By.XPath(".."))).Select(f => f.Text).ToArray();

我在表单的 CheckedListBox 中填充:

    vehicleGroupList.Items.AddRange(vehicleGroupNames);

但是当我尝试将用户选择发送回页面时,我遇到了问题。我尝试通过 IndexOf() 和 ClassName 基于索引进行选择,但无法弄清楚使其工作的语法。失败的例子:

    foreach (int userChecks in vehicleGroupList.CheckedItems)
        {
            int checkIndex = vehicleGroupList.Items.IndexOf(userChecks);
            var checkTarget = Builder.Driver.FindElements(By.ClassName("vehGrp"));
            checkTarget.IndexOf(checkIndex).Click();
        }

无法编译,因为 int checkIndex 无法转换为 IWebElement。我还尝试构建一个字符串来使用 xpath 寻址索引,但它找不到元素或引发无复合名称异常。失败的例子:

    foreach (int userChecks in vehicleGroupList.CheckedItems)
        {
            int checkIndex = vehicleGroupList.Items.IndexOf(userChecks);
            string elementTarget = "searchQuery.vehicleGroups[" + checkIndex + "].isSelected";
            var checkTarget = Builder.Driver.FindElements(By.XPath(string.Format("//option[contains(text(), {0}]", elementTarget))).Click();
        }

我也尝试通过类似于上面的 xpath 按标签查找元素,但它从未找到它。找到元素并检查它们的正确方法是什么?

【问题讨论】:

  • 你想顺序点击每个复选框吗?
  • 我认为这可行。我打算'foreach(我的表单上的选中项目)单击页面上的相应复选框'。但同时点击它们也可以。

标签: c# selenium xpath selenium-webdriver webdriver


【解决方案1】:

当你想点击每个复选框时,你可以使用:

var vehicleGroupInputElements = Builder.Driver.FindElements(By.ClassName("vehGrp"));

foreach (IWebElement checkbox in vehicleGroupInputElements)
{
    checkbox.Click();
}

【讨论】:

  • 刚刚尝试,编译但也只是检查页面上的所有框。
  • 这不是你想要的吗?你想完成什么?
  • 1) 我在表单中填充了一个 CheckedListBox,其中包含网页 CheckBoxList 中的所有项目。 (作品) 2) 用户选中表单中的一个或多个框。 (作品) 3)用户检查的项目在页面上进行检查。 (还不行)
【解决方案2】:

刚刚查看了 Xpath 语法并找到了答案。借助 Chrome 在检查模式下的“复制 Xpath”功能,我找到了所需的路径并成功单击了输入元素。

第一个输入的示例 Xpath 如下(注意 HTML 的 label[index] 比 C# 的计数方式多 1。)

    //*[@id="ratingModification_SupplierContact_content"]/label[1]/input

解决方法如下

    //Retrieves the checked items from the form and sends them to the page.
        foreach (object checkedItem in vehicleGroupList.CheckedItems)
        {
            //Gets the index of the checked items.
            int checkedIndex = vehicleGroupList.Items.IndexOf(checkedItem);
            //Adds 1 to the index to match format of the page HTML.
            checkedIndex++;
            //Puts the index+1 into a string.
            string indexText = checkedIndex.ToString();
            //Finds the element by index+1.
            var clickTarget = Builder.Driver.FindElement(By.XPath(string.Format("//*[@id='ratingModification_SupplierContact_content']/label[" +indexText+ "]/input")));
            clickTarget.Click();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多