Используя XPath к искомому тексту, содержащему  

114
задан mlissner 22 June 2017 в 23:55
поделиться

6 ответов

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

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

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

Мы используем ту же логику нормализации на тексте HTML таблицы тестового сценария Selenese. Это имеет много преимуществ. Во-первых, Вы не должны смотреть на источник HTML страницы для выяснения, каковы утверждения должны быть; "&nbsp;" символы невидимы конечному пользователю, и таким образом, Вам не придется волноваться о них при записи тестов Selenese. (Вы не должны помещать" &nbsp;" маркеры в свой тестовый сценарий к assertText на поле, которое содержит" &nbsp;".) Можно также поместить дополнительные новые строки и пробелы в тегах Selenese <td>; так как мы используем ту же логику нормализации на тестовом сценарии, как мы делаем на тексте, мы можем удостовериться, что утверждения и извлеченный текст будут соответствовать точно.

Это создает определенную проблему в тех редких случаях, когда Вы действительно хотите/нуждаетесь вставить дополнительный пробел в свой тестовый сценарий. Например, Вы, возможно, должны ввести текст в поле как это: "foo ". Но если Вы просто запишете <td>foo </td> в Вашем тестовом сценарии Selenese, мы заменим Ваши дополнительные пространства всего одним пространством.

Эта проблема имеет простое обходное решение. Мы определили переменную в Selenese, ${space}, чье значение является одиночным пробелом. Можно использовать ${space} для вставки пространства, которое не будет автоматически обрезано, как это: <td>foo${space}${space}${space}</td>. Мы также включали переменную ${nbsp}, который можно использовать для вставки неразрывного пространства.

Примечание, которое XPaths делают не , нормализует пробел путем, мы делаем. Если необходимо записать XPath как [1 115], но HTML ссылки действительно" hello&nbsp;world", необходимо будет вставить реальное" &nbsp;" в тестовый сценарий Selenese, чтобы заставить его соответствовать, как это: //div[text()="hello${nbsp}world"].

88
ответ дан PhiLho 24 November 2019 в 02:36
поделиться

Я нашел, что могу сделать соответствие, когда я ввел трудно кодированное неразрывное пространство (U+00A0) путем ввода Alt+0160 в Windows между двумя кавычками...

//table[@id='TableID']//td[text()=' ']

работал на меня со специальным символом.

Из того, что я понял, стандарт XPath 1.0 не обрабатывает символы Unicode выхода. Кажется, существуют функции для этого в XPath 2.0, но похоже, что Firefox не поддерживает его (или я неправильно понял что-то). Таким образом, Вы имеете отношение к локальной кодовой странице. Ужасный, я знаю.

На самом деле, похоже, что стандарт полагается на язык программирования с помощью XPath для обеспечения корректной Управляющей последовательность Unicode... Так, так или иначе я сделал правильную вещь.

24
ответ дан PhiLho 24 November 2019 в 02:36
поделиться

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

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

4
ответ дан Jeff Puckett 24 November 2019 в 02:36
поделиться

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

2
ответ дан ChuckB 24 November 2019 в 02:36
поделиться

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

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

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

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

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

я не уверен, помогает ли это Вам, но я смог к на самом деле , находят nbsp с помощью выражения XPath.

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

1
ответ дан Zack The Human 24 November 2019 в 02:36
поделиться

Поиск &nbsp; или [только 111] - Вы пробовали это?

1
ответ дан Nakilon 24 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: