Sélénium - XPATH - la Recherche de l'élément par innerHTML
Je suis en train d'apprendre le Sélénium et en avoir une bonne compréhension de XPATH.
Une question, je suis en cours d'exécution, c'est que sur une page web, il y a un élément que je veux choisir qui a généré dynamiquement, un id
et class
. J'avais essayé le suivant:
code = driver.find_element_by_xpath("//*[contains(@text='someUniqueString')]")
cependant, l'élément n'est pas n'importe quel texte. C'est plutôt un <code>
élément avec JSON.
<codestyle="display: none" id="something-crazy-dynamic">
{"dataIWantToGrab":{"someUniqueString":...}}
</code>
Ce que je cherche à faire est de rechercher le innerHTML
pour trouver une chaîne unique à l'aide de XPATH, mais je ne trouve pas de bonnes ressources.
J'ai essayé
driver.find_element_by_xpath("//*[contains(@innerHTML='someUniqueString')]")
mais je reçois l'erreur
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //*[contains(@innerHTML='someUniqueString')]
EDIT: ci-Dessous un lien pour le frère de texte, je travaille avec
https://gist.github.com/anonymous/b227e59c942e7ec9f5a851a3b7ecdfc6
EDIT 2: j'ai été en mesure de contourner cela, non pas en utilisant le Sélénium, mais avec BeautifulSoup. Pas l'idéal, mais encore une solution.
soup = BeautifulSoup(driver.page_source)
codes = soup.find_all("code")
found_json = [i for i in codes if i.text.find("someUniqueString") > 0]
id
est constante ou est-il dynamique?il y a une partie qui est constante, mais 15 autres éléments ont les mêmes conventions de nommage
vous pouvez compter sur les parents, les enfants, les frères et sœurs. merci de partager les code HTML (5 éléments ci-dessus et au-dessous de l'élément donné)
J'ai inclus plus de html ici - gist.github.com/anonymous/b227e59c942e7ec9f5a851a3b7ecdfc6
OriginalL'auteur shartshooter | 2017-03-14
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser XPath pour correspondre intérieure HTML, mais vous pouvez l'utiliser pour correspondre par "texte interne' :
la démo
Ci-dessus XPath doit retourner le
code
élément car il est parent de l'élément du texte cible 'someUniqueString'.innerTEXT
est de retour null, maisinnerHTML
n'est pasIl n'est pas littéralement
innerTEXT
que je voulais dire, voir l'extrait de code ci-dessus. RessembleinnerHTML
est Sélénium chose, de sorte que vous pourriez être en mesure de l'utiliser. Seulement l'expression XPath est un peu hors,=
doit être remplacé par,
:contains(@innerHTML,'someUniqueString')
ce n'est pas de travailler
driver.find_element_by_xpath("//*[contains(@innerHTML,'someUniqueString')]")
est de retourMessage: Unable to locate element: //*[contains(@innerHTML,'someUniqueString')]
avez-vous essayé le XPath dans cette réponse?
//*[text()[contains(., 'someUniqueString')]]
Cela fait un travail! Merci beaucoup
OriginalL'auteur har07
Essayer le XPath suivante:
Remarque: Comme les
code
élément de jeu avecdisplay: none
, l'élément n'est PAS visible, bien que vous pouvez trouver l'élément. Si vous essayez d'interagir avec l'élément à l'aide declick
ou d'autres API, vous pouvez obtenirElementNotVisisbleException
. Pour le dire simplement, Vous ne pouvez pas interagir avec les éléments qui ne sont PAS affichés sur l'interface graphique (navigateur).Si vous n'êtes PAS en mesure de trouver l'élément, alors il ya de bonnes chances que votre élément est à l'intérieur d'un
iframe
. Dans de tels cas, vous devez passer à la première image, puis utilisez le XPath pour trouver l'élément.Plus de détails sur la commutation entre les images ici.
OriginalL'auteur Naveen Kumar R B