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の2番目の入力フィールドにアクセスしようとしていますが、これを機能させることができませんでした。
私がこれまでに試したこと。
String path = "//input[contains(@id,'number_')][2]";
String path = "(//input[contains(@id,'number_')])[2]";
2ではなく1を使用して入力1にアクセスすることもできませんが、[2]を削除して使用する場合のみ
文字列パス="//input [contains(@id、'number_')]";
問題なく最初のフィールドにアクセスできます。
正確なIDを使用すれば、どちらのフィールドにも問題なくアクセスできます。
この例には存在しない各t-forminjector行にさらに多くのフィールドがあるため、可能であればidを使用する必要があります。
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);
解決済み
次のstarts-with/containsを使用してdom内の要素を見つけることができないようですが、完全なIDを使用すると機能します。
//Partial ID - fails
//*[starts-with(@id,"quantity_")]
//Exact ID - works
//*[starts-with(@id,"quantity_-112409575185705")]