2009-09-10 55 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

相關問題