webentwicklung-frage-antwort-db.com.de

python Selen Klicken Sie auf die Schaltfläche

Ich bin ganz neu in python Selenium und ich versuche, auf eine Schaltfläche mit der folgenden HTML-Struktur zu klicken:

<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>

Ich möchte in der Lage sein, oben auf die Schaltflächen Search und Reset zu klicken (offensichtlich individuell).

Ich habe ein paar Dinge ausprobiert, zum Beispiel:

driver.find_element_by_css_selector('.button .c_button .s_button').click()

oder,

driver.find_element_by_name('s_image').click()

oder,

driver.find_element_by_class_name('s_image').click()

aber ich scheine immer mit NoSuchElementException zu enden, zum Beispiel:

Selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;

Ich frage mich, ob ich die onclick-Attribute des HTML-Codes irgendwie verwenden kann, um Selenium zum Klicken zu bringen.

Alle Gedanken, die mich in die richtige Richtung weisen können, wären großartig. Vielen Dank.

62
AJW

Leerzeichen zwischen Klassen in der CSS-Auswahl entfernen:

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

versuche dies:

lade firefox herunter, füge das Plugin "firebug" und "firepath" hinzu; Nach der Installation gehen Sie auf Ihre Webseite, starten Sie firebug und suchen Sie den xpath des Elements, der auf der Seite eindeutig ist, damit Sie keinen Fehler machen können.

Siehe Bild: instruction

browser.find_element_by_xpath ('einfach den Xpath kopieren und einfügen'). click ()

22
Carlo 1585

Ich hatte das gleiche Problem mit Phantomjs als Browser, also habe ich es folgendermaßen gelöst:

driver.find_element_by_css_selector('div.button.c_button.s_button').click()

Im Wesentlichen habe ich den Namen des DIV-Tags in das Zitat eingefügt.

2
CosimoCD

Der folgende Debugging-Prozess hat mir geholfen, ein ähnliches Problem zu lösen.

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'))

Sie sollten dann zwei Textdateien mit der Anfangsseite, auf der Sie sich befanden ('output_init.txt'), und der Seite haben, zu der Sie weitergeleitet wurden, nachdem Sie auf die Schaltfläche ('output_dest.txt') geklickt haben. Wenn sie gleich sind, hat Ihr Code nicht funktioniert. Wenn dies nicht der Fall ist, hat Ihr Code funktioniert, aber Sie haben ein anderes Problem. Das Problem für mich schien zu sein, dass das notwendige Javascript, das den Inhalt umwandelte, um meinen Haken zu produzieren, noch nicht ausgeführt wurde.

Ihre Optionen, wie ich es sehe:

  1. Lassen Sie den Treiber das Javascript ausführen und rufen Sie dann Ihren Elementcode find auf. Suchen Sie nach detaillierteren Antworten zu diesem Thema auf stackoverflow, da ich diesem Ansatz nicht gefolgt bin.
  2. Finden Sie einfach einen vergleichbaren Hook in der Datei 'output_dest.txt', der das gleiche Ergebnis liefert, wie ich es getan habe.
  3. Warten Sie etwas, bevor Sie auf etwas klicken:

xpath2 = "Ihr xpath, auf den Sie klicken werden"

WebDriverWait (Treiber, Timeout = 5) .bis (Lambda x: x.find_element_by_xpath (xpath2))

Der xpath-Ansatz ist nicht unbedingt besser, ich bevorzuge ihn einfach. Sie können auch Ihren Selector-Ansatz verwenden.

2
Tanel