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