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