Estoy tratando de entender Python en general, ya que acabo de cambiar de usar VBA. Me interesaron las posibles formas en que podría abordar este único problema. Ya lo solucioné yendo directamente al enlace, pero necesito entender y aplicar aquí.

from selenium import webdriver

chromedriver = r'C:\Users\dd\Desktop\chromedriver.exe'
browser = webdriver.Chrome(chromedriver)
url = 'https://www.fake.com/'

browser.get(url)

browser.find_element_by_id('txtLoginUserName').send_keys("Hello")
browser.find_element_by_id('txtLoginPassword').send_keys("There")
browser.find_element_by_id('btnLogin').click()

En este punto, estoy tratando de navegar a un botón / enlace en particular. Aquí está la información de la página / elemento

 <a href="javascript:void(0)" style="text-decoration:none" onclick="InitiateCallBack('187', 'True', 'T-Mobile', 'https://www.fake.com/', 'TMobile')">T-Mobile</a>

Estas son algunas de las cosas que probé:

for elem in browser.find_elements_by_xpath("//*[contains(text(), 'T-Mobile')]"):
    elem.click

browser.execute_script("InitiateCallBack(187, True, T-Mobile, https://www.fake.com/, TMobile)")

¡También intenté buscar etiquetas y usar el selector css, todo lo cual eliminé por frustración!

Preguntás especificas

  1. ¿Cómo utilizo el texto interno, "T-Mobile", para hacer clic en el botón?
  2. ¿Cómo ejecutaría el evento onclick?

Traté de leer los siguientes enlaces, pero aún no he podido ingresar de una manera diferente. Parte de esto es probablemente porque todavía no entiendo la sintaxis específica. Estas son solo algunas de las cosas que miré. ¡Pasé unas 3 horas probando varias cosas antes de venir aquí!

onclick () de selenium python da StaleElementReferenceExceptionhttp://selenium-python.readthedocs.io/locating-elements.html Python: Selenium para simular onclickhttps://stackoverflow.com/questions/43531654/simulate-a-onclick-with-selenium-https://stackoverflow.com/questions/45360707/python-selenium-using-onclick Ejecución de javascript en Selenium usando Python

2
Noctsol 27 feb. 2018 a las 21:36

3 respuestas

La mejor respuesta

¿Cómo utilizo el texto interno, "T-Mobile", para hacer clic en el botón?

find_elements_by_link_text sería apropiado para este caso.

elements = driver.find_elements_by_link_text('T-Mobile')
for elem in elements:
    elem.click()

También hay un localizador by_partial_link_text también si no tiene el texto exacto completo.

¿Cómo ejecutaría el evento onclick?

La forma más simple sería simplemente llamar .click() en el elemento como se muestra arriba y el evento, naturalmente, debería ejecutarse en ese momento.

Alternativamente, puede recuperar el atributo onclick y usar driver.execute_script para ejecutar js.

for elem in elements:
    script = elem.get_attribute('onlcick')
    driver.execute_script(script)

Editar:

Tenga en cuenta que en su código hizo element.click, esto no hace nada. element.click() (tenga en cuenta los parens) llama al método de clic.

¿hay alguna manera de utilizar browser.execute_script () para el evento onclick

execute_script puede activar el evento equivalente, pero puede haber más oyentes que te pierdas al hacer esto. Usar el método de clic de elemento es el más sólido. Es muy posible que haya muchos detalles de implementación del sitio que puedan obstaculizar sus esfuerzos de automatización, pero esas posibilidades son infinitas. Sin ver el contexto real, es difícil de decir.
Usted puede usar los métodos JS para hacer clic en un elemento o interactuar con la página, pero puede perderse ciertos oyentes de eventos que ocurren cuando se usa el sitio 'normalmente'; desea emular, más o menos, el uso normal lo más cerca posible.

2
sytech 16 mar. 2018 a las 05:29

Según el HTML que ha compartido, está bastante claro que el sitio web usa JavaScript . Entonces, para click() en el enlace con texto como T-Mobile debe inducir a WebDriverWait con la cláusula expected_conditions como element_to_be_clickable y su puede usar el siguiente bloque de código:

WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(.,'T-Mobile')]"))).click()
1
DebanjanB 28 feb. 2018 a las 06:25

Puedes usarlo

 <div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
    <input class="v_small" type="button"></input>
    <span>
          Reset
    </span>
1
Firat 28 feb. 2018 a las 12:25