Как использовать XPath contains() для определенного текста?

#selenium-webdriver #xpath

Вопрос:

Допустим, у нас есть HTML-таблица, которая в основном выглядит так:

 2|1|28|9|
3|8|5|10|
18|9|8|0|
 

Я хочу выбрать ячейки, которые содержат только 8 и ничего больше, то есть только 2-ю ячейку строки 2 и 3-ю ячейку строки 3.

Вот что я попробовал: //table//td[contains(.,'8')] . Это дает мне все ячейки, которые содержат 8. Итак, я также получаю нежелательные значения 28 и 18.

Как мне это исправить?

ИЗМЕНИТЬ: Вот пример таблицы, если вы хотите попробовать свой xpath. Используйте календарь с левой стороны-https://sfbay.craigslist.org/sfc/

Ответ №1:

Будьте осторожны с contains() функцией.

Распространенной ошибкой является его использование для проверки того, содержит ли элемент значение. Что он действительно делает, так это проверяет, содержит ли строка подстроку. Итак, td[contains(.,'8')] принимает строковое значение td ( . ) и проверяет, содержит ли оно какие-либо '8' подстроки. Это может быть то, чего вы хотите, но часто это не так.

Этот XPath,

 //td[.='8']
 

будут выбраны все td элементы, строковое значение которых равно 8 .

В качестве альтернативы, этот XPath,

 //td[normalize-space()='8']
 

будет выбраны все td элементы, строковое значение которых равно нормализующему пространству () 8 . (Функция XPath normalize-space() удаляет начальные и конечные пробелы и заменяет последовательности пробелов одним пробелом.)

Примечания:

  • Оба будут работать, даже если 8 находится внутри другого элемента, такого как a , b , span , и т.д. div
  • Оба не <td>gr8t</td> будут совпадать <td>123456789</td> , и т. Д.
  • При использовании normalize-space() будут игнорироваться начальные или конечные пробелы, окружающие 8 .

Ответ №2:

Попробуйте следующий xpath, который будет выбирать все текстовое содержимое, а не частичные совпадения:

 //table//td[text()='8']
 

Изменить: В вашем примере HTML есть теги внутри элементов td, поэтому будет работать следующее:

 //table//td/a[text()="8"]
 

Смотрите пример в php здесь: https://3v4l.org/56SBn

Комментарии:

1. Это не работает. Пожалуйста, попробуйте xpath по ссылке, которую я теперь добавил к вопросу. Спасибо.