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

95

Я использую XPather Browser, чтобы проверить мои выражения XPATH на странице HTML.

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

У меня есть HTML файл с контентом, подобным этому:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

Я хочу выбрать node с текстом, содержащим строку "&nbsp;".

При нормальной строке, такой как "abc", проблем нет. Я использую XPATH, подобный //td[text()="abc"].

Когда я пытаюсь использовать XPATH, например //td[text()="&nbsp;"], он ничего не возвращает. Существует ли специальное правило, касающееся текстов с "&"?

  • 0
    Ваше действительное XSL-преобразование ничего не возвращает? Или только Xpather?
Теги:
xpath
selenium
search

6 ответов

85
Лучший ответ

Кажется, что OpenQA, ребята, стоящие за Selenium, уже решили эту проблему. Они определили некоторые переменные, чтобы явно сопоставлять пробелы. В моем случае мне нужно использовать XPATH, подобный //td[text()="${nbsp}"].

Я воспроизвел здесь текст из OpenQA по этой проблеме (нашёл здесь):

HTML автоматически нормализуется пробел внутри элементов, игнорирование ведущие/конечные пробелы и преобразование дополнительные пробелы, вкладки и новые строки в одиночное пространство. Когда Селен читает текст на странице, он пытается дублируйте это поведение, так что вы можете игнорировать все вкладки и новые строки в ваш HTML и делать утверждения на основе как выглядит текст в браузере, когда оказаны. Мы делаем это, заменяя все невидимые пробелы (включая неразрывное пространство "&nbsp;" ) с одиночное пространство. Все видимые строки новой строки (<br>, <p> и <pre> отформатировано новые строки).

Мы используем ту же логику нормализации на текст тестового примера HTML Selenese столы. У этого есть ряд преимущества. Во-первых, вам не нужно посмотрите на HTML-страницу страницы, чтобы выясните, какие ваши утверждения должны быть; Символы "&nbsp;" невидимы конечному пользователю, и поэтому вы не должны приходится беспокоиться о них при написании Селенские тесты. (Вам не нужно ставить Маркеры "&nbsp;" в вашем тестовом примере to assertText в поле, которое содержит "&nbsp;" .) Вы также можете добавить дополнительные новые строки и пробелы в вашей селенской теги <td>; поскольку мы используем тот же логика нормализации на тестовом примере как мы делаем по тексту, мы можем обеспечить что утверждения и извлеченный текст будет точно соответствовать.

Это создает некоторую проблему при эти редкие случаи, когда вы действительно хотите/нужно вставить лишние пробелы в вашем тестовом случае. Например, вы может потребоваться ввести текст в поле типа это: "foo". Но если вы просто напишите <td>foo </td> в своем Selenese, мы заменим ваш дополнительные пробелы с одним пробелом.

Эта проблема имеет простую обходную задачу. Мы определили переменную в Selenese, ${space}, значение которого равно единице пространство. Вы можете использовать ${space} для вставьте пробел, который не будет автоматически обрезается, например: <td>foo${space}${space}${space}</td>. Мы также включили переменную ${nbsp}, которую вы можете использовать для вставки неразрывное пространство.

Обратите внимание, что XPaths не нормализуют пробелы, как мы делаем. Если тебе надо написать XPath как //div[text()="hello world"], но HTML ссылки действительно "hello&nbsp;world", вам нужно будет вставьте реальный "&nbsp;" в свой Selenese тестовый кейс, чтобы заставить его соответствовать, как это: //div[text()="hello${nbsp}world"].

  • 1
    Ссылка OpenQA больше не загружается успешно
  • 1
    Я просто хочу отметить, что $ {nbsp} не работает для меня в инструментах разработки Selenium или Chrome, равно как и \u00a0 . То, что работало для меня, печатало неразрывный пробел, на Mac Alt+Shift+Space . Веб-поиск говорит Alt+0160 на окнах.
16

Я нашел, что могу выполнить совпадение, когда я вводил жестко закодированное неразрывное пространство (U + 00A0), набрав Alt + 0160 на Windows между двумя кавычками...

//table[@id='TableID']//td[text()=' ']

работал со мной со специальным char.

Из того, что я понял, стандарт XPath 1.0 не справляется с экранированием символов Unicode. Кажется, в XPath 2.0 есть функции для этого, но похоже, что Firefox не поддерживает его (или я что-то не понял). Таким образом, вам нужно сделать локальную кодовую страницу. Ужасно, я знаю.

На самом деле, похоже, что стандарт опирается на язык программирования с использованием XPath для обеспечения правильной последовательности Unicode-escape-последовательности... Итак, как-то я сделал правильные вещи.

  • 0
    Используя Xpather 1.4.1 в Firefox 2, // td [text () = ''] не дает результатов.
  • 0
    Сожалею. Это не работает для меня. Моя конечная цель - использовать его в Selenium для тестирования моих веб-интерфейсов. Сам Selenium хранит тестовые выражения в XML-структуре, и типизация Alt Windows, похоже, теряется. Кроме того, мой & # 160; возвращается как в XML.
Показать ещё 3 комментария
3

Попробуйте использовать десятичный объект &#160; вместо имени. Если это не сработает, вы можете просто использовать символ unicode для неразрывного пространства вместо объекта &nbsp;,

(Примечание. Я не пробовал это в XPather, но я попробовал его в Oxygen.)

1

Имейте в виду, что XML-процессор, совместимый со стандартами, заменит любые ссылки на сущности, отличные от XML, пять стандартных (&amp;, &gt;, &lt;, &apos;, &quot;) с соответствующим символом в целевой кодировке к времени выражения XPath. Учитывая это поведение, предложения PhiLho и jsulak - это путь, если вы хотите работать с инструментами XML. Когда вы вводите &#160; в выражении XPath, он должен быть преобразован в соответствующую последовательность байтов до применения выражения XPath.

  • 1
    Нет, если вы попробуете / используете XPath в XPather (GUI) или в JavaScript (без автоподстановки сущностей, поскольку мы не в XML). Хороший совет в других средах XML (XSTL?).
1

Я не могу получить соответствие с помощью Xpather, но следующее работало для меня с обычными XML и XSL файлами в Microsoft XML Notepad:

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

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

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

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

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

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

  • 0
    Вы можете отредактировать ваш пример кода, как это было сделано для примера в моем вопросе. Замените свою сущность nbsp на & amp; nbsp ;.
0

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

  • 0
    Я понимаю, что это должно сработать, но не совсем уверен, что я нахожу. В XPATH должен быть способ кодировать определенный способ, чтобы соответствовать тому, что я ищу.
  • 0
    Может быть, я должен смотреть на регулярное выражение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню