Я пишу тестовый сценарий Selenium. А вот выражение xpath, которое я использую для сопоставления всех кнопок «Изменить» в таблице данных.
//img[@title='Modify']
У меня вопрос: как я могу посетить соответствующие наборы узлов по индексу? Я пробовал с
//img[@title='Modify'][i]
а также
//img[@title='Modify' and position() = i]
Но ни то, ни другое не работает .. Я также пробовал с проверкой XPath (одно расширение firefox). Всего найдено 13 совпадений, поэтому я совершенно не знаю, как мне выбрать одно из них .. Или XPath поддерживает определенный выбор узлов, которые не находятся в одном родительском узле?
В
i
XPath нет.Либо вы используете буквальные числа:
//img[@title='Modify'][1]
Или вы строите строку выражения динамически:
'//img[@title='Modify']['+i+']'
(но имейте в виду , что динамические выражения XPath не работают из в XSLT).Да:
(//img[@title='Modify'])[13]
Это
//img[@title='Modify'][i]
означает «любой<img>
с заголовком« Изменить »и дочерним элементом с именем<i>
».источник
td
s, которые были шестым дочерним элементом atr
и не имели пустого содержимого://tr/td[6][string-length(text()) > 0]
Нет
i
в xpath не совсем верно. Вы все еще можете использоватьcount()
для поиска index.Рассмотрим следующую страницу
<html> <head> <title>HTML Sample table</title> </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> <body> <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> </body> </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()
Оператор пригодится в подобных ситуациях.Логика:
Modify
кнопки, используя//th[.='Heading 4']
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]
Получите
Modify
кнопку из списка извлеченных узлов, используя//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
источник
td[count(../preceding-sibling::tr/th[.='Heading 4'])]/following-sibling::td
тому, что неtd[1]
каждый раз попадаю в то, что у меня нет заголовка :)это сокращение от
следовательно, возвращает i-й узел под тем же родительским узлом.
Вы хотите
источник
/descendant::img[@title='Modify'][$index]
будет нормально работать. Также обратите внимание, что[i]
предикат проверяет наличиеi
дочернего элемента.(// * [@ 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:
источник