Seleniumテストケースを書いています。そして、データテーブル内のすべての[変更]ボタンと一致させるために使用するxpath式を次に示します。
//img[@title='Modify']
私の質問は、インデックスで一致したノードセットにアクセスするにはどうすればよいですか?私が試した
//img[@title='Modify'][i]
そして
//img[@title='Modify' and position() = i]
しかし、どちらも動作しません.. XPathチェッカー(Firefox拡張機能1つ)を試しました。全部で13の一致が見つかったので、そのうちの1つを選択する方法がまったくわかりません。または、XPathは、同じ親ノードの下にないノードの指定された選択をサポートしますか?
これはFAQです:
//someName[3]
手段:ドキュメント内のすべてのsomeName
要素、つまり親の3番目のsomeName
子-多くのそのような要素が存在する可能性があります。
必要なのはまさに3番目のsomeName
要素です:
(//someName)[3]
説明:[]
は//
よりも高い優先度(優先度)を持っています。選択したノードリストのN番目のノードを指定する必要がある場合は、必ず//someName
型の式を角かっこで囲んでください。
XPathにはi
はありません。
リテラル番号を使用するか://img[@title='Modify'][1]
または、式文字列を動的に作成します:'//img[@title='Modify']['+i+']'
(ただし、動的XPath式はwithin XSLTからは機能しないことに注意してください)。
または、XPathは、同じ親ノードの下にないノードの指定された選択をサポートしますか?
はい:(//img[@title='Modify'])[13]
この//img[@title='Modify'][i]
は、「タイトルが「変更」で子要素が<img>
という名前の<i>
」を意味します。
//img[@title='Modify'][i]
の略です
/descendant-or-self::node()/img[@title='Modify'][i]
したがって、同じ親ノードの下のi番目のノードを返しています。
あなたが欲しい
/descendant-or-self::img[@title='Modify'][i]
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()
演算子は、このような状況で役立ちます。
論理:
//th[.='Heading 4']
を使用してModify
ボタンのヘッダーを検索しますcount(//tr/th[.='Heading 4']/preceding-sibling::th)+1
を使用してヘッダー列のインデックスを検索します注:インデックスは
0
で始まります
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]
を使用して、対応するヘッダーの行を取得します
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
を使用して、抽出されたノードリストからModify
ボタンを取得します
(// * [@ attribute = 'value'])[index]要素内の複数の一致を検索しながら要素のターゲットを検索します
インデックス変数のソリューションは次のとおりです
たとえば、同じロケーターで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]