Как выбрать указанный узел в наборах узлов Xpath по индексу с селеном?



Я пишу тестовый случай Селена. И вот выражение xpath, которое я использую, чтобы соответствовать всем кнопкам "изменить" в таблице данных.



//img[@title='Modify']


мой вопрос, как я могу посетить соответствующие наборы узлов по индексу? Я пробовал с



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


и



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


но ни один не работает..
Я также пробовал с XPath checker (одно расширение firefox). Всего найдено 13 совпадений, тогда я совершенно не знаю, как я собираюсь выбрать один из них..
или XPath поддерживает указанный выбор узлов, которые не находятся под одним родительским узлом?

557   5  

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]/button

The count() оператор пригодится в таких ситуациях.

логика:

  1. найти заголовок Modify кнопка с помощью //th[.='Heading 4']
  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. скачать Modify кнопка из списка извлеченных узлов с помощью //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button

Comments

    Ничего не найдено.