AUTOMATIZACIÓN DE GUIAS EN SYSLIMA

16/02/2025
Versión 1.0
Queda prohibido cualquier tipo de explotación y, en particular, la reproducción, distribución, comunicación pública y/o transformación, total o parcial, por cualquier medio, de este documento sin el previo consentimiento expreso y por escrito a overskull.
ÍNDICE
1. INTRODUCCIÓN Y OBJETIVOS
1.1 Contexto
1.2 Propósito
2. ALCANCE TÉCNICO
2.1 Automatización Operativa
2.2 Gestión de Impresión
2.3 Puntos de Control
3. COMPONENTES Y DATA DEL PROCESO
3.1 Entradas (Inputs)
3.2 Reglas de Negocio
3.3 Mapeo de Selectores
4. FLUJO OPERATIVO PASO A PASO
4.1 Navegación Inicial
4.2 Llenado de Formulario
4.3 Finalización
5. EVIDENCIAS TÉCNICAS (CAPTURA DE CÓDIGO Y SISTEMA)
5.1 Inspeccióndelde elementos DOM
5.2LogicLógicaCorede interacción con ventanas
5.3Resultadosvalidación de claves y verificación5.4 resultado de ejecución exitosa
6. GESTIÓN DE RIESGOS Y BUENAS PRÁCTICAS
6.1 Riesgos Detectados
6.2 Recomendaciones7.DIAGRAMA DE FLUJO
7.DIAGRAMA DE FLUJO
8.CODIGO COMPLETO DOCUMENTADO
1. INTRODUCCIÓN Y OBJETIVOS
1.1 Contexto
La digitalización logística exige rapidezeficiencia en el flujosector logístico depende directamente de datos.la Elvelocidad presentecon la que se procesa la información. Este proyecto surgese desarrolla para optimizar el registro en el portal SYSLIMA, una plataforma esencial que, debido a sus constantesmúltiples validacionesfiltros internas,y validaciones, suele ralentizargenerar demoras en el despacho manual de encomiendas.encomiendas durante las horas punta.
1.2 Propósito
El objetivo principal es transformar el llenado de datos, que actualmente es una tarea mecánica y lenta, en un proceso automático y fluido. AlCon automatizaresta la entrada de datos,automatización se buscabusca:
- Liberar al personal de la carga operativa,operativa permitiéndolespara centrarseque se enfoque en la calidad de atención al clientecliente.
- Garantizar la precisión de la información, eliminando errores de digitación en datos críticos.
- Acelerar el despacho, permitiendo que el sistema garantiza la precisión enprocese la información registrada.en una fracción del tiempo que toma hacerlo manualmente.
2. ALCANCE TÉCNICO
2.1 Automatización Operativa
La solución abarcacubre el ciclo de vida inicialintegral del registro de la guía:guía, desde la autenticación segura del usuario hastaeliminando la navegación profundamanual enredundante. losEste menúsproceso incluye:
- Gestión de Autenticación: Protocolo de acceso seguro al portal mediante la inyección automatizada de credenciales.
- Navegación Estructurada: Acceso directo a módulos profundos como "Generales" y "Orden de Servicio",
gestionandosuperando la latencia deformalosinteligentemenús desplegables. - Sincronización Inteligente: El bot utiliza algoritmos de espera (pausas técnicas) calculados para alinearse con los tiempos de
cargarespuesta delservidor.servidor de Shalom. Esto asegura que los datos del remitente y destinatario se carguen completamente desde la base de datos antes de proceder, evitando registros incompletos o errores de validación de DNI.
2.2 Gestión de Impresión
El bot poseeestá ladiseñado capacidadpara operar en entornos multiventana, una de detectarlas fases más críticas y propensas a errores del proceso manual:
- Detección de Contexto: Capacidad de identificar y transferir el control (switch) a ventanas
emergentes,emergentes de forma aislada, permitiendointeractuarque el script interactúe con elmóduloPDF sin interferir con la pestaña principal. - Protocolo de
impresiónSeguridad: Gestión automatizada deformalaaislada.claveEstomaestra.garantizaEl bot no solo ingresa los dígitos, sino que gestiona la validación y confirmación en dos pasos dentro del modal de seguridad, garantizando que la generación delPDFcódigo final sea exitosa yla creación del códigolibre deseguridad se realicen sinbloqueosvisuales.visuales o cierres inesperados de la sesión.
2.3 Puntos de Control
Se ha definidoimplementado ununa arquitectura de automatización asistida. Este modelo híbrido.permite Elque el bot se detienedetenga enestratégicamente durante la selección del destino, permitiendootorgando queal operador el criteriocontrol humanototal decidasobre la ruta logísticalogística. final,Esta lopausa crítica garantiza que combina la velocidad dedel bot no comprometa la máquinatoma conde decisiones humanas en variables geográficas o agencias específicas, logrando una sinergia perfecta entre la precisión robótica y la flexibilidad necesariadel entransporte el transporte.logístico.
3. COMPONENTES Y DATA DEL PROCESO
3.1 Entradas (Inputs)
ElLa sistema se alimentaintegridad de la automatización reside en tres pilaresfuentes de datos:datos credencialesfundamentales:
- Credenciales de
accesoAcceso:institucional, númerosGestión deidentidadperfiles(DNI/RUC) y una clave maestra de seguridad (9191) predefinidainstitucionales para la autenticación en el portal. - Identificadores de Identidad: Procesamiento dinámico de registros DNI/RUC para la consulta de bases de datos.
- Clave Maestra de Seguridad: Uso de una secuencia predefinida (9191) para la autenticación en el módulo de firma digital y emisión de
documentos.documentos, estandarizando la seguridad en cada guía generada.
3.2 Reglas de Negocio
El bot incorpora un protocolo de sincronización asíncrona. Para evitarmitigar errores de tipo "nombreNombre no encontrado" o "Datos no cargados", else bothan respetaprogramado pausas técnicas de entre 6 y 7 segundos. Este tiempo es vitalindispensable para permitir que lalos base de datosservidores de Shalom sincronicecompleten la identidadbúsqueda delen el padrón electoral o SUNAT, asegurando que los nombres de remitente y destinatario se reflejen correctamente antes de proceder con el registro del teléfono.
3.3 Mapeo de Selectores
Se han auditado y extraído rutas específicasde navegación precisas (XPaths) y selectores de identidad (IDs) para cada campo.nodo Sedel destacaformulario. elAl uso depriorizar identificadores estables como swal-input para la clave y telefonoEntrega para el contacto, asegurando quetelefonoEntrega, el bot siempreadquiere "sepa"visión dóndetécnica", escribir,permitiéndole inclusoignorar siventanas emergentes publicitarias o banners distractores, garantizando que la páginainserción tienede elementosdatos distractores.se realice exclusivamente en los campos correctos.
4. FLUJO OPERATIVO PASO A PASO
El procesociclo comienzainicia con el inicio de sesión y el despliegue del menúmotor lateral.de Elnavegación y la autenticación cifrada. Tras superar el acceso, el bot ejecuta una secuencia de búsqueda en el árbol de menús: despliega el panel lateral, localiza lael secciónnodo de "Generales" y accedeactiva alel formulario de orden"Orden de servicioServicio". Este flujo reduce el tiempo de manerabúsqueda inmediatamanual trasa elmenos ingreso.de 2 segundos.
4.2 Llenado de Formulario
La carga de información se ejecuta de manera modular para evitar colisiones de datos:
- Bloque de Identidad: Registro y validación secuencial del remitente y destinatario.
- Bloque de Configuración: El bot
inyectautilizalacomandosinformacióndeenJavaScriptbloques:(JSprimeroExecutor)elpararemitenteseleccionarcon su validación, luego el destinatario. Posteriormente, seleccionainstantáneamente el método de pago y el tipo de paquete (documentos)Documentos). El uso deformaJSautomáticapermite interactuar con elementos que atravésveces quedan ocultos o bloqueados por otros componentes decomandosladepágina.
4.3 Finalización
UnaAl vez listocompletar el formulario,llenado, se disparaactiva lael ordendisparador de impresión. El botsistema saltarealiza una transferencia de foco a la pestaña del PDF, donde el bot gestiona el Módulo de Seguridad. En esta fase final, ingresa la clave de seguridad en los campos de entrada y verificación,los yrepite finalizaen pulsandolos de verificación con precisión matemática, culminando el proceso al accionar el botón verde de generación de código.código, dejando la guía lista para su distribución.
5. EVIDENCIAS TÉCNICAS (CAPTURA DE CÓDIGO Y SISTEMA)
5.1 Inspección delde elementos DOM
A través de herramientas de desarrollo, se capturó la jerarquía de los elementos swal-input. Estas capturas demuestran que el bot interactúa con campos que tienen comportamientos automáticos (saltos de foco), los cuales fueron replicados en el código.
5.2 LogicLógica Corede Interacción con Ventanas
Uno de los mayores retos técnicos fue el manejo de múltiples pestañas. El núcleosiguiente delfragmento de código utilizamuestra la lógica de window_handles. Esta función permite quecómo el bot mantenga"salta" la conexión conde la ventana principal mientras opera ena la ventanade secundariaimpresión:
5.3 Validación de impresión,Claves unay técnicaVerificación
Se documenta el proceso de llenado doble (ingreso y confirmación). El bot replica el comportamiento humano ingresando los dígitos uno a uno para evitar bloqueos del sistema.
Descripción: Interfaz final del módulo de generación de código antes de la ejecución del comando "Crear código".
5.4 Resultado de Ejecución Exitosa
Se presenta la confirmación visual de que la guía ha sido procesada correctamente por el procesobot.
5.3 Resultados
Como evidencia final, se adjuntan las capturas de las guías emitidas satisfactoriamente, donde se observa que tanto los datos de contacto como los códigos de seguridad fueron insertados sin intervención manual en el último tramo del proceso.
6. GESTIÓN DE RIESGOS Y BUENAS PRÁCTICAS
6.1 Riesgos Detectados
- Inestabilidad de Selectores: El
principalriesgo crítico es la actualización del portal SYSLIMA. Si elmantenimientoequipo técnico de Shalom modifica los IDs o XPaths de losselectores; si la web de Shalom se actualiza,campos, el botpodríaperderánolaencontrarcapacidadlosdecampos.localizarAsimismo,elementos,unacausandoconexióninterrupciones en el flujo. - Latencia de Red: Conexiones inestables pueden retrasar la carga de elementos dinámicos. Esto obligaría a
internet inestable podría requerir aumentarreajustar los tiempos de esperaconfigurados.(Wait Times) para evitar que el bot intente interactuar con campos que aún no son visibles. - Seguridad y Bloqueos: El uso de automatización a velocidades no humanas puede ser detectado por sistemas anti-bot, resultando en bloqueos temporales de la IP o la cuenta si no se respetan las pausas programadas.
6.2 Recomendaciones
Se
- Mantenimiento
realizarPreventivo:unRealizarmonitoreouna auditoría semanal de los XPathsy mantener el software de Chrome actualizadoprincipales para asegurar que elwebdrivermapeofuncionesigacorrectamente.vigenteAdemás,trassecadarecomiendaactualización del sitio web. - Actualización de Entorno: Mantener el navegador Chrome y su respectivo WebDriver sincronizados en la misma versión para evitar fallos de compatibilidad en el arranque del script.
- Protocolo de Validación: Es imperativo no reducir las pausas de
validación6 a 7 segundos. Estos tiempos actúan como un "seguro" que permite la sincronización con los servidores de identidad y simula un comportamiento de navegación orgánica para evitarel bloqueo por parte del sistema de seguridadsanciones del portal. - Monitoreo de Logs: Registrar las fallas frecuentes para identificar si los errores son causados por la web de Shalom o por caídas locales de internet.
7.Diagrama de Flujo

