Использование XPATH для поиска текста, содержащего
Я использую XPather Browser, чтобы проверить мои выражения XPATH на странице HTML.
Моя конечная цель - использовать эти выражения в Selenium для тестирования моих пользовательских интерфейсов.
У меня есть HTML файл с контентом, подобным этому:
<tr>
<td>abc</td>
<td> </td>
</tr>
Я хочу выбрать node с текстом, содержащим строку "
".
При нормальной строке, такой как "abc", проблем нет. Я использую XPATH, подобный //td[text()="abc"]
.
Когда я пытаюсь использовать XPATH, например //td[text()=" "]
, он ничего не возвращает. Существует ли специальное правило, касающееся текстов с "&
"?
Ответы
Ответ 1
Кажется, что 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"]
.
Ответ 2
Я нашел, что могу выполнить совпадение, когда я вводил жестко закодированное неразрывное пространство (U + 00A0), набрав Alt + 0160 на Windows между двумя кавычками...
//table[@id='TableID']//td[text()=' ']
работал со мной со специальным char.
Из того, что я понял, стандарт XPath 1.0 не справляется с экранированием символов Unicode. Кажется, в XPath 2.0 есть функции для этого, но похоже, что Firefox не поддерживает его (или я что-то не понял). Таким образом, вам нужно сделать локальную кодовую страницу. Ужасно, я знаю.
На самом деле, похоже, что стандарт опирается на язык программирования с использованием XPath для обеспечения правильной последовательности Unicode-escape-последовательности... Итак, как-то я сделал правильные вещи.
Ответ 3
Попробуйте использовать десятичный объект  
вместо имени. Если это не сработает, вы можете просто использовать символ unicode для неразрывного пространства вместо объекта
,
(Примечание. Я не пробовал это в XPather, но я попробовал его в Oxygen.)
Ответ 4
Имейте в виду, что XML-процессор, совместимый со стандартами, заменит любые ссылки на сущности, отличные от XML, пять стандартных (&
, >
, <
, '
, "
) с соответствующим символом в целевой кодировке к времени выражения XPath. Учитывая это поведение, предложения PhiLho и jsulak - это путь, если вы хотите работать с инструментами XML. Когда вы вводите  
в выражении XPath, он должен быть преобразован в соответствующую последовательность байтов до применения выражения XPath.
Ответ 5
Искать
или только nbsp
- вы попробовали это?
Ответ 6
Я не могу получить соответствие с помощью 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 преобразует его в символ пробела. Не вводите в заблуждение!
Ответ 7
Вы можете использовать функции XPath Contains, Sibling, Ancestor в Selenium WebDriver, чтобы находить элементы, не имеющие уникальных свойств для идентификации.
для получения более подробной информации, прочитайте эту страницу: https://www.guru99.com/using-contains-sbiling-ancestor-to-find-element-in-selenium.html