Tutorial de Sikuli para Selenium Automatización

⚡ Resumen inteligente

Sikuli automatiza una interfaz gráfica reconociendo capturas de pantalla almacenadas en lugar de localizadores, lo que permite una Selenium prueba de manejo Windows ventanas emergentes, cuadros de diálogo de archivos nativos y objetos Flash a los que WebDriver por sí solo no puede acceder.

  • 🔘 Idea central: Cada elemento se almacena como un archivo PNG, y Sikuli lo encuentra haciendo coincidir los píxeles en la pantalla.
  • ☑️ Configuración: Agregar el formulario SikuliX JAR de API para el Java construir camino al lado del Selenium Paso.
  • Clase de pantalla: Ofrece funciones como clic, doble clic, escribir, pasar el cursor y buscar, cada una de las cuales requiere el nombre de una imagen.
  • 🧪 Clase de patrón: Envuelve una ruta de imagen y ajusta la coincidencia mediante similar() y exact().
  • 🛠️ Ejemplo trabajado: En una prueba de Chrome, Sikuli hace clic en Elegir archivo, luego escribe la ruta y hace clic en Abrir.
  • ⚙️ Limitación: Un cambio en la resolución o el tamaño de los píxeles interrumpe la coincidencia y genera un error FindFailed.

Tutorial de Sikuli para Selenium Automatización

¿En qué está Sikuli? Selenium?

Sikuli es una herramienta de automatización de pruebas basada en GUI de código abierto. Se utiliza principalmente para interactuar con elementos de páginas web y manejar ventanas emergentes. Sikuli utiliza la técnica de “Reconocimiento de imágenes” y “GUI de control” para interactuar con elementos de páginas web y ventanas emergentes. En Sikuli, todos los elementos web se toman como imágenes y se almacenan dentro del proyecto.

⚠️ Nota sobre el nombre: El proyecto se mantiene hoy como SikuliX, publicado en Maven Central como com.sikulix:sikulixapiLos nombres de las clases que aparecen a continuación no han sufrido cambios.

Cómo utilizar Sikuli con Selenium controlador web

Sikuli se puede integrar con Selenium WebDriver utilizando el archivo JAR de Sikuli, en los dos pasos que se indican a continuación.

Paso 1) Descargar El archivo JAR de Sikuli que se encuentra a continuación URL, y extract el contenido del archivo ZIP a una carpeta.

https://mvnrepository.com/artifact/com.sikulix/sikulixapi/2.0.5

Paso 2) Cree un nuevo proyecto JAVA en Eclipse y agregue el archivo JAR a la ruta de compilación, junto con los archivos jar de Selenium usando clic derecho en el proyecto -> Ruta de compilación -> Configurar ruta de compilación, como se muestra a continuación.

Se agregó el archivo JAR de Sikuli a la Java construir ruta en Eclipse Configurar la ruta de compilación

Una vez que hayas añadido el archivo JAR a la ruta de compilación del proyecto, podrás usar las clases proporcionadas por Sikuli. Un proyecto Maven también puede declarar el mismo artefacto como dependencia.

Clase de pantalla en Sikuli

La clase Screen es la clase base para todos los métodos que ofrece Sikuli. Contiene métodos predefinidos para las operaciones más comunes en los elementos de la pantalla, como clic, doble clic, introducir texto en un cuadro de texto, pasar el ratón por encima, etc. A continuación, se muestra la lista de métodos de uso común que ofrece la clase Screen.

Método Mareas Ideales para Lecciones Sintaxis
Haga clic en Este método se utiliza para hacer clic en un elemento en la pantalla usando el nombre de la imagen como parámetro.

Pantalla s = nueva pantalla();

s.click(“QA.png”);

doble clic Este método se utiliza para hacer doble clic en un elemento. Acepta el nombre de la imagen como parámetro.

Pantalla s = nueva pantalla();

s.doubleClick(“QA.png”);

Tipo Este método se utiliza para proporcionar valor de entrada a un elemento. Acepta el nombre de la imagen y el texto que se enviará como parámetros.

s.type(“QA.png”,”TEXTO”);

Hover Este método se utiliza para pasar el cursor sobre un elemento. Acepta el nombre de la imagen como parámetro.

