Marionnettiste: Cliquez sur l'élément avec le texte
Est il une méthode(ne trouverez pas dans l'API) ou de la solution, cliquez sur l'élément avec le texte?
Pour exemple, j'ai l'html:
<div class="elements">
<button>Button text</button>
<a href=#>Href text</a>
<div>Div text</div>
</div>
Et je veux cliquez sur l'élément dans lequel le texte est justifié(Cliquez sur le bouton à l'intérieur .les éléments), comme:
Page.click('Button text', '.elements')
Toute solution?
- Partagé la réponse ici: stackoverflow.com/a/47829000/6161265
- Avez-vous trouvé la Réponse?
- Si ça aide, la page que je voulais effectuer un clic sur a jQuery chargé de sorte que j'ai pu & utilisé la méthode evaluate pour exécuter le code jQuery.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une expression XPath sélecteur page.$x(expression):
Découvrez
clickByText
dans ce gist pour un exemple complet. Il prend soin de s'échapper les guillemets, ce qui est un peu délicat, avec des expressions XPath.La actuellement en haut de réponse par tokland ne fonctionne que sur les nœuds de texte et pas sur les nœuds avec d'autres éléments à l'intérieur.
Réponse courte
Cette expression XPath va interroger un bouton qui contient le texte "texte du Bouton":
Aussi respecter la
<div class="elements">
entourant les boutons, utilisez le code suivant:Explication
Pour expliquer pourquoi l'utilisation du nœud de texte (
text()
) est faux dans certains cas, regardons un exemple:D'abord, nous allons vérifier les résultats lors de l'utilisation de
contains(text(), 'Text')
://button[contains(text(), 'Start')]
sera de retour à la fois deux nœuds (comme prévu)//button[contains(text(), 'End')]
ne retour un nœuds (le premier) commetext()
renvoie une liste de deux textes (Start
etEnd
), maiscontains
seulement le premier//button[contains(text(), 'Middle')]
sera de retour pas résultatstext()
ne comprend pas le texte de nœuds enfantsVoici les expressions XPath pour
contains(., 'Text')
, qui travaille sur l'élément lui-même, y compris ses nœuds enfants://button[contains(., 'Start')]
sera de retour à la fois deux boutons//button[contains(., 'End')]
sera de nouveau de retour à la fois deux boutons//button[contains(., 'Middle')]
sera de retour un (le dernier bouton)Donc, dans la plupart des cas, il est plus logique d'utiliser le
.
au lieu detext()
dans une expression XPath.Vous pouvez également utiliser
de la page.evaluate()
pour cliquer sur les éléments obtenus à partir dedocument.querySelectorAll()
qui ont été filtrés par le contenu du texte:Alternativement, vous pouvez utiliser
de la page.evaluate()
de cliquer sur un élément basé sur le texte contenu à l'aide dedocument.evaluate()
et un correspondant de l'expression XPath:fait solution rapide pour être en mesure d'utiliser les sélecteurs css avancés comme ":contient du(de texte)"
donc, en utilisant cette bibliothèque vous pouvez simplement
Voici ma solution:
La solution est