select_by_value examples example python selenium webdriver

examples - Python-Selenium WebDriver-Existe un elemento de comprobación



selenium python example (4)

Tengo un problema: estoy usando el controlador web de selenio (firefox) para abrir una página web, hacer clic en algunos enlaces, etc. luego capturar una captura de pantalla.

Mi script funciona bien desde la CLI, pero cuando se ejecuta a través de un cronjob no pasa la primera prueba find_element (). Necesito agregar algo de depuración, o algo para ayudarme a descubrir por qué está fallando.

Básicamente, tengo que hacer clic en un ancla de "inicio de sesión" antes de ir a la página de inicio de sesión. La construcción del elemento es:

<a class="lnk" rel="nofollow" href="/login.jsp?destination=/secure/Dash.jspa">log in</a>

Estoy utilizando el método find_element By LINK_TEXT:

login = driver.find_element(By.LINK_TEXT, "log in").click()

Soy un poco novato de Python, así que estoy batallando un poco con el lenguaje ...

A) ¿Cómo puedo verificar que python realmente está recogiendo el enlace? ¿Debería usar el bloque try / catch?

B) ¿Hay una manera mejor / más confiable de localizar el elemento DOM que mediante LINK_TEXT? Por ejemplo, en JQuery, puede usar un selector más específico $ (''a.lnk: contiene (iniciar sesión)'') do_something ();

He resuelto el problema principal y solo fue un problema con los dedos. Estaba llamando al guión con parámetros incorrectos. Error simple.

Todavía me gustaría algunos consejos sobre cómo verificar si existe un elemento. Además, un ejemplo / explicación de Espera implícita / explícita en lugar de utilizar una llamada de crappy time.sleep ().

Saludos, ns


A) Sí. La forma más fácil de verificar si un elemento existe es simplemente llamar a find_element dentro de un try/catch .

B) Sí, siempre trato de identificar elementos sin usar su texto por 2 razones:

  1. el texto es más probable que cambie y;
  2. si es importante para usted, no podrá ejecutar sus pruebas en versiones localizadas.

solución ya sea:

  1. Puede usar xpath para buscar un elemento primario o ancestro que tenga un ID u otro identificador único y luego encuentre que es hijo / descendiente que coincide con o;
  2. puede solicitar una identificación o nombre o algún otro identificador único para el enlace en sí.

Para las preguntas de seguimiento, usar try/catch es cómo se puede saber si un elemento existe o no y se pueden encontrar buenos ejemplos de esperas aquí: http://seleniumhq.org/docs/04_webdriver_advanced.html



Ninguna de las soluciones proporcionadas me pareció la más fácil, así que me gustaría agregar mi propio camino.

Básicamente, obtienes la lista de los elementos en lugar de solo el elemento y luego cuentas los resultados; si es cero, entonces no existe. Ejemplo:

if driver.find_elements_by_css_selector(''#element''): print "Element exists"

Observe la "s" en find_elements_by_css_selector para asegurarse de que sea contable.

EDITAR : Estaba revisando el len( de la lista, pero recientemente descubrí que una lista vacía es falsey, por lo que no es necesario que obtenga la longitud de la lista en absoluto, dejando el código aún más simple.

Además, otra respuesta dice que usar xpath es más confiable, lo que simplemente no es cierto. Vea ¿Cuál es la diferencia entre css-selector & Xpath? que es mejor (de acuerdo con el rendimiento y para las pruebas de navegador cruzado)?


un)

from selenium.common.exceptions import NoSuchElementException def check_exists_by_xpath(xpath): try: webdriver.find_element_by_xpath(xpath) except NoSuchElementException: return False return True

b) use xpath - el más confiable. Además, puede tomar xpath como estándar en todos sus scripts y crear funciones como las menciones anteriores para uso universal.

ACTUALIZACIÓN : Escribí la respuesta inicial hace más de 4 años y en ese momento pensé que xpath sería la mejor opción. Ahora recomiendo usar selectores CSS . Aún así, recomiendo no mezclar / usar "por id", "por nombre", etc. y usar un enfoque único en su lugar.