Blog
Navegando con Selenium en Python
Aprender a interactuar con el WebDriver a través del código Python
Desplazarnos y aprender a controlar eventos como diálogos emergentes
Lo primero que se debe hacer con WebDriver es navegar hasta un enlace. La manera normal de hacerlo es llamando al método get:
driver.get("http://www.google.com")
WebDriver esperará hasta que la página se haya cargado por completo (es decir, que el evento onload se haya disparado) antes de devolver el control a su prueba o script. Vale la pena notar que si su página usa mucho AJAX en carga, es posible que WebDriver no sepa cuándo se ha cargado por completo. Si necesita asegurarse de que estas páginas están completamente cargadas, puede utilizar las esperas.
Interacción con la página
Ser capaz de ir a lugares no es muy útil. Lo que realmente nos gustaría hacer es interactuar con las páginas o, más concretamente, con los elementos HTML de una página. En primer lugar, necesitamos encontrar uno. WebDriver ofrece varias formas de encontrar elementos. Por ejemplo, dado un elemento definido como:
<input type="text" name="passwd" id="passwd-id" />
podrías encontrarlo usando cualquiera de ellos:
element = driver.find_element_by_id("passwd-id") element = driver.find_element_by_name("passwd") element = driver.find_element_by_xpath("//input[@id=' passwd-id']")
También puedes buscar un enlace por su texto, pero tenga cuidado! El texto debe coincidir exactamente! También debe tener cuidado al usar XPATH en WebDriver. Si hay más de un elemento que coincida con la consulta, sólo se devolverá el primero. Si no se puede encontrar nada, devolverá NoSuchElementException.
WebDriver tiene una API “basada en objetos”; representamos todo tipo de elementos utilizando la misma interfaz. Esto significa que aunque veas muchos métodos posibles que puedes invocar cuando aprietas la combinación de teclas de autocompletar de tu IDE, no todos tendrán sentido o serán válidos. No te preocupes! WebDriver intentará hacer lo correcto, y si llama a un método que no tiene sentido (“setSelected ()” en una etiqueta “meta”, por ejemplo) se mostrará una excepción.
Entonces, tienes un elemento. ¿Qué puedes hacer con él? En primer lugar, es posible que desee introducir algún texto en un campo de texto:
element.send_keys("algún texto")
Se puede simular pulsando las teclas de flecha con la clase “Keys”:
element.send_keys("y algunos", Keys.ARROW_DOWN)
Es posible llamar send_keys en cualquier elemento, lo que permite probar atajos de teclado como los utilizados en GMail. Un efecto secundario de esto es que al escribir algo en un campo de texto no se borra automáticamente. En vez de eso, lo que escriba se adjuntará a lo que ya está allí. Puede borrar fácilmente el contenido de un campo o área de texto con el método claro:
elemento.clear()
Llenado de formularios
Ya hemos visto cómo introducir texto en un campo textarea o de texto, pero ¿qué pasa con los otros elementos? Puede “conmutar” el estado de la lista desplegable y puede usar “setSelected” para establecer algo parecido a una etiqueta OPTION seleccionada. Tratar con las etiquetas SELECT no es tan malo:
element = driver.find_element_by_xpath("//select[@name=' name']") all_options = elemento.find_elements_by_tag_name("option") for option in all_options: print("Valor es: %s" opción %. get_attribute ("value") opción.click()
Esto encontrará el primer elemento “SELECT” en la página, y alternará entre cada una de sus OPCIONES, imprimiendo sus valores y seleccionando cada una de ellas.
Como puede ver, esta no es la manera más eficiente de tratar los elementos SELECT. Las clases de soporte de WebDriver incluyen una llamada “Select”, que proporciona métodos útiles para interactuar con ellos:
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value)
WebDriver también proporciona funciones para deseleccionar todas las opciones seleccionadas:
select = Select(driver.find_element_by_id('id')) select.deselect_all()
Esto anulará la selección de todas las OPCIONES desde el primer SELECCIÓN de la página.
Supongamos que en una prueba, necesitamos la lista de todas las opciones predeterminadas seleccionadas, Seleccionar clase proporciona un método de propiedad que devuelve una lista:
select = Select(driver.find_element_by_xpath("xpath")) all_selected_options = select.all_selected_options
Para obtener todas las opciones disponibles:
options = select.options
Una vez que haya terminado de llenar el formulario, probablemente quiera enviarlo. Una manera de hacer esto sería encontrar el botón “Enviar” y hacer clic en él:
# Assume the button has the ID "submit" :) driver.find_element_by_id("submit").click()
Alternativamente, WebDriver tiene el método de conveniencia “Enviar” en cada elemento. Si usted llama esto en un elemento dentro de un formulario, WebDriver subirá el DOM hasta que encuentre el formulario adjunto y luego llamará a enviar. Si el elemento no está en una forma, entonces se elevará la excepción NoSuchElementException:
elemento.submit()
Arrastrar y soltar (drop & drag)
Puede utilizar arrastrar y soltar, ya sea moviendo un elemento por una cantidad determinada o sobre otro elemento:
element = driver.find_element_by_name("source") target = driver.find_element_by_name("target") from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform()
Desplazamiento entre ventanas y Frames
Es raro que una aplicación web moderna no tenga frames ni se limite a una única ventana. WebDriver es compatible con el método “switch_to_window”:
driver.switch_to_window ("windowName")
Todas las llamadas al driver se interpretarán ahora como dirigidas a la ventana particular. ¿Pero cómo sabes el nombre de la ventana? Echa un vistazo al javascript o enlace que lo abrió:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
Alternativamente, puede pasar un “window handle” al método “switch_to_window ()”. Sabiendo esto, es posible iterar sobre cada ventana abierta así:
for handle in driver.window_handles: driver.switch_to_window(handle)
También puede oscilar de cuadro a cuadro (o hacia iframes):
driver.switch_to_frame ("frameName")
Es posible acceder a los subtramas separando la ruta con un punto, y también puede especificar el fotograma por su índice. Eso es:
driver.switch_to_frame ("frameName. 0. child")
iría al frame llamado “hijo” del primer subtrama del frame llamado “frameName”. Todos los fotogramas se evalúan como si fueran *top*.
Una vez que hayamos terminado de trabajar en los frames, tendremos que volver al frame padre que se puede hacer usando:
driver.switch_to_default_content()
Diálogos emergentes
Selenium WebDriver tiene soporte incorporado para manejar cuadros de diálogo emergentes. Después de que haya activado la acción que abriría una ventana emergente, puede acceder a la alerta con lo siguiente:
alert = driver.switch_to_alert ()
Esto devolverá el objeto de alerta actualmente abierto. Con este objeto, ahora puede aceptar, despedir, leer su contenido o incluso escribir en un aviso. Esta interfaz funciona igualmente bien en alertas, confirmaciones, avisos. Consulte la documentación de la API para obtener más información.
Navegación: historial y localización
Anteriormente, habíamos cubierto la navegación a una página usando el comando “get” (driver. get (“http://www.example.com”) Como puede ver, WebDriver tiene una serie de interfaces más pequeñas y centradas en las tareas, y la navegación es una tarea útil. Para navegar a una página, puede utilizar el método get:
driver.get("http://www.example.com")
Para avanzar y retroceder en el historial de su navegador:
driver.forward () driver.back ()
Tenga en cuenta que esta funcionalidad depende totalmente del controlador subyacente. Es posible que algo inesperado suceda cuando usted llama a estos métodos si está acostumbrado al comportamiento de un navegador sobre otro.
Galletas / Cookies
Antes de seguir estos pasos, es posible que le interese saber cómo utilizar las cookies. En primer lugar, usted necesita estar en el dominio para el que la cookie sea válida:
# Go to the correct domain driver.get("http://www.example.com") # Now set the cookie. This one's valid for the entire domain cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} driver.add_cookie(cookie) # And now output all the available cookies for the current URL driver.get_cookies()
a
➡ ¡Extendiendo estas técnicas puedes comenzar a crear automatizaciones por tu cuenta!. En nuestro curso de Selenium con Python puedes aprender de esto y mucho mas:
[…] Navegando con Selenium […]
[…] En la siguiente lección-> Navegando con Selenium […]