Je suis assez nouveau pour python Selenium et j'essaie de cliquer sur un bouton qui a la structure html suivante:
<div class="b_div">
<div class="button c_button s_button" onclick="submitForm('mTF')">
<input class="very_small" type="button"></input>
<div class="s_image"></div>
<span>
Search
</span>
</div>
<div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
<input class="v_small" type="button"></input>
<span>
Reset
</span>
</div>
</div>
J'aimerais pouvoir cliquer sur les boutons Search
et Reset
ci-dessus (de manière individuelle).
J'ai essayé plusieurs choses, par exemple:
driver.find_element_by_css_selector('.button .c_button .s_button').click()
ou,
driver.find_element_by_name('s_image').click()
ou,
driver.find_element_by_class_name('s_image').click()
mais il me semble que je finis toujours par NoSuchElementException
, par exemple:
Selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;
Je me demande si je peux utiliser d'une manière ou d'une autre les attributs onclick du code HTML pour faire cliquer Selenium?
Toutes les pensées qui pourraient me diriger dans la bonne direction seraient formidables. Merci.
Supprimer l'espace entre les classes dans le sélecteur css:
driver.find_element_by_css_selector('.button .c_button .s_button').click()
# ^ ^
=>
driver.find_element_by_css_selector('.button.c_button.s_button').click()
essaye ça:
télécharger firefox, ajouter le plugin "firebug" et "firepath"; Après les avoir installés, allez sur votre page Web, démarrez firebug et trouvez le xpath de l’élément, unique dans la page afin que vous ne puissiez faire aucune erreur.
browser.find_element_by_xpath ('il suffit de copier et coller le Xpath'). click ()
J'ai eu le même problème en utilisant Phantomjs comme navigateur, j'ai donc résolu de la manière suivante:
driver.find_element_by_css_selector('div.button.c_button.s_button').click()
J'ai essentiellement ajouté le nom de la balise DIV dans la citation.
Le processus de débogage suivant m'a aidé à résoudre un problème similaire.
with open("output_init.txt", "w") as text_file:
text_file.write(driver.page_source.encode('ascii','ignore'))
xpath1 = "the xpath of the link you want to click on"
destination_page_link = driver.find_element_by_xpath(xpath1)
destination_page_link.click()
with open("output_dest.txt", "w") as text_file:
text_file.write(driver.page_source.encode('ascii','ignore'))
Vous devriez alors avoir deux fichiers texte avec la page initiale sur laquelle vous étiez ('output_init.txt') et la page à laquelle vous avez été redirigé après avoir cliqué sur le bouton ('output_dest.txt'). Si elles sont identiques, alors, votre code ne fonctionne pas. Si ce n'est pas le cas, votre code a fonctionné, mais vous avez un autre problème. Le problème pour moi semblait être que le javascript nécessaire pour transformer le contenu afin de produire mon hook n'était pas encore exécuté.
Vos options comme je le vois:
xpath2 = "votre xpath sur lequel vous allez cliquer"
WebDriverWait (pilote, délai d'attente = 5) .until (lambda x: x.find_element_by_xpath (xpath2))
L’approche xpath n’est pas nécessairement meilleure, je la préfère, vous pouvez également utiliser votre approche de sélecteur.