Как выбрать указанный узел в наборах узлов Xpath по индексу с селеном?
Я пишу тестовый случай Селена. И вот выражение xpath, которое я использую, чтобы соответствовать всем кнопкам "изменить" в таблице данных.
//img[@title='Modify']
мой вопрос, как я могу посетить соответствующие наборы узлов по индексу? Я пробовал с
//img[@title='Modify'][i]
и
//img[@title='Modify' and position() = i]
но ни один не работает..
Я также пробовал с XPath checker (одно расширение firefox). Всего найдено 13 совпадений, тогда я совершенно не знаю, как я собираюсь выбрать один из них..
или XPath поддерживает указанный выбор узлов, которые не находятся под одним родительским узлом?
5 ответов:
это FAQ:
//someName[3]означает: все
someNameэлементы в документе, которые являются третьейsomeNameребенок их родителя -- может быть много таких элементов.что вы хотите именно 3-й
someNameэлемент:(//someName)[3]объяснение: the
[]имеет более высокий приоритет (приоритет), чем//. Помните всегда ставить выражения типа//someNameв скобках когда вам нужно указать N-й узел своего выбранного узла-список.
нет
iв XPath.либо вы используете буквенные числа:
//img[@title='Modify'][1]или вы строите строку выражения динамически:
'//img[@title='Modify']['+i+']'(но имейте в виду, что динамические выражения XPath не работает с внутри XSLT).или XPath поддерживает указанный выбор узлов которые не находятся под тем же родительским узлом?
да:
(//img[@title='Modify'])[13]
этой
//img[@title='Modify'][i]означает "любое<img>с названием 'Modify' и дочерним элементом с именем<i>."
//img[@title='Modify'][i]сокращенно
/descendant-or-self::node()/img[@title='Modify'][i]следовательно, возвращает i-й узел под тем же родительским узлом.
вы хотите
/descendant-or-self::img[@title='Modify'][i]
(//*[@attribute= 'value']) [index] чтобы найти цель элемента при нахождении нескольких совпадений в нем
нет
iв xpath не совсем верно. Вы все еще можете использовать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]/buttonThe
count()оператор пригодится в таких ситуациях.логика:
- найти заголовок
Modifyкнопка с помощью//th[.='Heading 4']- найти индекс столбца заголовка с помощью
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]скачать
Modifyкнопка из списка извлеченных узлов с помощью//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
Comments