Soy bastante nuevo en python selenium y estoy tratando de hacer clic en un botón que tiene la siguiente estructura html:
<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>
Me gustaría poder hacer clic en los botones Search
y Reset
arriba (obviamente, individualmente).
He probado un par de cosas, por ejemplo:
driver.find_element_by_css_selector('.button .c_button .s_button').click()
o,
driver.find_element_by_name('s_image').click()
o,
driver.find_element_by_class_name('s_image').click()
pero, parece que siempre termino con NoSuchElementException
, por ejemplo:
selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;
Me pregunto si de alguna manera puedo usar los atributos onclick del HTML para hacer clic en selenium.
Cualquier pensamiento que pueda orientarme en la dirección correcta sería genial. Gracias.
NoSuchElementException
error!print(driver.page_source)
y verifique que html realmente contenga el elemento.print(driver.page_source)
y descubrí que se llamaba diferente. Extraño. Ahora hace clic cuando eliminé los espacios y les cambié el nombre. En un seguimiento aunque: como puede ver, incluso el botón de reinicio y el botón de búsqueda tienen lo mismoclass
: ¿cómo se distingue entre los botones de búsqueda y reinicio mientras se hace clic en este caso?driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
prueba esto:
descargue firefox, agregue el complemento "firebug" y "firepath"; después de instalarlos, vaya a su página web, inicie firebug y busque el xpath del elemento, es único en la página para que no pueda cometer ningún error.
Ver imagen:
browser.find_element_by_xpath('just copy and paste the Xpath').click()
fuente
Tuve el mismo problema al usar Phantomjs como navegador, así que lo resolví de la siguiente manera:
driver.find_element_by_css_selector('div.button.c_button.s_button').click()
Básicamente, agregué el nombre de la etiqueta DIV en la cotización.
fuente
El siguiente proceso de depuración me ayudó a resolver un problema similar.
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'))
Debería tener dos archivos de texto con la página inicial en la que estaba ('output_init.txt') y la página a la que fue reenviado después de hacer clic en el botón ('output_dest.txt'). Si son iguales, entonces sí, su código no funcionó. Si no es así, entonces su código funcionó, pero tiene otro problema. El problema para mí parecía ser que el javascript necesario que transformó el contenido para producir mi gancho aún no se había ejecutado.
Tus opciones como yo las veo:
El enfoque xpath no es necesariamente mejor, simplemente lo prefiero, también puede usar su enfoque selector.
fuente
abra un sitio web https://adviserinfo.sec.gov/compilation y haga clic en el botón para descargar el archivo e incluso quiero cerrar la ventana emergente si viene usando python selenium
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()
fuente