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


я использую Браузер XPather чтобы проверить мои выражения XPATH на HTML-странице.

моя конечная цель-использовать эти выражения в Selenium для тестирования моих пользовательских интерфейсов.

я получил HTML-файл с содержанием, похожим на это:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

Я хочу выбрать узел с текстом, содержащим строку"&nbsp;".

С обычной строкой, как " abc " нет никаких проблем. Я использую XPATH, подобный //td[text()="abc"].

когда Я пытаюсь с XPATH, как //td[text()="&nbsp;"] он ничего не возвращает. Существует ли специальное правило, касающееся текстов с "&"?

6 106

6 ответов:

кажется,OpenQA, ребята за селеном, уже решили эту проблему. Они определили некоторые переменные, чтобы точно соответствовать пробелы. В моем случае мне нужно использовать XPATH, подобный //td[text()="${nbsp}"].

я воспроизвел здесь текст из OpenQA по этому вопросу (найдено здесь):

HTML автоматически нормализует пробелы внутри элементов, игнорирование начальные / конечные пробелы и преобразование дополнительное пространство, вкладок и строки в единое пространство. Когда селен читает текст из страницы, он пытается дублируйте это поведение, чтобы вы могли игнорировать все вкладки и новые строки в ваш HTML и делать утверждения на основе как выглядит текст в браузере, когда оказанный. Мы делаем это, заменяя все невидимые пробелы (в том числе неразрывное пространство"&nbsp;") С a единое пространство. Все видимые строки (<br>,<p> и <pre> отформатирован новые строки) должны быть консервированный.

мы используем ту же логику нормализацию текст теста в формате HTML Selenese таблицы. Это имеет ряд преимущества. Во-первых, вам не нужно посмотрите на исходный HTML-код страницы выясните, что ваши утверждения должны быть; "&nbsp;" символы невидимы для конечного пользователя, и поэтому вы не должны придется беспокоиться о них при написании Селенские тесты. (Вам не нужно ставить "&nbsp;" метки в тесте чтобы assertText на поле, которое содержит "&nbsp;".) Вы также можете поставить дополнительные новые строки и пробелы в вашем 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&nbsp;world", вам потребуется вставить настоящий"&nbsp;" в 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... Так что, так или иначе, я поступил правильно.

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

(примечание: Я не пробовал это в XPather, но я попробовал его в кислород.)

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

Я не могу получить совпадение с помощью Xpather, но следующее работало для меня с обычными файлами XML и XSL в XML-блокноте Microsoft:

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

возвращаемое значение равно 1, что является правильным значением в моем тестовом случае.

однако, я должен был объявить nbsp как сущность в моем XML и XSL, используя следующее:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

Я не уверен, что это поможет вам, но я смог на самом деле найти nbsp С помощью выражение XPath.

редактировать: мой пример кода на самом деле содержит символы ' ' но подсветка синтаксиса JavaScript преобразует его в символ пробела. Не заблуждайтесь!

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