2009-09-10 56 views

回答

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 + "]")); 
} 
+0

感谢戴夫,桑蒂。我的问题是,我没有在单元测试中使用Selenium客户端的选项。不幸的是,我仅限于使用Selenium IDE和命令表,但这并不意味着我无法在一些JS中捏造同样的东西。 – 2009-09-10 15:38:18

+1

如果你在IDE中用JavaScript解决它,请提交你的解决方案。我有兴趣看到它。 :) – 2009-09-10 15:42:04

2

有办法硒没有可以评估由定位器返回的项目列表。 它只是抓住了第一个,做它的东西与它。

戴夫的回答是,你要寻找的最佳替代品。

+0

我认为它仍然值得在JS中去:) – 2009-09-10 15:39:32

2

我想在硒中完全一样的东西,并尝试使用@戴夫寻找的例子,但它是一个不正确的方法来查找集合中的单个元素。

请看下面的例子:如果你使用的语句,比如

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

所述第一表达将抓住所述第一输入和所述第二表达将抓住第二输入端。使用单个“/”而不是双“//”非常重要。

4

随着

/descendant::input[@type='text'][1] 
/descendant::input[@type='text'][2] 

你只能搜索树中的所有输入元素。如果你只是想解析一个子树,它将不起作用。

一种更好的方式是:

(/form/div/input[@type='text'])[1] 
(/form/div/input[@type='text'])[2] 

将返回结果#1,#括号内的XPath表达式的2等。

当然,你也可以做

(//input[@type='text'])[1] 

这是很方便,因为硒只是使用了第一场比赛,不能有结果集,这是通常的XPath返回处理。

5

我试过上面的方法,硒抛出异常,没有找到元素。添加前缀xpath =解决了问题。

例如

xpath=(//td[@class='cell name bold'])[1] 
xpath=(//td[@class='cell name bold'])[2] 
+0

前缀'xpath ='保存了我的一天!太感谢了! – 2015-08-28 13:59:39

相关问题