Automatización de Pruebas en Oracle APEX: Un Ejemplo Práctico con Python y Selenium
La automatización de pruebas es esencial para garantizar la calidad de las aplicaciones en entornos dinámicos como Oracle APEX. En este artículo, exploraremos cómo configurar y ejecutar pruebas automatizadas utilizando Selenium y Python, con una prueba de login como ejemplo práctico .
Introducción a Selenium.
Selenium es una herramienta popular de automatización de pruebas para aplicaciones web. Con Oracle APEX, puedes utilizar Selenium para probar flujos de trabajo como el inicio de sesión, validaciones y navegación entre páginas. Esto asegura que los cambios en tu aplicación no afecten la funcionalidad existente.
Estructura del Proyecto
El proyecto está organizado en módulos para separar las responsabilidades:
drivers.py: Configura los controladores de Selenium para Chrome y opciones headless.
loginAPEX.py: Define los métodos para interactuar con la página de inicio de sesión.
automation_orclAPEX.py: Contiene las pruebas unitarias, incluyendo el flujo de inicio de sesión.
Configuración del Driver
El archivo drivers.py configura los navegadores compatibles y permite ejecuciones headless (sin interfaz gráfica), ideal para CI/CD.
from enum import Enum
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
class GeneradorDriver():
def Generar(self,tipo_browser):
if tipo_browser == TipoBrowser.CHROME:
self.driver = webdriver.Chrome(service=Service(executable_path=r".\utils\chromedriver.exe"))
self.driver.maximize_window()
return self.driver
class GeneradorDriverHeadLess():
def Generar(self,tipo_browser):
if tipo_browser == TipoBrowser.CHROME:
# Config para ejecución headless chrome
chrome_options = Options()
chrome_options.add_argument("enable-logging")
chrome_options.add_argument("headless")
chrome_options.add_argument("disable-gpu")
service = Service(executable_path=r".\utils\chromedriver116.exe")
# service = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service, options=chrome_options)
self.driver.maximize_window()
return self.driver
class TipoBrowser(str,Enum):
CHROME = "chrome"
FIREFOX = "firefox"
Interacción con Oracle APEX
En loginAPEX.py, se definen métodos para interactuar con elementos de la página, como campos de texto y botones.
Ejemplo: Inicio de Sesión
import random
import string
from utils.drivers import GeneradorDriver, TipoBrowser
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
class LoginApex():
boton_login = (By.XPATH, "//*[@id='B11409857260876630']") #XPATH del boton login cambiar por el tuyo
login = (By.XPATH, "//*[@id='P9999_USERNAME']") #XPATH del item user cambiar por el tuyo
clave_login = (By.XPATH, "//*[@id='P9999_PASSWORD']")#XPATH del item password cambiar por el tuyo
usuario_login = (By.XPATH, "//*//*[@id='L11525360857973883']") # XPATH del user ya logueado, que aparece arriba cambiar por el tuyo
url = "tuurl.com/login"
def __init__(self,driver):
self.driver = driver
def cargar_pagina(self):
self.driver.get(self.url)
def ingresar_usuario_login(self, login):
WebDriverWait(self.driver,10).until(lambda d : d.find_element(*self.login)).send_keys(login)
def ingresar_password_login(self, clave_login):
WebDriverWait(self.driver,10).until(lambda d : d.find_element(*self.clave_login)).send_keys(clave_login)
def texto_usuario_login(self):
return WebDriverWait(self.driver,20).until(lambda d : d.find_element(*self.usuario_login)).text
def botonLogin(self):
WebDriverWait(self.driver,10).until(lambda d : d.find_element(*self.boton_login)).click()
Automatización de Pruebas
El archivo principal, automation_orclAPEX.py, utiliza el framework unittest para estructurar las pruebas. Por ejemplo, una prueba para verificar el inicio de sesión:
import unittest, time
import HtmlTestRunner
from utils.drivers import GeneradorDriver, TipoBrowser
from paginas.loginAPEX import LoginApex
class TestDWShop(unittest.TestCase):
def setUp(self):
self.orden_log = 1
self.driver = GeneradorDriver().Generar(TipoBrowser.CHROME)
self.pagina_dws = LoginApex(self.driver)
self.login = "tuusuario"
self.clave_login = "tupassword"
self.tiempo = 3
def test2(self):
log = "cargando pagina..."
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
self.pagina_dws.cargar_pagina()
log = "Digitando usuario..."
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
self.pagina_dws.ingresar_usuario_login(self.login)
log = "Digitando password..."
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
self.pagina_dws.ingresar_password_login(self.clave_login)
log = "Haciendo Click..."
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
self.pagina_dws.botonLogin()
log = "Corroborando resultado del registro de usuario..."
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
resultado = self.pagina_dws.texto_usuario_login()
log = "Acceso exitoso con: <b>" + resultado + "</b>"
print(str(self.orden_log) + ' - ' + log + '<br>')
self.orden_log += 1
time.sleep(5)
def tearDown(self):
# Se cierra la ventana del navegador web
self.driver.quit()
if __name__ == '__main__':
#crea un arrivo test para hacer seguimiento a tus pruebas
unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output=r'.\Reportes'))
Ejecución y Reportes
El uso de HtmlTestRunner genera reportes HTML para revisar los resultados de las pruebas. Para ejecutar las pruebas:
python automation_orclAPEX.py
Los reportes como el siguiente se almacenan en la carpeta ./Reportes.
Si hubiere algun error, ahi mismo se podria ver.
Cómo Obtener los XPaths para Automatizar con Selenium
Los XPaths son fundamentales para localizar elementos en la página y realizar interacciones automatizadas con Selenium. Aquí tienes una guía paso a paso para obtener los XPaths necesarios:
Métodos para Obtener los XPaths
Usando Herramientas de Desarrollador del Navegador
Abre tu navegador (Chrome, Firefox, etc.) y navega hasta la página que deseas probar.
Haz clic derecho sobre el elemento que te interesa y selecciona "Inspeccionar".
Esto abrirá las herramientas de desarrollador, donde se resalta el elemento en el DOM.
Haz clic derecho sobre la línea resaltada en el DOM y selecciona "Copiar > Copiar XPath".
Ejemplo: Supongamos que quieres capturar el campo de usuario. El DOM podría verse así:
<input id="P9999_USERNAME" type="text" name="username">
El XPath generado sería:
//*[@id='P9999_USERNAME']
Usando Selectores Relativos Los XPaths generados automáticamente pueden ser demasiado largos o frágiles. Crear un XPath relativo más robusto es una mejor práctica:
//input[@id='P9999_USERNAME']
Complementos del Navegador
XPath Helper (Chrome): Resalta y prueba tus XPaths en tiempo real.
Firebug (Firefox): Aunque ya no está disponible, hay extensiones modernas como ChroPath o SelectorsHub.xpath
Conclusión
Con Selenium y Python, puedes automatizar pruebas esenciales para aplicaciones Oracle APEX, mejorando la eficiencia y reduciendo errores humanos. La separación modular en controladores, páginas y pruebas asegura un código limpio y reutilizable.
¿Listo para implementar estas técnicas? te dejo el codigo para que lo descargues de github y lo pruebes orclAPEX+Selenium.