s.hover(“QA.png”);

Encontrar Este método se utiliza para encontrar un elemento específico en la pantalla. Acepta el nombre de la imagen como parámetro.

s.find(“QA.png”);

Clase de patrón en Sikuli

Mientras que Screen actúa sobre un nombre de imagen simple, la clase Pattern se utiliza para asociar el archivo de imagen con atributos adicionales que identifican de forma única el elemento. Recibe como parámetro la ruta de la imagen.

Pattern p = new Pattern(“Path of image”);

Los siguientes son los métodos más comúnmente utilizados de la clase Patrón.

Método Mareas Ideales para Lecciones Sintaxis
obtener nombre de archivo Devuelve el nombre del archivo contenido en el objeto Patrón.

Patrón p = nuevo patrón(“D:\Demo\QA.png”);

Nombre de archivo de cadena = p.getFileName();

similares Este método devuelve un nuevo objeto Pattern con similitud establecida en un valor específico. Acepta el valor de similitud entre 0 y 1 como parámetro. Sikuli busca todos los elementos que se encuentran dentro del rango de similitud especificado y devuelve un nuevo objeto de patrón.

Patrón p1 = p.similar(0.7f);

Exacto Este método devuelve un nuevo objeto de patrón con similitud establecida en 1. Solo busca una coincidencia exacta del elemento especificado.

Patrón p1 = p.exact();

Code Ejemplo de carga de archivos usando Sikuli

El siguiente código explica el uso de Sikuli para la carga de archivos en Chrome.

package com.sikuli.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Pattern;
import org.sikuli.script.Screen;
import org.openqa.selenium.chrome.ChromeDriver;

public class SikuliDemo {

    public static void main(String[] args) throws FindFailed {

        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        String filepath = "D:\\Guru99Demo\\Files\\";
        String inputFilePath = "D:\\Guru99Demo\\Files\\";
        Screen s = new Screen();
        Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG");
        Pattern openButton = new Pattern(filepath + "OpenButton.PNG");
        WebDriver driver;

        // Open Chrome browser    
        driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/test/image_upload/index.php");

        // Click on Browse button and handle windows pop up using Sikuli
        driver.findElement(By.xpath(".//*[@id='photoimg']")).click();
        s.wait(fileInputTextBox, 20);
        s.type(fileInputTextBox, inputFilePath + "Test.docx");
        s.click(openButton);

        // Close the browser
        driver.close();
    }
}

Code Explicación

Paso 1) La primera declaración implica configurar la ruta ejecutable del controlador para Chrome.

System.setProperty("webdriver.chrome.driver", "D:\\ chromedriver.exe");

⚠️ Nota de versión: Selenium 4 resuelve el binario del controlador a través de Selenium Gerente, esta línea ahora es opcional. Se mantiene tal como la escribió el autor original.

Paso 2) Utilice una herramienta de captura de pantalla como Snipping Tool para tomar capturas de pantalla de la ventana emergente 'FileText'Boxy el botón 'Abrir', como se muestra a continuación.

Snipping Tool selección sobre el Windows cuadro de texto para ingresar archivos en la ventana emergente de carga

Así es como debería verse tu captura de pantalla:

Texto del archivo capturadoBox y las imágenes de referencia de OpenButton utilizadas por el script Sikuli

Las imágenes para el cuadro de texto de entrada de archivos de Windows y el botón Abrir se almacenan en 'FileText'Box.PNG’ y ‘OpenButton.PNG’.

Ejemplo: si desea automatizar la operación de apertura del Bloc de notas, debe almacenar la imagen de un icono del escritorio para el Bloc de notas en un archivo PNG y realizar una operación de clic en él.

En nuestro caso, reconoce el cuadro de texto de entrada de archivo y el botón Abrir en Windows ventana emergente que utiliza las imágenes almacenadas. Si la resolución de la pantalla cambia desde la captura de la imagen hasta la ejecución del script de prueba, el comportamiento de Sikuli sería inconsistente. Por lo tanto, siempre es recomendable ejecutar el script de prueba con la misma resolución con la que se capturan las imágenes. El cambio en el tamaño de píxel de las imágenes hará que Sikuli lance una excepción FindFailed.

