2011-10-14 53 views
11

我想使用文本在網頁上查找元素。
我知道有一個方法名稱包含這樣做,例如:Selenium:如何使用精確文本匹配查找節點

tr[contains(.,'hello')]/td 

但問題是,如果我有兩個元素的名字打招呼,hello1那麼這個功能不能正常工作。

有沒有其他方法像包含精確的字符串匹配來定位元素?

+0

你是什麼意思「不能正常工作」?什麼是意想不到的行爲? –

+0

如果我們有兩個元素與文本hello和hello1,當我們使用contains(。,'你好'),那麼這個方法將始終尋找你好。問題如果這些元素是在一個表中,hello1是第一個元素,hello是第二個元素,當我們使用containsHello時,它總是指向hello1,因爲它是第一個元素,包含hello,但是我們想要搜索hello,爲什麼我需要精確匹配方法 –

回答

1

那麼,你的問題是,你正在搜索文本到TR(這是不正確的反正),這導致功能contains不能接受文本列表的問題。嘗試改爲使用此位置路徑。它應該檢索你想要的。

//tr/td[contains(./text(),"hello")] 

此位置路徑將檢索一組節點,您必須在該節點上迭代以獲取文本。您可以嘗試追加

/text() 

,但這樣會導致(至少在我的測試)的結果是一個字符串,它是所有匹配的字符串的串聯。

+0

使用'contains(。,無論什麼)「,儘管這可能不是阿比納夫真正想要的東西。 '.'是'self :: node()'的縮寫,不適用於'descendant-or-self :: text()',所以它會導致TR及其所有後代轉換爲字符串,連接並進行比較,而不是尋找匹配的單個文本節點。 –

+0

@RossPatterson事實是,如果你製作了一個好的代碼,那麼在tr下面沒有文本,只有一個(或更多)td文本。考慮到這一點,我說了「哪個不正確」。 –

16
tr[.//text()='hello']/td 

,那麼在它選擇一個孩子的所有TR元素的所有TD子元素與正是「你好」。這樣的XPath對我來說聽起來很奇怪。

我認爲,這更有意義:

tr/td[./text()='hello'] 

,因爲它僅選擇包含文本的TD。

這有幫助嗎?

3

這一切都取決於你的HTML實際上包含了,但你的tr[contains(.,'hello')]/td XPath的選擇意味着「包含在其內任何地方字符串‘hello’第一行的第一個單元格」(或者,更準確地說,「的在TR元素中的第一個TD元素,其中包含字符串'hello'「,因爲Selenium不知道涉及的元素究竟是幹什麼的)。這就是爲什麼當包含「hello」和「hello1」的行都包含「hello」時,它會得到錯誤的結果。

選擇器tr[. ='hello']/td會更準確,但有點不尋常(因爲HTML TR元素不應該包含文本 - 文本應該位於TR內的TH或TD元素中),並且可能會獲勝不起作用(因爲任何其他單元格中的文本都會打破比較)。 您可能想要tr[td[.='hello']]/td,這意味着「」TR元素中包含的第一個TD元素包含一個TD元素,該元素具有字符串'hello',因爲它是完整文本「。

+0

剛剛瞭解了。='文本'技巧感謝這篇文章。謝謝@羅斯帕特森! 在這種情況下,您可以使用//td[.='hello']在頁面上完全匹配ANY td以查找包含完全'hello'的任何TD單元格。除非要確保td在tr內,否則tr可能不是必需的。 –

相關問題