obtendo atributo via consulta xpath com sucesso no navegador, mas não no Robot Framework
-
21-12-2019 - |
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?
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
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`