J'essaie de tester une interface javascript compliquée avec Selenium (en utilisant l'interface Python et sur plusieurs navigateurs). J'ai un certain nombre de boutons du formulaire:
<div>My Button</div>
J'aimerais pouvoir rechercher des boutons en fonction de "Mon bouton" (ou des correspondances partielles non sensibles à la casse telles que "mon bouton" ou "bouton")
Je trouve cela incroyablement difficile, dans la mesure où j'ai l'impression de manquer quelque chose d'évident. La meilleure chose que j'ai jusqu'à présent est:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Ceci est cependant sensible à la casse. L'autre chose que j'ai essayée est de parcourir toutes les divs de la page et de vérifier la propriété element.text. Cependant, chaque fois que vous obtenez une situation du formulaire:
<div class="outer"><div class="inner">My Button</div></div>
div.outer a également "My Button" comme texte. Pour corriger cela, j'ai essayé de voir si div.outer est le parent de div.inner, mais je n'ai pas pu comprendre comment le faire (element.get_element_by_xpath ('..') renvoie le parent d'un élément, mais il tests différents de div.outer). De plus, parcourir tous les éléments de la page semble être très lent, du moins en utilisant le pilote Web Chrome.
Des idées?
Edit: Cette question est sortie un peu vague. A demandé (et répondu) une version plus spécifique ici: Comment obtenir le texte d'un élément dans Selenium WebDriver (via l'API Python) sans inclure le texte de l'élément enfant?
Réponses:
Essayez ce qui suit:
la source
find_element(s)_by_link_text
et desfind_element(s)_by_partial_link_text
méthodesvous pouvez essayer un xpath comme:
la source
.format
n'est pas reconnu dans mon éclipse. il donne et erreur. une idée, pourquoi?Vous pouvez également l'utiliser avec le modèle d'objet de page, par exemple:
Essayez ce code:
la source
// * recherchera n'importe quelle balise HTML. Où si du texte est commun pour Button et la balise div et si // * est des catégories, cela ne fonctionnera pas comme prévu. Si vous devez sélectionner un élément spécifique, vous pouvez l'obtenir en déclarant la balise HTML Element. Comme:
la source
Fait intéressant, pratiquement toutes les réponses tournent autour de la fonction de xpath
contains()
, négligeant le fait qu'il soit sensible à la casse - contrairement à la demande de OP.Si vous avez besoin d'une insensibilité à la casse, cela est réalisable dans xpath 1.0 (la version supportée par les navigateurs contemporains) , bien que ce ne soit pas joli - en utilisant la
translate()
fonction. Il substitue un caractère source à sa forme souhaitée, en utilisant une table de traduction.La construction d'un tableau de tous les caractères majuscules transformera efficacement le texte du nœud dans sa forme inférieure () - permettant une correspondance insensible à la casse (voici juste la prérogative) :
L'appel complet de python:
Naturellement, cette approche a ses inconvénients - comme indiqué, cela ne fonctionnera que pour le texte latin; si vous souhaitez couvrir les caractères unicode, vous devrez les ajouter à la table de traduction. Je l'ai fait dans l'exemple ci-dessus - le dernier caractère est le symbole cyrillique
"Й"
.Et si nous vivions dans un monde où les navigateurs prenaient en charge xpath 2.0 et versions ultérieures (not, mais ne se produiront pas de si tôt ☹️) , nous aurions pu utiliser les fonctions
lower-case()
(pour l'instant, pas totalement adaptées aux paramètres régionaux), etmatches
(pour les recherches d'expression régulière, avec cas -indicateur insensible ('i'
)).la source
Dans le code HTML que vous avez fourni:
Le texte
My Button
est leinnerHTML
et n'a aucun espace autour de lui afin que vous puissiez facilement l'utilisertext()
comme suit:Texte avec espaces de début / fin
Insérez le texte correspondant contenant des espaces blancs au début:
ou à la fin:
ou aux deux extrémités:
Dans ces cas, vous avez 2 options:
Vous pouvez utiliser une
contains()
fonction qui détermine si la première chaîne d'arguments contient la deuxième chaîne d'arguments et renvoie la valeur booléenne true ou false comme suit:Vous pouvez utiliser une
normalize-space()
fonction qui supprime les espaces blancs de début et de fin d'une chaîne, remplace les séquences de caractères d'espaces par un seul espace et renvoie la chaîne résultante comme suit:xpath pour le texte variable
Dans le cas où le texte est une variable que vous pouvez utiliser:
la source
la source
Problème similaire: Rechercher
<button>Advanced...</button>
Peut-être que cela vous donnera quelques idées (veuillez transférer le concept de Java vers Python):
la source
Utilisez driver.find_elements_by_xpath et correspondances à l' expression rationnelle fonction correspondant pour le cas de recherche insensible de l'élément par son texte.
la source
matches()
est une fonction xpath 2.0, et les navigateurs ne prennent malheureusement en charge que 1.0.Essaye ça. C'est très facile:
Cela a vraiment fonctionné pour moi dans le pilote Web sélénium.
la source