Automatización de Pruebas en Oracle APEX: Un Ejemplo Práctico con Python y Selenium

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:

  1. drivers.py: Configura los controladores de Selenium para Chrome y opciones headless.

  2. loginAPEX.py: Define los métodos para interactuar con la página de inicio de sesión.

  3. 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

  1. 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']
  1. 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']
    
  2. 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.