Я использую Selenium с xpath для получения определенных элементов. У меня есть html-страница со следующими элементами:

<td>A</td>
<td><em>B</em></td>

Я пробовал использовать следующее выражение xpath для поиска элементов td:

//td[contains(text(), 'A')] 
//td[contains(text(), 'B')]

Выражение находит <td>A</td>, но не <td><em>B</em></td>

Как я могу написать выражение xpath, которое находит теги td без подэлементов и с одним или несколькими подэлементами?

1
magnusarinell 7 Сен 2016 в 13:43

3 ответа

Лучший ответ

Попробуйте вместо этого

//td[contains(., 'A')]
//td[contains(., 'B')]

Это вернет теги td. Разница между . и text (), на которые вы можете ссылаться - XPath: разница между точкой и текстом () .

2
Community 23 Май 2017 в 12:32

Вам необходимо понять разницу между Проверка узлов text () и строковых значений в XPath.

Здесь вы хотите проверить строковое значение td:

//td[. = 'B']

Таким образом, оба

<td>B</td>

А также

<td><em>B</em></td>

Будут выбраны независимо от em.

1
Community 23 Май 2017 в 12:22

Вы можете использовать ancestor, чтобы получить первый тег <td>

//*[contains(text(), 'A')]/ancestor::td[1]
//*[contains(text(), 'B')]/ancestor::td[1]

И вообще использовать

String text = "A";
driver.findElement(By.xpath("//*[contains(text(), '" + text + "')]/ancestor::td[1]"));
0
Guy 7 Сен 2016 в 11:15