Usando XPATH para pesquisar texto contendo
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> </td> </tr>
Quero selecionar um nó com um texto contendo a string "
".
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()=" "]
não retorna nada.Existe uma regra especial relativa a textos com "&
" ?
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 "
") 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;"
"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 "
"Marcadores no seu caso de teste para reivindicar otext em um campo que contém"
".) 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 world
", você precisará inserir um verdadeiro"
"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  
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
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 (&
, >
, <
, '
, "
) 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  
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()=' '])" />
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 " "> ]>
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
ou apenas nbsp
- Você tentou isso?