8.CODIGO COMPLETO DOCUMENTADO
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
# ==============================================================================
# CONFIGURACIÓN Y PARÁMETROS GLOBALES
# ==============================================================================
URL_LOGIN = "https://syslima.shalomcontrol.com/login"
USER_DATA = {"user": "70900128", "pass": "Prueba12."}
CONTACTOS = {"remitente": "900161011", "destinatario": "900161012"}
CLAVE_MAESTRA = "9191"
class ShalomBot:
def __init__(self):
"""Inicializa el navegador con opciones para mantener la sesión abierta."""
print("🚀 Iniciando motor de automatización...")
options = webdriver.ChromeOptions()
options.add_argument("--disable-notifications")
options.add_experimental_option("detach", True) # Evita que Chrome se cierre al terminar
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
self.driver.maximize_window()
self.wait = WebDriverWait(self.driver, 25) # Tiempo de espera para carga de elementos
def escribir_campo(self, xpath, texto, limpiar=True):
"""Limpia un campo de texto e ingresa la información de forma segura."""
try:
elemento = self.wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
if limpiar:
elemento.click()
elemento.send_keys(Keys.CONTROL + "a")
elemento.send_keys(Keys.BACKSPACE)
elemento.send_keys(texto)
return True
except Exception as e:
print(f"⚠️ Error al escribir en {xpath}: {e}")
return False
def login(self):
"""Realiza la autenticación en el portal SYSLIMA."""
print("🔑 Accediendo al sistema...")
self.driver.get(URL_LOGIN)
self.escribir_campo('//*[@id="loginaction"]/div/div[1]/input', USER_DATA["user"])
self.escribir_campo('//*[@id="password-text"]', USER_DATA["pass"])
self.driver.find_element(By.ID, "boton-submit").click()
print("✅ Autenticación exitosa.")
def procesar_guia(self, dni_cliente):
"""Ejecuta el flujo completo de llenado de la guía."""
# --- PASO 1: CONTROL HÍBRIDO ---
print("\n🟡 ESPERANDO SELECCIÓN DE DESTINO (Hazlo manualmente en el navegador)...")
input("👉 Una vez seleccionado el destino, presiona ENTER aquí para continuar...")
# --- PASO 2: DATOS DEL REMITENTE ---
print(f"👤 Remitente: Ingresando DNI {dni_cliente}")
self.escribir_campo('//*[@id="input_valida_campo2"]', dni_cliente)
time.sleep(6) # Espera técnica para validación de base de datos
self.escribir_campo('//*[@id="input_telf_rem"]', CONTACTOS["remitente"])
# --- PASO 3: DATOS DEL DESTINATARIO ---
print(f"👤 Destinatario: Ingresando DNI {dni_cliente}")
self.escribir_campo('//*[@id="input_valida_campo3"]', dni_cliente)
time.sleep(7) # Espera técnica para carga de identidad
self.escribir_campo('//*[@id="telefonoEntrega"]', CONTACTOS["destinatario"])
# --- PASO 4: CONFIGURACIÓN DE PAGO Y PAQUETE ---
print("💰 Configurando pago (Entrega) y tipo de producto...")
# Selección de Pago
self.wait.until(EC.element_to_be_clickable((By.ID, "idosTipoPago"))).click()
self.driver.find_element(By.XPATH, '//*[@id="idosTipoPago"]/option[3]').click() # Opción 'Entrega'
# Agregar Producto
self.driver.find_element(By.ID, "btn_name_paquete").click()
time.sleep(1.5)
self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="formDeclaracionJurada"]/div/div[1]/div/div/div[2]'))).click() # Documentos
self.driver.find_element(By.ID, "declaracion_btn-agregar").click()
# --- PASO 5: IMPRESIÓN Y SEGURIDAD ---
print("🚀 Generando impresión...")
time.sleep(2)
btn_imprimir = self.driver.find_element(By.ID, "imprimePDF")
self.driver.execute_script("arguments[0].click();", btn_imprimir)
# Confirmar cuadro de diálogo "SÍ"
self.wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[5]/div/div[3]/button[1]'))).click()
# Cambio a la ventana emergente del PDF
self.wait.until(lambda d: len(d.window_handles) > 1)
self.driver.switch_to.window(self.driver.window_handles[1])
print("🔀 Foco transferido al Módulo de Impresión.")
# --- PASO 6: CREACIÓN DE CÓDIGO DE SEGURIDAD ---
print(f"🔑 Aplicando clave maestra: {CLAVE_MAESTRA}")
# Bloque de ingreso inicial (swal-input)
for i, num in enumerate(CLAVE_MAESTRA, 1):
self.escribir_campo(f'//*[@id="swal-input{i}"]', num, limpiar=False)
self.driver.find_element(By.XPATH, "//button[contains(text(), 'Siguiente')]").click()
time.sleep(1)
# Bloque de verificación (confirm-input)
for i, num in enumerate(CLAVE_MAESTRA, 1):
self.escribir_campo(f'//*[@id="confirm-input{i}"]', num, limpiar=False)
# Clic final
self.driver.find_element(By.XPATH, "//button[contains(text(), 'Crear codigo')]").click()
print("✅ PROCESO FINALIZADO CON ÉXITO.")
# ==============================================================================
# EJECUCIÓN PRINCIPAL
# ==============================================================================
if __name__ == "__main__":
bot = ShalomBot()
try:
bot.login()
bot.navegar_a_orden()
bot.procesar_guia("71423703")
except Exception as e:
print(f"❌ Error crítico en la ejecución: {e}")



