4

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")]
4

4 に答える 4

0

ここに貼り付けた生成出力には、文字列が含まれていませんnumber_。含まれてNumber_ます-大文字に注意してくださいN-しかし、それは文字列の最初の部分ではありません。おそらくあなたはこのようなものを意味しました(少なくとも何かを選択します):

(//input[contains(@id, 'Number_')])[2]

または:

(//input[starts-with(@id,'catalogNumber_')])[2]
于 2012-12-11T20:11:27.000 に答える
0

Iwburkが述べたように、これは名前空間の問題でした。Selenium APIによると、

http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/Selenium.html

xpath式を使用しているときに、xpath=xpathExpressionを使用してクエリ文字列を次のように変更する必要がありました。

String path = "xpath=(//input[starts-with(@id,'quantity_')])[2]";

ここで関連する投稿を見つけ ました。ElementはXPathCheckerにありますが、Seleniumにはありません。

于 2012-12-11T22:55:28.943 に答える
0

セレンの構文の問題に加えて、マークアップ構造に関連する xpath の問題があります。
xpath 1: //input[starts-with(@id,'number_')][1]
xpath 2:(//input[starts-with(@id,'number_')])[1]

以下のサンプルでは、​​xpath 1 は 2 つのノード (正しくない) を返し、xpath 2 は正しくなります。これは、inputノードが兄弟ではないため、結果のノードセットを参照するために括弧で囲む必要があるためです。

<div id="phones">
    <div>
        <input id="number_1" name="number_1" type="text"/>
    </div>
    <div>
        <input id="number_2" name="number_2" type="text" />
    </div>
</div>

括弧なしの結果

/ > xpath //input[starts-with(@id,'number_')][1]
Object is a Node Set :
Set contains 2 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=number_1
    ATTRIBUTE name
    TEXT
        content=number_1
    ATTRIBUTE type
    TEXT
        content=text
2  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=number_2
    ATTRIBUTE name
    TEXT
        content=number_2
    ATTRIBUTE type
    TEXT
        content=text

この次のサンプルでは、​​ノードが兄弟であるため、括弧は違いを生みません。

<div id="other">
<input id="pre_1" type="text"/>
<input id="pre_2" type="text" />
<div>a</div>
</div>

括弧付き

/ > xpath (//input[starts-with(@id,'pre_')])[1]
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=pre_1
    ATTRIBUTE type
    TEXT
        content=text

括弧なし

/ > xpath //input[starts-with(@id,'pre_')][1]
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=pre_1
    ATTRIBUTE type
    TEXT
        content=text

テストは xmllint シェルで行われました xmllint --html --shell test.html

于 2018-04-27T23:59:29.313 に答える