Ya habíamos visto como automatizar tareas leyendo el html de páginas web y extrayendo la información relevante de servicios externos haciendo llamadas http a través de los módulos de python adecuadas para esos propósitos.
No obstante esta solución en muchas ocasiones se queda muy corta ya que es necesario usar mas características del navegador para completar ciertas tareas. Aquí es donde selenium, que es un framework de automatizacion web, viene a salvar el día ya que no solo sirve para automatizar tareas si no que también puede usarse para conducir pruebas funcionales sobre nuestras aplicaciones web.
Para instalar selenium para python, desde una terminal ejecutamos el siguiente comando:
pip install selenium
Ahora bien, selenium se vale de los motores navegación web mas populares hoy en día. Por defecto toda instalación linux trae consigo una instalación de firefox, por lo que es el navegador que usaremos en esta ejemplificación.
Primero creamos una instancia del navegador para posteriormente decirle que hacer:
from selenium import webdriver browser = webdriver.Firefox() print "Objeto Firefox -> ", browser
Si el código anterior les da un error es porque deben instalar, o decirle donde esta instalado el geckodriver que es el motor de navegación de firefox. Pueden bajarlo aqui. Y luego reemplazar la tercera linea así:
browser = webdriver.Firefox(executable_path='/ruta/al/geckodriver')
A partir de ahora todo es cuestión de decirle al driver instrucciones especificas, y python hace que eso sea verdaderamente fácil. Como caso de estudio vamos a poner el ejemplo hipotético en el que quisiéramos, usando selenium, iniciar sesión en nuestra cuenta de facebook.
Bien lo primero seria navegar a facebook:
browser.maximize_window() browser.get('https://facebook.com')
Estas dos lineas maximizan la ventana del navegador y navegan a facebook.com
Lo siguiente seria localizar los campos de usuario y contraseña por medio de sus nombres (parecido a como lo hicimos en el post anterior)
email = browser.find_element_by_name('email') password = browser.find_element_by_name('pass')
Y luego llenar esos campos con la información correspondiente
email.send_keys('[email protected]') #escribe email correcto addresspassword.send_keys('pass123') #escribe el password correcto
Y finalmente buscamos el boton que inicia la sesión y le mandamos un click
browser.find_element_by_id('loginbutton').click()
Y automáticamente estaremos autenticados y con la sesión iniciada en facebook. Recuerden que este gran poder conlleva una gran responsabilidad, facebook tiene mecanismos para detectar si ustedes son robots y eventualmente bloquear sus acciones o mostrar un captcha. Por lo que es buena idea agregar algunas esperas entre cada paso con una simple instrucción:
browser.implicitly_wait(10) # segundos
Pruebas Funcionales
Digamos que ademas de automatizar tareas queremos tener un set de pruebas funcionales. Selenium podría actuar como un agente de quailty assurance y verificar que todo en la aplicación funcione con gran atención al detalle.
Por ejemplo, Digamos que queremos hacer una prueba funcional simple que implica verificar si el titulo de la pagina a la cual estamos navegando es correcto. Con unas cuantas lineas de código lo podemos lograr:
import unittest from selenium import webdriver browser = webdriver.Firefox() browser.maximize_window() browser.get('https://python.org') assert "Python" in broser.title
Lo que se lee asi:
- Usando un navegador Firefox
- Y teniendo la ventana maximizada
- navegar a python.org
- Verificar que la palabra Python exista en el titulo de la página.
Y así de fácil podemos automatizar pruebas funcionales en python, así como también tareas muy aburridas (como iniciar sesión en facebook :D)