2013-05-17 44 views
1

在Google上進行研究我相信你可以在XPATH語句中使用*作爲通配符,但似乎並非如此。因此,任何人都可以幫助我找到一個很好的XPATH語句,用於以下情況:在WebDriver中使用通配符By.XPATH

我有X個輸入字段,其ID模式爲「optionsX.name」。 X可以是任何數字,但可能在0-99之間,所以可能是2位數字。 像:

<input id="options0.name" type="text" value="value" name="options[0].name"> 

我如何返回所有匹配的模式輸入元素XPATH語句? 我嘗試了之前提到的通配符是這樣的:

int numberOfFields = getDriver().findElements(By.xpath("//input[@id='options*.name']")).size(); 

隨着使用的XPath之中:

//input[@id='options*.name'] 

我想,只有ID爲excatly「選項??名。」這裏返回輸入的語句??可以是一個或兩個數字的通配符/未知數,因爲還有其他類似的輸入與我不想包含的其他結尾。所以我需要通配符的前綴和後綴。

問候馬丁

回答

2

使用XPath 2.0

正則表達式不能在字符串比較中使用通配符。在XPath 2.0(這不是由硒支持),您可以使用這對正則表達式匹配fn:matches(...)

//input[matches(@id, 'options\d+\.name')] 

模擬通配符XPath 1.0中

在XPath 1.0中,所有你能做的就是檢查開始和字符串的結尾對模式(實際上就像中間有一個通配符一樣)。可悲的是,儘管有starts-with(...)ends-with(...)僅可開始使用XPath 2.0,所以我們必須要解決的是:

//input[starts-with(@id, 'options') and contains(substring(@id, string-length(.)-4), '.name') 

這是不可能的使用模式來構建多個通配符的一個字符串。

+0

Thx。我在看到你之前最終做到了這一點:「//輸入[開始(with @id,'options')幷包含(@id,'。name')]」但不如你的精確。你能解釋一下你的方法中的子字符串(@id,4)嗎?剪掉ID的4個第一個字符?因爲這不適合模式,因爲我需要查看「.name」的最後5個字符。 –

+0

是的,這應該是'字符串長度(。) - 4'。我們希望_last 5位數字,而不是來自第4個字符的所有內容。修復了這個缺陷。 –