25 de septiembre de 2019

9 trucos de Selenium que te ayudarán en tus pruebas automáticas

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 webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
  
driver = webdriver.Firefox()
driver.get("http://www.google.com/")
  
driver.implicitly_wait(10)
  
#abrimos la nueva pestaña
driver.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 webdriver
from time import sleep
  
driver = 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 correcta
  
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from time import sleep
  
@pytest.fixture(params=["chrome", "firefox"],scope="class")
def driver_init(request):
    if request.param == "chrome":
    if request.param == "firefox":
    yield
    web_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 webdriver
  
driver = 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 webdriver
from time import sleep
  
driver = 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 webdriver
import time
  
driver = webdriver.Firefox()
driver.get('https://www.google.com')
# Abrimos una nueva pestaña
driver.execute_script("window.open('');")
time.sleep(5)
# Cambiamos el foco a la nueva pestaña
driver.switch_to.window(driver.window_handles[1])
driver.get("https://qalovers.com")
time.sleep(5)
# Ahora, cerramos la pestaña actual
driver.close()
time.sleep(5)
# Volvemos a cambiar el foco a la primera pestaña
driver.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.


0 Comentarios:

Publicar un comentario

¡Estamos deseando leer tus comentarios y opiniones! Escríbenos por aquí:

¿Hablamos?

Cuéntanos como ayudarte

Si quieres más información sobre lo que hacemos, necesitas ayuda o quieres hablar con nosotr@s, solo tienes que ponerte en contacto.

Teléfono:

(+34) 648 961 876