我使用 AjaxFormLoop 生成了以下 HTML。
<div id="phones">
<div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdd8b6">
<input id="number_13b87fdd8b6" name="number_13b87fdd8b7" type="text"/>
<a id="removerowlink_13b87fdd8b6" href="#" name="removerowlink_13b87fdd8b6">remove</a>
</div>
<div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdda70" style="background-image: none; background-color: rgb(255, 255, 251);">
<input id="number_13b87fdda70" name="number_13b87fdda70" type="text" />
<a id="removerowlink_13b87fdda70" href="#" name="removerowlink_13b87fdda70">remove</a>
</div>
</div>
我正在尝试使用部分 ID 访问子 2 中的第二个输入字段,但是我没有成功地让它工作。
到目前为止我所尝试的。
String path = "//input[contains(@id,'number_')][2]";
String path = "(//input[contains(@id,'number_')])[2]";
我什至不能使用 1 而不是 2 访问输入 1,但是如果我删除 [2] 并且只使用
String path = "//输入[包含(@id,'number_')]";
我可以毫无问题地访问第一个字段。
如果我使用确切的 ID,我可以毫无问题地访问任一字段。
如果可能,我确实需要使用 id,因为每个 t-forminjector 行中有更多字段在此示例中不存在。
使用 Selenium 实现。
final String path = "(//input[starts-with(@id,'quantity_')])[2]";
new Wait() {
@Override
public boolean until() {
return isElementPresent(path);
}
}.wait("Element should be present", TIMEOUT);
解决
我注意到我似乎无法使用以下开头/包含来定位 dom 中的任何元素,但是如果我使用完整的 id,它就可以工作。
//Partial ID - fails
//*[starts-with(@id,"quantity_")]
//Exact ID - works
//*[starts-with(@id,"quantity_-112409575185705")]