Pergunta

Eu tenho uma certa consulta XPATH que uso para obter a altura de um determinado elemento HTML que me retorna perfeitamente o valor desejado quando eu o executo no Chrome por meio do plugin XPath Helper.

//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height

No entanto, quando uso a mesma consulta por meio da palavra-chave Get Element Attribute no Robot Framework

Get Element Attribute//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height

...então recebi uma InvalidSelectorException sobre esse XPATH.

InvalidSelectorException: Message: u'invalid selector: Unable to locate an 
element with the xpath expression `//*/div[@class="BarChart"]/*[name()="svg"]/*
[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/`

Portanto, o Robot Framework ou Selenium removeu o sinal @ e tudo depois dele.Achei que era um problema de escape e adicionei e removi algumas barras antes de @height, mas sem sucesso.Também tentei encapsular o resultado desta consulta no comando string(), mas também não tive sucesso.

Alguém tem uma ideia para evitar que minha consulta XPATH seja quebrada?

Foi útil?

Solução

Parece que você não pode incluir o eixo de atributos no próprio XPath quando estiver usando o Robot.Você precisa recuperar o elemento por XPath e, em seguida, especificar o nome do atributo fora dele.Parece que a sintaxe é mais ou menos assim:

 Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])@height 

ou talvez (nunca usei Robot):

 Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])[1]@height 

Esta documentação diz

Atributo_locator consiste no localizador de elemento seguido por um sinal @ e um nome de atributo, por exemplo "element_id@class".

então acho que o que postei acima está no caminho certo.

Outras dicas

Você está correto em sua observação de que a palavra-chave parece remover tudo após o final @.Mais corretamente, ele usa o @ para separar o localizador do elemento do nome do atributo, e faz isso dividindo a string naquele final @ personagem.

Nenhuma quantidade de escape resolverá o problema, pois o código não está fazendo nenhuma análise neste momento.Este é o código exato (no momento em que este livro foi escrito...) que executa essa operação:

def _parse_attribute_locator(self, attribute_locator):
    parts = attribute_locator.rpartition('@')
    ...

A solução simples é eliminar a barra final, para que seu xpath fique assim:

//*/div[@class="BarChart"]/... and @class="bar bar1"]@height`
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top