Selenium可以评估所有XPath元素吗?

时间:2009-09-10 13:37:29

标签: selenium xpath

Selenium是否可以评估可能与某个XPath匹配的所有元素?

例如,我想评估是否用//input[type='checkbox']检查所有复选框 - 问题是我只返回一个元素。

5 个答案:

答案 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]

第一个表达式将获取第一个输入,第二个表达式将获取第二个输入。使用单个“/”而不是双重“//”。

非常重要