在Selenium中通过xpath定位器匹配div的问题

时间:2014-08-28 20:33:28

标签: java selenium xpath

我正在尝试使用正则表达式来匹配一个包含不可预测数字的id,这个数字位于另一个可预测的字符串中间,例如:

<div id="type-84289-model" class="vehicle">

我尝试了各种各样的东西,但似乎最明显的应该是:

By.xpath("//div[matches(@id, 'type-.+-model')]"));

但是没有找到该元素。任何人都可以指出我正确的方向。

4 个答案:

答案 0 :(得分:2)

您可以使用以下xpath找到该元素:

driver.findElement(By.Xpath("//div[contains(@id, 'type-')][contains(@id, '-model')][@class='vehicle']"))

答案 1 :(得分:1)

curiosu是正确的,XPath 1不支持regexp,而且Selenium不支持XPath 2. :-(

正如您所指出的,ends-with()在XPath 1.0中并不存在。所以我们可以按照以下方式调整CiaPan的答案:

By.xpath("//div[starts-with(@id, 'type-') and
   substring(@id, string-length(@id)-6) = '-model']"));

答案 2 :(得分:0)

如果id始终以一个以连字符结尾的字符串开头,后跟一个数字,并以一个以连字符开头的字符串结尾,这可能有效:

//div[ contains (translate(@id, '1234567890',''),'--')]

所以在你的情况下

By.xpath("//div[ contains (translate(@id, '1234567890',''),'--')]");

答案 3 :(得分:0)

你真的想用xpath和xpath来定位元素吗?如果没有,你只想找到div,那么你可以使用下一个选择器:

driver.findElement(By.Css(".vehicle"));
//or
driver.findElement(By.Css("div[class='vehicle']"));

<强> UDPATE 如果您需要找到与模式type-...-model匹配的div,您仍然可以使用css选择器。但是AFAIK css选择器不支持regexp,所以你可以使用starts/ends with attributes:像这样的Smth:

//find all divs which id starts with type
driver.findElement(By.Css("div[class^='type']"))
//find all divs which id ends with model
driver.findElement(By.Css("div[class$='model']"))
//find all divs which id starts with type and ends with model
driver.findElement(By.Css("div[class^='type'][class$='model']"))

现在应该工作。