web-dev-qa-db-ja.com

Seleniumを使用してXpathノードセット内の指定されたノードをインデックスで選択する方法は?

Seleniumテストケースを書いています。そして、データテーブル内のすべての[変更]ボタンと一致させるために使用するxpath式を次に示します。

//img[@title='Modify']

私の質問は、インデックスで一致したノードセットにアクセスするにはどうすればよいですか?私が試した

//img[@title='Modify'][i]

そして

//img[@title='Modify' and position() = i]

しかし、どちらも動作しません.. XPathチェッカー(Firefox拡張機能1つ)を試しました。全部で13の一致が見つかったので、そのうちの1つを選択する方法がまったくわかりません。または、XPathは、同じ親ノードの下にないノードの指定された選択をサポートしますか?

79
Kymair Wu

これはFAQです

//someName[3]

手段:ドキュメント内のすべてのsomeName要素、つまり親の3番目のsomeName子-多くのそのような要素が存在する可能性があります。

必要なのはまさに3番目のsomeName要素です

(//someName)[3]

説明[]//よりも高い優先度(優先度)を持っています。選択したノードリストのN番目のノードを指定する必要がある場合は、必ず//someName型の式を角かっこで囲んでください。

174

XPathにはiはありません。

リテラル番号を使用するか://img[@title='Modify'][1]

または、式文字列を動的に作成します:'//img[@title='Modify']['+i+']'(ただし、動的XPath式はwithin XSLTからは機能しないことに注意してください)。

または、XPathは、同じ親ノードの下にないノードの指定された選択をサポートしますか?

はい:(//img[@title='Modify'])[13]


この//img[@title='Modify'][i]は、「タイトルが「変更」で子要素が<img>という名前の<i>」を意味します。

14
Tomalak
//img[@title='Modify'][i]

の略です

/descendant-or-self::node()/img[@title='Modify'][i]

したがって、同じ親ノードの下のi番目のノードを返しています。

あなたが欲しい

/descendant-or-self::img[@title='Modify'][i]
2
Nick Jones

Xpathにはiはありませんが、完全に真実ではありません。 count()を使用してインデックスを見つけることができます。

次のページを検討してください

<html>
        <head>
        <style>
        table, td, th {
                border: 1px solid black;
                font-size: 15px;
                font-family: Trebuchet MS, sans-serif;
        }
        table {
                border-collapse: collapse;
                width: 100%;
        }

        th, td {
                text-align: left;
                padding: 8px;
        }

        tr:nth-child(even){background-color: #f2f2f2}

        th {
                background-color: #4CAF50;
                color: white;
        }
        </style>
        <table>
                <thead>
                        <tr>
                                <th>Heading 1</th>
                                <th>Heading 2</th>
                                <th>Heading 3</th>
                                <th>Heading 4</th>
                                <th>Heading 5</th>
                                <th>Heading 6</th>
                        </tr>
                </thead>
                <tbody>
                        <tr>
                                <td>Data row 1 col 1</td>
                                <td>Data row 1 col 2</td>
                                <td>Data row 1 col 3</td>
                                <td>Data row 1 col 4</td>
                                <td>Data row 1 col 5</td>
                                <td>Data row 1 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 2 col 1</td>
                                <td>Data row 2 col 2</td>
                                <td>Data row 2 col 3</td>
                                <td>Data row 2 col 4</td>
                                <td>Data row 2 col 5</td>
                                <td>Data row 2 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 3 col 1</td>
                                <td>Data row 3 col 2</td>
                                <td>Data row 3 col 3</td>
                                <td>Data row 3 col 4</td>
                                <td>Data row 3 col 5</td>
                                <td>Data row 3 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 4 col 1</td>
                                <td>Data row 4 col 2</td>
                                <td>Data row 4 col 3</td>
                                <td>Data row 4 col 4</td>
                                <td>Data row 4 col 5</td>
                                <td>Data row 4 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 5 col 1</td>
                                <td>Data row 5 col 2</td>
                                <td>Data row 5 col 3</td>
                                <td>Data row 5 col 4</td>
                                <td>Data row 5 col 5</td>
                                <td>Data row 5 col 6</td>
                        </tr>
                        <tr>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                        </tr>
                </tbody>
        </table>

        </br>

        <table>
                <thead>
                        <tr>
                                <th>Heading 7</th>
                                <th>Heading 8</th>
                                <th>Heading 9</th>
                                <th>Heading 10</th>
                                <th>Heading 11</th>
                                <th>Heading 12</th>
                        </tr>
                </thead>
                <tbody>
                        <tr>
                                <td>Data row 1 col 1</td>
                                <td>Data row 1 col 2</td>
                                <td>Data row 1 col 3</td>
                                <td>Data row 1 col 4</td>
                                <td>Data row 1 col 5</td>
                                <td>Data row 1 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 2 col 1</td>
                                <td>Data row 2 col 2</td>
                                <td>Data row 2 col 3</td>
                                <td>Data row 2 col 4</td>
                                <td>Data row 2 col 5</td>
                                <td>Data row 2 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 3 col 1</td>
                                <td>Data row 3 col 2</td>
                                <td>Data row 3 col 3</td>
                                <td>Data row 3 col 4</td>
                                <td>Data row 3 col 5</td>
                                <td>Data row 3 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 4 col 1</td>
                                <td>Data row 4 col 2</td>
                                <td>Data row 4 col 3</td>
                                <td>Data row 4 col 4</td>
                                <td>Data row 4 col 5</td>
                                <td>Data row 4 col 6</td>
                        </tr>
                        <tr>
                                <td>Data row 5 col 1</td>
                                <td>Data row 5 col 2</td>
                                <td>Data row 5 col 3</td>
                                <td>Data row 5 col 4</td>
                                <td>Data row 5 col 5</td>
                                <td>Data row 5 col 6</td>
                        </tr>
                        <tr>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                                <td><button>Modify</button></td>
                        </tr>
                </tbody>
        </table>

        </head>
</html>

このページには2つのテーブルがあり、それぞれ一意の列名を持つ6つの列と可変データを持つ6つの行があります。最後の行には、両方のテーブルにModifyボタンがあります。

ユーザーが見出しに基づいて最初のテーブルから4番目のModifyボタンを選択する必要があると仮定します

Xpath //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/buttonを使用します

count()演算子は、このような状況で役立ちます。

論理:

  1. //th[.='Heading 4']を使用してModifyボタンのヘッダーを検索します
  2. count(//tr/th[.='Heading 4']/preceding-sibling::th)+1を使用してヘッダー列のインデックスを検索します

注:インデックスは0で始まります

  1. //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]を使用して、対応するヘッダーの行を取得します

  2. //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/buttonを使用して、抽出されたノードリストからModifyボタンを取得します

1
Eric Stanley

(// * [@ attribute = 'value'])[index]要素内の複数の一致を検索しながら要素のターゲットを検索します

1
mahesh

インデックス変数のソリューションは次のとおりです

たとえば、同じロケーターで5つの要素が見つかった場合、インデックス番号を指定して各要素に対してアクションを実行するとします(ここでは、変数にインデックス「i」が使用されます)

for(int i=1; i<=5; i++)
{
    string xPathWithVariable = "(//div[@class='className'])" + "[" + i + "]";
    driver.FindElement(By.XPath(xPathWithVariable)).Click();
}

XPathが必要です。

(//div[@class='className'])[1]
(//div[@class='className'])[2]
(//div[@class='className'])[3]
(//div[@class='className'])[4]
(//div[@class='className'])[5]
0
Srinivas Kassa