#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 по ссылке, которую я теперь добавил к вопросу. Спасибо.