Selenium是否可以评估可能与某个XPath
匹配的所有元素?
例如,我想评估是否用//input[type='checkbox']
检查所有复选框 - 问题是我只返回一个元素。
答案 0 :(得分:11)
您可以使用getXpathCount命令确定匹配元素的数量。然后,您可以使用增量循环遍历它们以单独定位每个元素。以下Java(TestNG / JUnit)示例将检查页面上的所有复选框是否已选中:
int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}
答案 1 :(得分:5)
我尝试了上面的方法,selenium抛出了未找到元素的异常。添加前缀xpath =解决了问题。
示例
xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2]
答案 2 :(得分:4)
使用
/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]
您只能在树中搜索所有输入元素。如果您只想解析子树,它将无法工作。
更好的方法是:
(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]
将返回括号内XPath表达式的结果#1,#2等。
当然你也可以做
(//input[@type='text'])[1]
这非常方便,因为Selenium只使用第一个匹配并且无法处理结果集,这是XPath通常返回的结果集。
答案 3 :(得分:2)
selenium无法评估定位器返回的项目列表。 它只是抓住了第一个并用它来做它的东西。
戴夫的回答是您正在寻找的最佳选择。
答案 4 :(得分:2)
我试图在Selenium中做同样的事情并尝试使用@ dave-hunt的例子,但这是一种在集合中查找单个元素的错误方法。
考虑以下示例:
<form>
<div>
<input type="text" name="field1" />
</div>
<div>
<input type="text" name="field2" />
</div>
</form>
如果您使用如下表达式:
//input[@type='text'][1]
这将返回页面中的所有文本输入。为什么?因为每个输入都是其自己树中的第一个匹配元素。
但是,如果您使用如下表达式:
/descendant::input[@type='text'][1]
或
/descendant::input[@type='text'][2]
第一个表达式将获取第一个输入,第二个表达式将获取第二个输入。使用单个“/”而不是双重“//”。
非常重要