我正在尝试使用正则表达式来匹配一个包含不可预测数字的id,这个数字位于另一个可预测的字符串中间,例如:
<div id="type-84289-model" class="vehicle">
我尝试了各种各样的东西,但似乎最明显的应该是:
By.xpath("//div[matches(@id, 'type-.+-model')]"));
但是没有找到该元素。任何人都可以指出我正确的方向。
答案 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']"))
现在应该工作。