Si trabajas en QA y más concretamente en automatización de pruebas, tienes que conocer Selenium, ya sea
de oídas o porque alguien lo ha utilizado (si es que no eres tu mism@).
Esta herramienta, a día de hoy, es una de las más usadas del
mercado, quizá siendo la que más y con WebDriver, la facilidad y la
compatibilidad con todos los navegadores, es más que espectacular.
Además, por si fuera poco, Selenium es una de las
herramientas con más compatibilidad en lenguajes de programación, ya sea Python,
Ruby, Java, PHP, .NET y muchos más.
No hace mucho, utilizamos Selenium junto con Python en un
proyecto de gran envergadura y gracias al trabajo diario con grandes expertos
en esta herramienta, pudimos detectar una serie de buenas prácticas, trucos o
tareas que se pueden ejecutar y facilitar mucho la vida a personas que quieren
comenzar a usar Selenium o ya llevan años haciéndolo y pueden mejorar sus
procesos.
1.
Abrir una página web en una pestaña nueva con
Selenium
En algunas ocasiones, nos encontramos con la necesidad de
abrir páginas web en navegadores y, más concretamente, en pestañas nuevas. Para
ello, utilizaremos execute_script.
Por ejemplo, usaremos un código tipo de este modo:
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom time import sleepdriver = webdriver.Firefox()driver.get("http://www.google.com/")driver.implicitly_wait(10)#abrimos la nueva pestañadriver.execute_script("window.open('https://www.qalovers.com', 'new tab')")sleep(5)driver.quit()
2.
Hacer Zoom con Selenium
En algunas ocasiones, debemos de hacer zoom (alejando y
acercando) en una imagen o documento en concreto (ya sea para pulsar algo o
para observar un texto más pequeño, por ejemplo). Para ello, usaremos la
propiedad de transformación que permite hacer cualquier movimiento rotatorio o
acercar y alejar la pantalla. En Firefox se puede usar MozTransform, tal y como
vemos en el ejemplo:
from selenium import webdriverfrom time import sleepdriver = webdriver.Firefox()driver.get("https://www.qalovers.com/")timeout = 10''' Zoom en un 350% '''driver.execute_script('document.body.style.MozTransform = "scale(2.0)";')driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')sleep(10)''' Zoom en un 100% '''driver.execute_script('document.body.style.MozTransform = "scale(1.0)";')driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')''' Añadimos un sleep para ralentizar la acción '''sleep(10)driver.quit()
3.
Trabajar con varios navegadores a la vez, para
realizar pruebas de compatibilidad
Cuando realizamos pruebas de compatibilidad, tenemos que
saltar de un navegador a otro o quizá probar algún tipo de pauta en diferentes
navegadores para comprobar que ocurre o si en todos funciona exactamente igual.
Para ello, Selenium nos permite identificar e incorporar, de manera selectiva,
la utilización de diferentes navegadores o ejecutar código en cada uno de
ellos, al mismo tiempo. Lo ideal es utilizar pytest, tal y como se muestra en
el ejemplo:
# La importación de los módulos es obligatoria para una ejecutar el código de manera correctaimport pytestfrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.keys import Keysfrom time import sleep@pytest.fixture(params=["chrome", "firefox"],scope="class")def driver_init(request):if request.param == "chrome":if request.param == "firefox":yieldweb_driver.close()
4.
Actualizar los navegadores mientras se realiza
algún tipo de prueba
Tanto cuando realizamos pruebas manuales como automáticas,
una de las acciones más repetidas, suele ser la de refrescar el navegador o página
que estamos probando, ya sea para comprobar que el cambio se ha realizado
correctamente o simplemente para volver a limpiar la información y comenzar de
nuevo.
En Selenium, podemos realizar este refresco con driver.refresh()
from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://www.qalovers.com/")driver.refresh()
5.
Extraer datos tras ejecutar código de JS
En ocasiones, al ejecutar un código JS, debemos de capturar
el resultado o extraer algún tipo de dato del mismo. Para ello, podemos
utilizar “Return” y obtener el resultado del código. Lo podemos ver en un
ejemplo sencillo:
from selenium import webdriverfrom time import sleepdriver = webdriver.Firefox()driver.get("https://www.qalovers.com")driver.execute_script("document.getElementsByClassName('home-cta')[0].click()")result = driver.execute_script("return 0")print(result)sleep(10)driver.close()
6.
Cerrar pestañas del navegador, cambiando el foco
de una a otra
Al realizar algún tipo de prueba, nos podemos encontrar con
la necesidad de cerrar pestañas del navegador sin tener que cerrarlo
completamente (o si). Para ello, podemos usar driver.close()
from selenium import webdriverimport timedriver = webdriver.Firefox()driver.get('https://www.google.com')# Abrimos una nueva pestañadriver.execute_script("window.open('');")time.sleep(5)# Cambiamos el foco a la nueva pestañadriver.switch_to.window(driver.window_handles[1])driver.get("https://qalovers.com")time.sleep(5)# Ahora, cerramos la pestaña actualdriver.close()time.sleep(5)# Volvemos a cambiar el foco a la primera pestañadriver.switch_to.window(driver.window_handles[0])driver.get("https://www.qaglobal.es")time.sleep(5)# Cerramos la última pestaña, y por lo tanto, cerraremos el navegador.#driver.close()
7.
Hacer scroll en el navegador
Otro movimiento típico que se suele realizar cuando estamos
haciendo pruebas, es el scroll. Para ello, Selenium nos ayuda con el código
window.scrollTo().
Lo que hemos realizado, es un ejemplo de como descender hasta
el final de la página:
from selenium import
webdriver
from time import
sleep
driver = webdriver.Firefox()
driver.get("https://www.qalovers.com/")
timeout = 10
''' Hacemos scroll complete en toda la página '''
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(10)
driver.quit()
8.
Guardar un recorte de la pantalla
A la hora de dar de alta un defecto o el poder comprobar algún
tipo de situación, guardando una evidencia, podemos Pillow desde Selenium.
El primer paso es instalarlo con pip installa pillow.
Básicamente, lo que haremos, será el capturar toda la
pantalla y con Pillow, capturar la sección que queramos.
from selenium import
webdriver
''' Instalamos pillow '''
from PIL import
Image
from io import
BytesIO
driver = webdriver.Firefox()
driver.get('http://google.com/')
# Buscamos el logotipo de Google
element = driver.find_element_by_id('hplogo')
image_location = element.location
size = element.size
png = driver.get_screenshot_as_png()
''' La captura es correcta, por lo que salimos del navegador '''
driver.quit()
''' Abrimos la imagen con la librería de PIL '''
crop_image = Image.open(BytesIO(png))
''' Extraemos las coordenadas (x,y) '''
left = image_location['x']
top = image_location['y']
right = image_location['x'] + size['width']
bottom = image_location['y'] + size['height']
crop_image = crop_image.crop((left, top, right, bottom))
crop_image.save('captura-logotipo.png')
9.
Capturar el código fuente HTML de una página web
En ocasiones, una prueba básica que podemos hacer es
capturar el HTML de una página web para buscar algo en concreto o comprobar que
una acción se esté realizando correctamente. Para ello utilizamos la propiedad
innerHTML.
En el siguiente ejemplo lo comprobamos:
from selenium import
webdriver
from selenium.webdriver.chrome.options import
Options
from selenium.webdriver.common.keys import
Keys
from time import
sleep
import
io
driver = webdriver.Firefox()
driver.get("https://www.qalovers.com")
elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("innerHTML")
filename = open('qalovers_codigo_fuente.html', 'w')
filename.write(source_code)
filename.close()
sleep(10)
driver.close()
Básicamente, lo que hemos realizado es recopilar una serie
de acciones que utilizamos y que pensamos que son válidas y extrapolables a cualquier
tipo de proyecto o situación.
Esperemos que esto os pueda ayudar y solventar dudas que os
surjan en vuestros proyectos o pruebas de concepto que hacéis en casa, facilitándoos
la vida un poquito más.
Comentarios
Publicar un comentario