Python selenium haga clic en el botón

84

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 Searchy Resetarriba (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.

AJW
fuente

Respuestas:

15

Para Python, use el

from selenium.webdriver import ActionChains

y

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

Elimine el espacio entre clases en el selector 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()
falsetru
fuente
1
He probado lo que me ha sugerido. ¡Recibo el mismo NoSuchElementExceptionerror!
AJW
2
@AJW, intente print(driver.page_source)y verifique que html realmente contenga el elemento.
falsetru
Gracias. Lo hice 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 mismo class: ¿cómo se distingue entre los botones de búsqueda y reinicio mientras se hace clic en este caso?
AJW
1
@AJW, ¿Cómo puedo usar xpath?driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru
1
@MortezaLSC, si quieres decir que es posible en un sistema donde no hay GUI, es posible. Utilice navegadores sin cabeza. Por ejemplo, PhantomJS.
falsetru
30

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: instrucción

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

Carlo 1585
fuente
5
Muchas gracias por un truco tan increíble. Ahorró muchas horas
Hero Guy
Hace esto no funciona en un Mac bc tanto quemador, y la trayectoria de fuego no se están presentando como add-ons
Bob
Alguna vez no es un problema del sistema operativo sino de la versión de Firefox, la última versión de Firefox tiene algún problema con FirePath, estoy usando Firefox 55.0.3
Carlo 1585
1
Puede encontrar el elemento en Firefox usando: Herramientas-> Desarrollador web-> Inspector; haga clic en el botón en la GUI, en la parte del inspector, haga clic con el botón derecho del ratón en el código relevante-> copiar y elegir: Selector CSS / Ruta CSS / XPath ...
Nir
4

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.

CosimoCD
fuente
2

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:

  1. Haga que el controlador ejecute el javascript y luego llame a su código de elemento de búsqueda. Busque respuestas más detalladas sobre esto en stackoverflow, ya que no seguí este enfoque.
  2. Simplemente encuentre un gancho comparable en 'output_dest.txt' que producirá el mismo resultado, que es lo que hice.
  3. Intente esperar un poco antes de hacer clic en cualquier cosa:

xpath2 = "su xpath en el que va a hacer clic"

WebDriverWait (controlador, tiempo de espera = 5) .until (lambda x: x.find_element_by_xpath (xpath2))

El enfoque xpath no es necesariamente mejor, simplemente lo prefiero, también puede usar su enfoque selector.

Tanel
fuente
1

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()
Rajiv Singh
fuente