找到一个忽略字符串中数字的xpath

时间:2013-03-13 14:10:19

标签: ruby regex ruby-on-rails-3 xpath

实际的xpath为//*[@id="location_in_196548881_chzn"],其间的数字是随机生成的。我想搜索这个节点。

当id为常数时,我对搜索的调用是这样的

find(:xpath,'//*[@id="location_in_196548881"]')

试过这个,但没有工作

//id[contains(text(), 'location_in_')]

如何在找到此ID时忽略此数字?

HTML代码段

<div class='control-group'>
<label class='control-label' for='inputLocation'>
Location
</label>
<div class='controls location'>
<select class="span6 first" data-chosen_select="true" data-placeholder="via Location" id="location_in_196548881" name="browse[relation][location_in][]"><option value=""></option>
<optgroup label="Top"><option value="43705">Bangalore</option>
<option value="43767">Chennai</option>

1 个答案:

答案 0 :(得分:0)

你正在考虑正确的思路,但是如果你的原始XPath适用于静态数字,那么只需用你在第二个XPath中尝试的内容替换@id=''部分,如下所示:

//*[contains(@id,'location_in_')]

如果id是一个属性,那么您正在使用第一个XPath正确引用它,这就是为什么要回来的原因。在第二次调用中,您将引用它,就像它是包含您正在查找的文本的节点一样。

换句话说,//id[contains(text(), 'location_in_')]适用于

之类的内容
<root>
<id>location_in_12345</id>
</root>

但你真正想要的是

<root>
<node1 id="location_in_1235">text</node1>
<node2 id="location_in_5678">text</node2>
</root>

因此,您将使用我提供的内容替换原始XPath:

find(:xpath,'//*[contains(@id,"location_in_")]')