我在 C# 中使用 selenium 编写了以下代码:
private void SelectElementFromList(string label)
{
var xpathcount = selenium.GetXpathCount("//select");
for (int i = 1; i <= xpathcount; ++i)
{
string[] options;
try
{
options = selenium.GetSelectOptions("//select["+i+"]");
}
catch
{
continue;
}
foreach (string option in options)
{
if (option == label)
{
selenium.Select("//select[" + i + "]", "label=" + label);
return;
}
}
}
}
问题是线路:
options = selenium.GetSelectOptions("//select["+i+"]");
当 i == 1 时,此方法有效,但当 i > 1 时,该方法返回 null(“错误:元素//select[2] 未找到”)。它仅在 i == 1 时有效。
我也在 JS 中尝试过这段代码:
var element = document.evaluate("//select[1]/option[1]/@value", document, null, XPathResult.ANY_TYPE, null);
alert(element.iterateNext());
var element = document.evaluate("//select[2]/option[1]/@value", document, null, XPathResult.ANY_TYPE, null);
alert(element.iterateNext());
在屏幕上打印“[object Attr]”然后打印“null”。
我做错了什么? 我的目标是遍历页面上的所有“选择”元素并找到具有指定标签的元素并选择它。
最佳答案
这是 XPath 中第二多的 FAQ(第一个是无前缀名称和默认命名空间)。
在您的代码中:
options = selenium.GetSelectOptions("//select["+i+"]");
评估类型的表达式:
//select[position() =$someIndex]
这是以下的同义词:
//select[$someIndex]
当已知 $someIndex
有一个整数值时。
但是,根据 //
XPath 伪运算符的定义,
//select[$k]
当$k
为整数时,表示:
"选择文档中所有 select
元素,它们是其父元素的 $k
-th select
子元素。”
When
i == 1
this works, but wheni > 1
the method returnnull
("ERROR: Element //select[2] not found"). It works only when i == 1.
这只是意味着在 XML 文档中没有元素具有多个 select
子元素。
这是一个需要记住的规则:[]
XPath 运算符比//
伪运算符具有更高的优先级(优先级)。
解决方案:一如既往,当我们需要覆盖运算符的默认优先级时,我们必须使用括号。
改变:
options = selenium.GetSelectOptions("//select["+i+"]");
到:
options = selenium.GetSelectOptions("(//select)["+i+"]");
关于c# - 迭代所有 'select' 元素并在 Selenium 中获取它们的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350012/