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 Search
und Reset
Tasten 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.
NoSuchElementException
Fehler!print(driver.page_source)
und überprüfen Sie , ob der HTML- Code tatsächlich das Element enthält.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 dasselbeclass
: Wie unterscheidet man in diesem Fall zwischen den Such- und Reset-Schaltflächen, während Sie klicken?driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
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:
browser.find_element_by_xpath('just copy and paste the Xpath').click()
quelle
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.
quelle
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:
Der xpath-Ansatz ist nicht unbedingt besser, ich bevorzuge ihn nur. Sie können auch Ihren Selektor-Ansatz verwenden.
quelle
Ö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()
quelle