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

Я использую 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;"], он ничего не возвращает. Существует ли специальное правило, касающееся текстов с "&"?

Ответ 1

Кажется, что 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"].

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Я не могу получить соответствие с помощью 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 преобразует его в символ пробела. Не вводите в заблуждение!

Ответ 7

Вы можете использовать функции XPath Contains, Sibling, Ancestor в Selenium WebDriver, чтобы находить элементы, не имеющие уникальных свойств для идентификации.

для получения более подробной информации, прочитайте эту страницу: https://www.guru99.com/using-contains-sbiling-ancestor-to-find-element-in-selenium.html