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