Использование XPATH для поиска текста, содержащего & amp; nbsp;
Вопрос
Я использую браузер XPather для проверки своих выражений XPATH на странице HTML.
Моя конечная цель - использовать эти выражения в Selenium для тестирования моих пользовательских интерфейсов.
Я получил HTML-файл с содержимым, похожим на это:
<tr> <td>abc</td> <td> </td> </tr>
Я хочу выбрать узел с текстом, содержащим строку " & amp; nbsp;
".
С нормальной строкой, такой как " abc " нет проблем. Я использую XPATH, аналогичный // td [text () = & abot; abc "]
.
Когда я пытаюсь использовать XPATH, такой как // td [text () = & amp; nbsp; "]
, он ничего не возвращает. Существует ли специальное правило, касающееся текстов с
Решение
Похоже, что OpenQA , ребята из Selenium, уже решили эту проблему. Они определили некоторые переменные для точного сопоставления пробелов. В моем случае мне нужно использовать XPATH, аналогичный // td [text () = " $ {nbsp} "]
.
Я воспроизвел здесь текст из OpenQA, касающийся этой проблемы (найден здесь ):
HTML автоматически нормализуется пробелы внутри элементов, игнорируя ведущие / конечные пробелы и конвертирование дополнительные пробелы, табуляции и новые строки в единое пространство Когда Селен читает текст вне страницы, он пытается продублируйте это поведение, чтобы вы могли игнорировать все вкладки и новые строки в ваш HTML и делать утверждения на основе как текст выглядит в браузере, когда оказаны. Мы делаем это, заменяя все невидимые пробелы (включая неразрывный пробел "
& nbsp;
" с единое пространство Все видимые переводы (< br >
,< p >
и< pre >
отформатированный новые строки) должны быть сохранены.Мы используем ту же логику нормализации на текст HTML-теста Selenese столы. Это имеет ряд преимущества. Во-первых, вам не нужно посмотрите на источник HTML страницы, чтобы выяснить, что ваши утверждения должны быть; & Quot; <код> & амп; NBSP; код> & Quot; символы невидимы до конечного пользователя, и поэтому вы не должны должны беспокоиться о них при написании Селенские тесты. (Вам не нужно ставить & Quot; <код> & амп; NBSP; код> & Quot; маркеры в вашем тестовом случае assertText на поле, которое содержит "
& nbsp;
" ;.) Вы также можете добавить дополнительные переводы строк и пробелы в вашем Selenese теги< td >
; так как мы используем то же самое логика нормализации на тестовом примере как мы делаем на тексте, мы можем обеспечить что утверждения и извлеченный текст будет точно соответствовать.Это создает небольшую проблему на те редкие случаи, когда вы действительно хочу / нужно вставить лишние пробелы в вашем тестовом случае. Например, вы может потребоваться ввести текст в поле, подобное это: "
foo
" ;. Но если вы просто напишите< td > foo < / td >
в своем Селенезе, мы заменим ваш дополнительные пробелы только с одним пробелом.Эта проблема имеет простой обходной путь. Мы определили переменную в Selenese,
$ {пробел}
, значение которого является единственным пространство. Вы можете использовать$ {space}
для вставить пробел, который не будет автоматически обрезается, вот так: <Код> & л; тд & GT; $ Foo {пробел} $ {пробел} $ {пробел} & л; / & тд GT; код>. Мы также включили переменную$ {nbsp}
, который вы можете использовать для вставки неразрывный пробел.Обратите внимание, что XPath не нормализует пробел, как мы делаем. Если тебе надо написать XPath как
// div [text () = " привет мир "]
но HTML-код ссылки действительно "hello & amp; nbsp; world
" вам потребуется вставить реальный "& nbsp;
" в ваш Selenese тестовый пример, чтобы он соответствовал, как это: <Код> // ДИВ [текст () = & Quot; привет $ {} NBSP мир & Quot;]. Код>
Другие советы
Я обнаружил, что могу найти совпадение при вводе жестко запрограммированного неразрывного пробела (U + 00A0), набрав Alt + 0160 в Windows между двумя кавычками ...
//table[@id='TableID']//td[text()=' ']
работал для меня со специальным символом.
Из того, что я понял, стандарт XPath 1.0 не поддерживает экранирование символов Юникода. Кажется, для этого есть функции в XPath 2.0, но похоже, что Firefox не поддерживает его (или я что-то неправильно понял). Так что вы должны делать с локальной кодовой страницей. Ужасно, я знаю.
На самом деле, похоже, что стандарт полагается на язык программирования, использующий XPath, для обеспечения правильной escape-последовательности Юникода ... Итак, каким-то образом я поступил правильно.
Попробуйте использовать десятичную сущность & amp; # 160;
вместо именованной сущности. Если это не сработает, вы можете просто использовать unicode символ для неразрывного пробела вместо сущности & amp; nbsp;
. Р>
(Примечание: я не пробовал это в XPather, но я пробовал это в Oxygen.)
Помните, что совместимый со стандартами процессор XML заменит любые ссылки на сущности, кроме пяти стандартных ссылок XML ( & amp; amp;
, & amp; gt;
, & amp; lt;
, & amp; apos;
, & amp; quot;
) с соответствующим символом в целевой кодировке ко времени, когда выражения XPath равны оценены. Учитывая такое поведение, предложения PhiLho и jsulak - это путь, если вы хотите работать с инструментами XML. Когда вы вводите & amp; # 160;
в выражении XPath, его следует преобразовать в соответствующую последовательность байтов до применения выражения XPath.
Я не могу найти соответствие с помощью Xpather, но мне помогло следующее с простыми файлами XML и XSL в блокноте Microsoft XML:
<xsl:value-of select="count(//td[text()=' '])" />
Возвращаемое значение равно 1, что является правильным значением в моем тестовом примере. Р>
Однако мне пришлось объявить nbsp как сущность в моем XML и XSL, используя следующее:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
Я не уверен, поможет ли это вам, но я смог на самом деле найти nbsp с помощью выражения XPath.
Редактировать: мой пример кода на самом деле содержит символы '& amp; nbsp;' , но подсветка синтаксиса JavaScript преобразует его в пробел. Не вводите в заблуждение!
Поиск & amp; nbsp;
или только nbsp
- вы пробовали это?