Использование XPATH для поиска текста, содержащего & amp; nbsp;

StackOverflow https://stackoverflow.com/questions/247135

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую браузер XPather для проверки своих выражений XPATH на странице HTML.

Моя конечная цель - использовать эти выражения в Selenium для тестирования моих пользовательских интерфейсов.

Я получил HTML-файл с содержимым, похожим на это:

<tr>
  <td>abc</td>
  <td>&nbsp;</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()='&nbsp;'])" />

Возвращаемое значение равно 1, что является правильным значением в моем тестовом примере.

Однако мне пришлось объявить nbsp как сущность в моем XML и XSL, используя следующее:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

Я не уверен, поможет ли это вам, но я смог на самом деле найти nbsp с помощью выражения XPath.

Редактировать: мой пример кода на самом деле содержит символы '& amp; nbsp;' , но подсветка синтаксиса JavaScript преобразует его в пробел. Не вводите в заблуждение!

Поиск & amp; nbsp; или только nbsp - вы пробовали это?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top