2013-05-17 98 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个字符的所有内容。修复了这个缺陷。 –