2010-10-27 126 views
2

我試圖找到一個Selenium/PHP XPath來匹配包含多個元素(文本和表單元素)的表格行。Selenium,xpath匹配包含多個元素的表格行

實施例:

<table class="foo"> 
    <tr> 
    <td>Car</td><td>123</td><td><input type="submit" name="s1" value="go"></td> 
    </tr> 
</table> 

這適用於一個單一的文本元素:

$this->isElementPresent("//table/tbody/tr/td[contains(text(), 'Car')]"); 

雖然這並不(省略/ TD定位器):

$this->isElementPresent("//table/tbody/tr[contains(text(), 'Car')]"); 

因此這顯然不適用於多個元素:

$this->isElementPresent("//table/tbody/tr[contains(text(), 'Car')][contains(text(), '123')]"); 

對於每行x列y,另一種方法是使用getTable("xpath=//table[@class='foo'].x.y")。麻煩,但它的工作......主要是。它不會返回<input>標籤!它會返回一個空字符串該小區:(

任何想法

回答

3

XPath表達:?

/html/body/table[descendant::td[contains(.,'Car')]]

:如果你知道你的模式,不使用一個起始//運算符,使用字符串值而不是文本節點(這樣您可以連接所有的後代文本節點)

+0

雖然這工作,我不喜歡使用一個完整的架構,它的彈性較差(例如,如果另一個開發人員增加了一些在我的表之前的頁面上,xpath會中斷)。它也不能解決我匹配包含多個指定元素的一行的原始問題。 – 2010-10-29 13:11:20

+0

@ foob.ar:這就是爲什麼我的判斷從'如果你知道你的模式'開始......你的問題是爲了使用文本()而你的問題是'任何想法?如果你知道如何進行概括,你可以修改它。你想'td'容器是不同的,或者它可能是相同的? – 2010-10-29 13:38:14

1

你可能想使用

// TD [包含, '汽車']和TD [包含, '123'] /祖先:: TR

,將選擇包含TD的TR相匹配的兩個包含參數

嘗試在Firefox中使用View Xpath插件,非常有用的插件。

詳細瞭解軸在XPath:http://www.w3schools.com/xpath/xpath_axes.asp

+0

謝謝,這似乎根據需要工作!是的,這個firefox插件很好,雖然它不吐出靈活的xpaths - 就像我在Alejandro的其他評論中所說的那樣,如果在我的表之前將某些內容添加到頁面中,xpath將會中斷。 – 2010-10-29 13:12:23

+0

@ foob.ar:這有語法錯誤... – 2010-10-29 13:30:12

+0

未對語法進行測試,對錯誤感到遺憾。我懷疑這會打破xpath,因爲xapth會選擇一個元素1- td a和b的內容,與表格的位置以及後面或後面的內容無關。希望我得到這個權利.. – Javabeginner 2010-10-29 16:10:56

2

幾條途徑可以結合|分隔器。 調整:

//tr/td[contains(text(), 'Car')]/text() | //tr/td/input[@value="s1"]/@name 
0

感謝knb的一些語法提示。 這是有點偏離主題,但與搜索,導致我在這裏...

我有一個表[名稱|價值]單元格。我需要從「name」之前的行中獲得價值。

(假的例子,但每一個環節我一直在尋找有相同的文字而沒有標識 - 該點的上下文信息是相鄰小區)

<table id="options"><tbody> 
<tr> 
<td>other</td> 
<td><a href="#clicky">edit</a></td> 
</tr> 
<tr> 
<td>this label</td> 
<td><a href="#clicky">edit</a></td> <!-- I want this button --> 
</tr> 
<tr> 
<td>other</td> 
<td><a href="#clicky">edit</a></td> 
</tr> 
</tbody></table> 

我能找回我想要的按鈕這樣,使用嵌套的[[]]條件:

//table[@id='options']/tbody/tr[td[contains(text(), 'this label')]]/td[2]/a

「得‘一’,即在包含有我要找的另一文本單元的排」

我認爲這種任務可能是一個常見的案例,所以我在這裏發佈FYI

0

在我的問題中,我有一個產品列表,它由一個獨特的SKU /目錄組合標識。如果我想將該產品添加到購物車,我通過SKU和目錄選擇了它。

使用foob.ar的例子:

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]] 

您可以合作舉辦一年一度的解決方案結合起來爲行內選擇一個特定的元素/列

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]]//input[@name='s1'] 

編輯:

上面的解決方案如果我只是在任何一列中查找這兩個值,那麼它們都可以工作。如果你想尋找與一個特定的列值,我不得不稍作修改

//table[@class='foo']/tr[td[position()=1 and contains(text(), 'Car')] and td[position()=2 and contains(text(), '123')]]//input[@name='s1'] 
相關問題