Paso 3) Las siguientes declaraciones incluyen la creación de objetos para las clases Pantalla y Patrón. Crea un nuevo objeto de pantalla. Establezca la ruta del archivo que desea cargar como parámetro para el objeto Patrón.

Screen s = new Screen();
Pattern fileInputTextBox = new Pattern(filepath + "FileTextBox.PNG");
Pattern openButton = new Pattern(filepath + "OpenButton.PNG");

Paso 4) Las siguientes declaraciones implican abrir el navegador Chrome con el URL de una aplicación de carga de archivos de demostración: https://demo.guru99.com/test/image_upload/index.php

driver = new ChromeDriver();
driver.get("https://demo.guru99.com/test/image_upload/index.php");

Paso 5) Haga clic en el botón elegir archivo usando la siguiente declaración

driver.findElement(By.xpath(".//*[@id='photoimg']")).click();

Paso 6) Espere a que aparezca la ventana emergente. El método de espera se utiliza para controlar la demora asociada con la apertura de la ventana emergente después de hacer clic en el botón Explorar.

s.wait(fileInputTextBox, 20);

Paso 7) Escriba la ruta del archivo en el cuadro de texto del archivo de entrada y haga clic en el botón Abrir

s.type(fileInputTextBox, inputFilePath + "Test.docx");
s.click(openButton);

Paso 8) Cerrar el navegador

driver.close();

Resultado

Inicialmente, el script abre el navegador Chrome.

El navegador Chrome se abrió en la página de carga de archivos de demostración al inicio de la ejecución.

Haga clic en el botón "Seleccionar archivo" y aparecerá la ventana emergente de archivos de Windows. Ingrese los datos en el cuadro de texto de entrada de archivo y haga clic en el botón "Abrir".

Windows Ventana emergente de archivo con la ruta del archivo escrita en el cuadro de texto de entrada de archivo.

La siguiente pantalla se muestra una vez que se completa la carga del archivo y se cierra el navegador.

Página de demostración que confirma que la carga se ha completado justo antes de que se cierre el navegador.

Dado que la coincidencia depende de los píxeles, es necesario volver a capturar cada imagen de referencia cada vez que se rediseñe la interfaz. Esta fragilidad es la razón por la que los equipos reservan Sikuli para ventanas emergentes. Manejo de archivos WebDriver estándar no puedo alcanzar.

Preguntas Frecuentes

La imagen de referencia no coincidió en pantalla. Las causas habituales son una resolución diferente, una imagen redimensionada, un tema modificado o que el elemento aún no sea visible. Vuelva a capturar la imagen con la resolución de ejecución o con una similitud menor.

Selenium Sikuli controla el DOM del navegador mediante localizadores. Sikuli controla la pantalla mediante capturas de pantalla, por lo que accede a diálogos nativos que el DOM nunca expone. Ambos se utilizan conjuntamente.

Sí. Declarar com.sikulix:sikulixapi como dependencia y Maven obtiene la misma API, keeping la versión en el archivo de compilación en lugar de una Eclipse construir ruta.

Sí, SikuliX se ejecuta en Windows, Linux y macOSLas imágenes de referencia no son compatibles entre ellas, ya que la decoración y las fuentes difieren, por lo que cada plataforma necesita sus propias capturas.

Los sistemas de aprendizaje automático toleran cambios de color, escala y tema que la comparación de píxeles no puede detectar, y pueden encontrar un control por su etiqueta. Esto reduce el trabajo de recuperación necesario después de un rediseño.

Copiloto de GitHub Borradores de llamadas a Screen y Pattern y la configuración de WebDriver en torno a ellas. No puede capturar los archivos PNG, por lo que debe verificar la ruta de cada imagen generada.

La coincidencia falla cuando se rediseña la interfaz o cambia la resolución, es más lenta que la automatización del DOM e informa los fallos con menos claridad. Es adecuada para interfaces que cambian con poca frecuencia.

El proyecto de investigación original de Sikuli no lo es, pero su sucesor sí. SikuliX es y publica el artefacto sikulixapi utilizado aquí. Los artículos que citan archivos JAR de sikuli-script simples describen la línea anterior.

Resumir este post con: