我在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时,这可行,但是当我&gt; 1方法返回null(“ERROR:Element // select [2] not found”)。它仅在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”。
我做错了什么? 我的目标是迭代页面上的所有“选择”元素并找到具有指定标签的元素并选择它。
答案 0 :(得分:4)
这是XPath中第二大常见问题解答(第一个是无前缀名称和默认命名空间。
在您的代码中:
options = selenium.GetSelectOptions("//select["+i+"]");
评估类型的表达式:
//select[position() =$someIndex]
是以下词的同义词:
//select[$someIndex]
当已知$someIndex
具有整数值时。
但是,根据//
XPath伪运算符的定义,
//select[$k]
当$k
为整数时,表示:
“选择文档中所有select
元素,这些元素是其父级的$k
- select
子级。”
当
i == 1
有效时,但当i > 1
方法返回null
时(“错误: 元素//选择[2]未找到“)。仅当i == 1时才有效。
这只是意味着在XML文档中没有包含多个select
子元素的元素。
这是一条需要记住的规则:[]
XPath运算符的优先级(优先级)高于//
伪运算符。
解决方案:与我们需要覆盖运算符的默认优先级一样,我们必须使用括号。
更改强>:
options = selenium.GetSelectOptions("//select["+i+"]");
以强>:
options = selenium.GetSelectOptions("(//select)["+i+"]");
答案 1 :(得分:1)
最后我找到了解决方案。 我刚刚更换了这些行
options = selenium.GetSelectOptions("//select["+i+"]");
selenium.Select("//select["+i+"]", "label="+label);
与这些
options = selenium.GetSelectOptions("//descendant::select[" + i + "]");
selenium.Select("//descendant::select[" + i + "]", "label=" + label);
答案 2 :(得分:0)
上述解决方案options = selenium.GetSelectOptions("(//select)["+i+"]");
对我不起作用,但我尝试使用css选择器。
我想获取用户名和密码文本框。我尝试使用css=input
这给了我用户名文本框,当使用css=input+input
时,这给了我密码文本框。
与这些选择器一起,你可以组合使用很多东西。
here是我阅读的链接。
我认为这有助于你实现目标。
的问候。