Python Selen Klicken Sie auf die Schaltfläche

84

Ich bin ziemlich neu in Python Selen und ich versuche, auf eine Schaltfläche zu klicken, die die folgende HTML-Struktur hat:

<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 , sowohl die klicken Searchund ResetTasten oben (natürlich einzeln).

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 am Ende zu sein NoSuchElementException, 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 Selen zum Klicken zu bringen.

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

AJW
quelle

Antworten:

15

Verwenden Sie für Python die

from selenium.webdriver import ActionChains

und

ActionChains(browser).click(element).perform()
AshishGalagali
quelle
102

Entfernen Sie Leerzeichen zwischen Klassen in der CSS-Auswahl:

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

=>

driver.find_element_by_css_selector('.button.c_button.s_button').click()
falsetru
quelle
1
Ich habe versucht, was Sie vorgeschlagen haben. Ich bekomme den gleichen NoSuchElementExceptionFehler!
AJW
2
@AJW, Versuchen Sie print(driver.page_source)und überprüfen Sie , ob der HTML- Code tatsächlich das Element enthält.
Falsetru
Vielen Dank. Ich habe es getan print(driver.page_source)und festgestellt, dass es anders benannt wurde. Seltsam. Es klickt jetzt, als ich die Leerzeichen weggenommen und umbenannt habe. Bei einem Follow-up tho: Wie Sie sehen können, haben sogar die Reset-Schaltfläche und die Such-Schaltfläche dasselbe class: Wie unterscheidet man in diesem Fall zwischen den Such- und Reset-Schaltflächen, während Sie klicken?
AJW
1
@ Ajw, wie aobut mit xpath:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru
1
@MortezaLSC, Wenn Sie meinen, dass es in einem System möglich ist, in dem es keine grafische Benutzeroberfläche gibt, ist dies möglich. Verwenden Sie kopflose Browser. Zum Beispiel PhantomJS.
Falsetru
30

Versuche dies:

Laden Sie Firefox herunter, fügen Sie das Plugin "firebug" und "firepath" hinzu. Nach der Installation gehen Sie zu Ihrer 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: Anweisung

browser.find_element_by_xpath('just copy and paste the Xpath').click()

Carlo 1585
quelle
5
Vielen Dank für diesen großartigen Lifehack. Es hat viele Stunden gespart
Hero Guy
Funktioniert dies nicht auf einem Mac? Sowohl Firebug als auch Fire Path werden nicht als Add-Ons angezeigt
Bob
Manchmal ist es kein Problem des Betriebssystems, sondern der Firefox-Version. Die letzte Firefox-Version hat ein Problem mit FirePath. Ich verwende Firefox 55.0.3
Carlo 1585,
1
Sie finden das Element in Firefox unter: Tools-> Web Developer-> Inspector; Klicken Sie auf die Schaltfläche in der GUI, im Inspektorteil, klicken Sie mit der rechten Maustaste auf den entsprechenden Code-> Kopieren und wählen Sie: CSS-Auswahl / CSS-Pfad / X-Pfad ...
Nir
4

Ich hatte das gleiche Problem mit Phantomjs als Browser und habe 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.

CosimoCD
quelle
2

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 ersten Seite ('output_init.txt') und der Seite haben, auf die Sie nach dem Klicken auf die Schaltfläche ('output_dest.txt') weitergeleitet wurden. 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 zur Erstellung meines Hooks transformierte, 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 Find-Element-Code auf. Suchen Sie im Stackoverflow nach detaillierteren Antworten, da ich diesen Ansatz nicht verfolgt habe.
  2. Finden Sie einfach einen vergleichbaren Hook in der '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 nur. Sie können auch Ihren Selektor-Ansatz verwenden.

Tanel
quelle
1

Öffnen Sie eine Website https://adviserinfo.sec.gov/compilation und klicken Sie auf die Schaltfläche, um die Datei herunterzuladen. Selbst ich möchte das Popup schließen, wenn Python Selen verwendet wird

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options 

#For Mac - If you use windows change the chromedriver location
chrome_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_path)

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-popup-blocking")

driver.maximize_window()
driver.get("https://adviserinfo.sec.gov/compilation")

# driver.get("https://adviserinfo.sec.gov/")
# tabName = driver.find_element_by_link_text("Investment Adviser Data")
# tabName.click()

time.sleep(3)

# report1 = driver.find_element_by_xpath("//div[@class='compilation-container ng-scope layout-column flex']//div[1]//div[1]//div[1]//div[2]//button[1]")

report1 = driver.find_element_by_xpath("//button[@analytics-label='IAPD - SEC Investment Adviser Report (GZIP)']")

# print(report1)
report1.click()

time.sleep(5)

driver.close()
Rajiv Singh
quelle