Saltar al contenido principal
Automatización de Pruebas en Oracle APEX: Un Ejemplo Práctico con Python y Selenium
Volver al inicio

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

26 de noviembre de 20244 min de lectura0 vistas

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.

Artículos relacionados