Pergunta

eu uso Navegador XPather para verificar minhas expressões XPATH em uma página HTML.

Meu objetivo final é usar essas expressões no Selenium para testar minhas interfaces de usuário.

Recebi um arquivo HTML com conteúdo semelhante a este:

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

Quero selecionar um nó com um texto contendo a string "&nbsp;".

Com uma string normal como "abc" não há problema.Eu uso um XPATH semelhante ao //td[text()="abc"].

Quando tento com um XPATH como //td[text()="&nbsp;"] não retorna nada.Existe uma regra especial relativa a textos com "&" ?

Foi útil?

Solução

Parece que OpenQA, caras por trás do Selenium, já resolveram esse problema.Eles definiram algumas variáveis ​​para corresponder explicitamente aos espaços em branco.No meu caso, preciso usar um XPATH semelhante ao //td[text()="${nbsp}"].

Reproduzi aqui o texto do OpenQA sobre esse assunto (encontrado aqui):

O HTML normaliza automaticamente o espaço em branco dentro dos elementos, ignorando os espaços de liderança/à direita e convertendo espaços, guias e novas linhas em um único espaço.Quando o Selenium lê o texto fora da página, ele tenta duplicar esse comportamento, para que você possa ignorar todas as guias e novas linhas do seu HTML e fazer afirmações com base na aparência do texto no navegador quando renderizado.Fazemos isso substituindo todo o espaço em branco não visível (incluindo o espaço sem quebra "&nbsp;") Com um único espaço.Todas as novas linhas visíveis (<br>, <p>, e <pre> novas linhas formatadas) devem ser preservadas.

Utilizamos a mesma lógica de normalização no texto das tabelas de casos de teste HTML Selenese.Isso tem várias vantagens.Primeiro, você não precisa olhar para a fonte HTML da página para descobrir quais devem ser suas afirmações;"&nbsp;"Os símbolos são invisíveis para o usuário final e, portanto, você não deve se preocupar com eles ao escrever testes de selenese.(Você não precisa colocar "&nbsp;"Marcadores no seu caso de teste para reivindicar otext em um campo que contém"&nbsp;".) Você também pode colocar novas linhas e espaços extras em seu selenese <td> Tag;Como usamos a mesma lógica de normalização no caso de teste que no texto, podemos garantir que as afirmações e o texto extraído correspondam exatamente.

Isso cria um pouco de problema nas raras ocasiões em que você realmente deseja/precisa inserir espaço em branco extra no seu caso de teste.Por exemplo, pode ser necessário digitar texto em um campo como este:"foo ".Mas se você simplesmente escrever <td>foo </td> No seu caso de teste selenese, substituiremos seus espaços extras por apenas um espaço.

Este problema tem uma solução simples.Definimos uma variável em Selenese, ${space}, cujo valor é um único espaço.Você pode usar ${space} Para inserir um espaço que não será automaticamente aparado, assim: <td>foo${space}${space}${space}</td>.Também incluímos uma variável ${nbsp}, que você pode usar para inserir um espaço sem quebra.

Observe que XPaths fazem não Normalize o espaço em branco da maneira que fazemos.Se você precisar escrever um xpath como //div[text()="hello world"] Mas o html do link é realmente "hello&nbsp;world", você precisará inserir um verdadeiro"&nbsp;"No seu caso de teste selenese para combinar, assim: //div[text()="hello${nbsp}world"].

Outras dicas

Descobri que posso fazer a partida quando insiro um espaço sem quebra com código duro (U+00A0) digitando alt+0160 nas janelas entre as duas citações ...

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

trabalhou para mim com o char especial.

Pelo que entendi, o padrão XPath 1.0 não lida com os caracteres Unicode. Parece haver funções para isso no XPath 2.0, mas parece que o Firefox não o apóia (ou eu entendi mal algo). Então você tem a ver com o CodePage local. Feio, eu sei.

Na verdade, parece que o padrão está dependendo da linguagem de programação usando o XPath para fornecer a sequência de escape unicode correta ... Então, de alguma forma, eu fiz a coisa certa.

Tente usar a entidade decimal &#160; em vez da entidade nomeada. Se isso não funcionar, você deve simplesmente usar o caráter unicode para um espaço sem quebra ao invés de &nbsp; entidade.

(Nota: eu não tentei isso no Xpather, mas tentei em oxigênio.)

Lembre-se de que um processador XML compatível com padrões substituiu quaisquer referências de entidade que não sejam as cinco padrão do XML (&amp;, &gt;, &lt;, &apos;, &quot;) com o caractere correspondente na codificação de alvo quando as expressões XPath são avaliadas. Dado esse comportamento, as sugestões de Philho e JSulak são o caminho a percorrer, se você quiser trabalhar com ferramentas XML. Quando você entra &#160; Na expressão XPath, ela deve ser convertida na sequência de bytes correspondente antes que a expressão XPath seja aplicada.

Não consigo obter uma correspondência usando o XPather, mas o seguinte funcionou para mim com os arquivos XML e XSL simples no XML Bloco de notas da Microsoft:

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

O valor retornado é 1, que é o valor correto no meu caso de teste.

No entanto, eu tive que declarar nbsp Como uma entidade dentro do meu XML e XSL usando o seguinte:

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

Não tenho certeza se isso o ajuda, mas fui capaz de na realidade achar nbsp usando uma expressão XPath.

Editar: meu amostra de código realmente contém os caracteres '' ' Mas a sintaxe do JavaScript Highlight o converte no caractere espacial. Não seja enganado!

Procurar por &nbsp; ou apenas nbsp - Você tentou isso?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top