【发布时间】: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"> abcd ef (ghi)</label> <br>
<label><input type="checkbox" name="searchQuery.vehicleGroups[1].isSelected" value="on" class="vehGrp"> 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