web-dev-qa-db-fra.com

python Selenium cliquez sur le bouton

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.

62
AJW

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()
80
falsetru

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.

Voir l'image: instruction

browser.find_element_by_xpath ('il suffit de copier et coller le Xpath'). click ()

22
Carlo 1585

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.

2
CosimoCD

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:

  1. Demandez au pilote d’exécuter le javascript, puis appelez le code de votre élément de recherche. Cherchez des réponses plus détaillées à ce sujet sur stackoverflow, car je n'ai pas suivi cette approche.
  2. Il suffit de trouver un point d'ancrage comparable sur le fichier 'output_dest.txt' qui produira le même résultat, et c'est ce que j'ai fait.
  3. Attendez un peu avant de cliquer sur quoi que ce soit:

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.

2
Tanel