Estou tentando testar uma interface javascript complicada com o Selenium (usando a interface Python e em vários navegadores). Eu tenho vários botões do formulário:
<div>My Button</div>
Gostaria de poder procurar botões com base em "Meu botão" (ou correspondências parciais que não diferenciam maiúsculas de minúsculas, como "meu botão" ou "botão")
Estou achando isso incrivelmente difícil, na medida em que sinto que estou perdendo algo óbvio. A melhor coisa que tenho até agora é:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Isso faz distinção entre maiúsculas e minúsculas, no entanto. A outra coisa que tentei é percorrer todas as divs da página e verificar a propriedade element.text. No entanto, toda vez que você obtém uma situação do formulário:
<div class="outer"><div class="inner">My Button</div></div>
div.outer também tem "Meu botão" como o texto. Para corrigir isso, tentei verificar se div.outer é o pai do div.inner, mas não consegui descobrir como fazer isso (element.get_element_by_xpath ('..') retorna o pai de um elemento, mas ele testes diferentes de div.outer). Além disso, a iteração de todos os elementos da página parece muito lenta, pelo menos usando o driver da web do Chrome.
Ideias?
Edit: Esta questão saiu um pouco vaga. Pediu (e respondeu) uma versão mais específica aqui: Como obter o texto de um elemento no Selenium WebDriver (via API do Python) sem incluir o texto do elemento filho?
Respostas:
Tente o seguinte:
fonte
find_element(s)_by_link_text
efind_element(s)_by_partial_link_text
métodos #você pode tentar um xpath como:
fonte
.format
não é reconhecido no meu eclipse. dá e erro. alguma ideia por que?Você também pode usá-lo com o Padrão de objeto de página, por exemplo:
Tente este código:
fonte
// * procurará por qualquer tag HTML. Onde, se algum texto for comum para as tags Button e div, e se // * for categorias, não funcionará conforme o esperado. Se você precisar selecionar algum específico, poderá obtê-lo declarando a tag Elemento HTML. Gostar:
fonte
Curiosamente, virtualmente todas as respostas giram em torno da função do xpath
contains()
, negligenciando o fato de ser sensível a maiúsculas e minúsculas - ao contrário da pergunta do OP.Se você precisar de distinção entre maiúsculas e minúsculas, isso é possível no xpath 1.0 (a versão que os navegadores contemporâneos suportam) , embora não seja bonito - usando a
translate()
função Ele substitui um caractere de origem para a forma desejada, usando uma tabela de conversão.A construção de uma tabela com todos os caracteres maiúsculos transformará efetivamente o texto do nó em sua forma lower () - permitindo a correspondência sem distinção entre maiúsculas e minúsculas (eis apenas a prerrogativa) :
A chamada completa do python:
Naturalmente, essa abordagem tem suas desvantagens - como dado, funcionará apenas para texto em latim; se você quiser cobrir caracteres unicode - precisará adicioná-los à tabela de tradução. Eu fiz isso na amostra acima - o último caractere é o símbolo cirílico
"Й"
.E se vivêssemos em um mundo em que os navegadores suportassem o xpath 2.0 e posterior (🤞, mas não acontecerá tão cedo ☹️) , poderíamos ter usado as funções
lower-case()
(ainda que não totalmente cientes do código de idioma) ematches
(para pesquisas de expressões regulares, com maiúsculas e minúsculas) -insensitive ('i'
) flag).fonte
No HTML que você forneceu:
O texto
My Button
éinnerHTML
e não possui espaços em branco, portanto você pode usar facilmente datext()
seguinte maneira:Texto com espaços iniciais / finais
Encaixe o texto relevante que contém espaços em branco no início:
ou no final:
ou nas duas extremidades:
Nestes casos, você tem 2 opções:
Você pode usar a
contains()
função que determina se a primeira cadeia de argumentos contém a segunda cadeia de argumentos e retorna booleano true ou false da seguinte maneira:Você pode usar a
normalize-space()
função que retira o espaço em branco inicial e final de uma sequência, substitui sequências de caracteres de espaço em branco por um único espaço e retorna a sequência resultante da seguinte maneira:xpath para a variável Text
Caso o texto seja uma variável, você pode usar:
fonte
fonte
Problema semelhante: Localizar
<button>Advanced...</button>
Talvez isso lhe dê algumas idéias (transfira o conceito de Java para Python):
fonte
Use driver.find_elements_by_xpath e partidas REGEX função de correspondência para o caso de busca insensível do elemento pelo seu texto.
fonte
matches()
é uma função xpath 2.0, e os navegadores infelizmente têm suporte apenas para 1.0.Tente isso. É muito fácil:
Isso realmente funcionou para mim no driver da web selênio.
fonte