Tutorial Sikuli para Selenium Completa

⚡ Resumo Inteligente

O Sikuli automatiza uma interface gráfica reconhecendo capturas de tela armazenadas em vez de localizadores, o que permite que um Selenium Faça um test drive no Windows Janelas pop-up, diálogos de arquivos nativos e objetos Flash que o WebDriver sozinho não consegue acessar.

  • 🔘 Ideia central: Cada elemento é armazenado como um PNG, e o Sikuli o encontra comparando pixels na tela.
  • ☑️ Configuração: Adicionar o SikuliX API JAR para o Java construir caminho ao lado do Selenium JARs.
  • Classe de tela: Oferece opções de clique, clique duplo, digitação, passar o cursor e localizar, cada uma delas aceitando o nome da imagem.
  • 🧪 Classe de padrão: Envolve um caminho de imagem e ajusta a correspondência através de similar() e exact().
  • 🛠️ Exemplo resolvido: No teste do Chrome, o usuário clica em "Escolher arquivo", depois o Sikuli digita o caminho e clica em "Abrir".
  • ⚙️ Limitação: Uma alteração na resolução ou no tamanho do pixel interrompe a correspondência e gera uma exceção FindFailed.

Tutorial Sikuli para Selenium Completa

Em que está Sikuli Selenium?

Sikuli é uma ferramenta de automação de teste baseada em GUI de código aberto. É usado principalmente para interagir com elementos de páginas da web e lidar com pop-ups baseados em janelas. Sikuli usa a técnica de “Reconhecimento de imagem” e “GUI de controle” para interagir com elementos de páginas da web e janelas pop-up. No Sikuli, todos os elementos da web são tomados como imagens e armazenados dentro do projeto.

⚠️ Nota sobre a nomenclatura: O projeto é mantido até hoje como SikuliX, publicado no Maven Central como com.sikulix:sikulixapiOs nomes das classes abaixo permanecem inalterados.

Como usar Sikuli com Selenium Driver da Web

Sikuli pode ser integrado com Selenium WebDriver usando o arquivo JAR do Sikuli, nos dois passos abaixo.

Etapa 1) Baixar o arquivo JAR do Sikuli abaixo URLe extracExtraia o conteúdo do arquivo ZIP para uma pasta.

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

Passo 2) Crie um novo projeto JAVA em Eclipse Adicione o arquivo JAR ao caminho de construção, juntamente com os arquivos JAR do Selenium, clicando com o botão direito do mouse no projeto -> Caminho de Construção -> Configurar Caminho de Construção, conforme mostrado abaixo.

Arquivo JAR do Sikuli adicionado ao Java caminho de construção em Eclipse Configurar caminho de construção

Depois de adicionar o arquivo JAR ao caminho de construção do projeto, as classes fornecidas pelo Sikuli podem ser usadas. Um projeto Maven pode declarar o mesmo artefato como uma dependência.

Aula de tela em Sikuli

A classe `Screen` é a classe base para todos os métodos fornecidos pelo Sikuli. A classe `Screen` contém métodos predefinidos para todas as operações comuns realizadas em elementos da tela, como clique, clique duplo, entrada em uma caixa de texto, passar o mouse sobre um elemento, etc. Abaixo está a lista dos métodos mais usados ​​da classe `Screen`.

Forma Descrição Sintaxe
Clique Este método é usado para clicar em um elemento da tela usando o nome da imagem como parâmetro.

Tela s = new Tela();

s.click(“QA.png”);

Duplo click Este método é usado para clicar duas vezes em um elemento. Aceita o nome da imagem como parâmetro.

Tela s = new Tela();

s.doubleClick(“QA.png”);

Formato Este método é usado para fornecer valor de entrada a um elemento. Aceita o nome da imagem e o texto a serem enviados como parâmetros.

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

Pairar Este método é usado para passar o mouse sobre um elemento. Aceita o nome da imagem como parâmetro.

s.hover(“QA.png”);

Encontre Este método é usado para localizar um elemento específico na tela. Aceita o nome da imagem como parâmetro.

s.find(“QA.png”);

Classe de padrão em Sikuli

Enquanto a classe `Screen` atua sobre um nome de imagem simples, a classe `Pattern` é usada para associar o arquivo de imagem a atributos adicionais que identificam o elemento de forma única. Ela recebe o caminho da imagem como parâmetro.

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

A seguir estão os métodos mais comumente usados ​​da classe Pattern.

Forma Descrição Sintaxe
getNomeArquivo Retorna o nome do arquivo contido no objeto Pattern.

Padrão p = novo Padrão(“D:\Demo\QA.png”);

String nome do arquivo = p.getFileName();

semelhante Este método retorna um novo objeto Pattern com similaridade definida para um valor especificado. Aceita o valor de similaridade entre 0 e 1 como parâmetro. Sikuli procura todos os elementos que estão dentro do intervalo de similaridade especificado e retorna um novo objeto padrão.

Padrão p1 = p.similar(0.7f);

Exato Este método retorna um novo objeto padrão com similaridade definida como 1. Ele procura apenas uma correspondência exata do elemento especificado.

Padrão p1 = p.exato();

Code Exemplo de upload de arquivos usando Sikuli

O código abaixo explica o uso do Sikuli para upload de arquivos no 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 Explicação

Passo 1) A primeira instrução envolve definir o caminho executável do driver para o Chrome.

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

⚠️ Nota de versão: Selenium 4 resolve o binário do driver através de Selenium Gerente, então esta linha agora é opcional. Ela será mantida como está escrita na fonte.

Passo 2) Use uma ferramenta de captura de tela como Snipping Tool para tirar screenshots do popup do Windows 'FileTextBoxe o botão 'Abrir', como abaixo.

Snipping Tool seleção sobre o Windows caixa de texto para entrada de arquivo na janela pop-up de upload

A sua captura de tela deverá ter esta aparência:

Texto do arquivo capturadoBox e imagens de referência OpenButton usadas pelo script Sikuli

As imagens para a caixa de texto de entrada de arquivo do Windows e o botão Abrir são armazenadas em 'FileTextBox.PNG' e 'OpenButton.PNG'.

Exemplo: Se você deseja automatizar a operação de abertura do bloco de notas, então você precisa armazenar a imagem de um ícone da área de trabalho para o bloco de notas em um arquivo PNG e realizar a operação de clique nele.

No nosso caso, ele reconhece a caixa de texto de entrada de arquivo e o botão Abrir. Windows popup usando as imagens armazenadas. Se a resolução da tela mudar da captura de imagem para a execução do script de teste, o comportamento do Sikuli seria inconsistente. Portanto, é sempre aconselhável executar o script de teste na mesma resolução em que as imagens são capturadas. A alteração no tamanho do pixel das imagens fará com que o Sikuli lance uma exceção FindFailed.

Passo 3) As próximas instruções incluem a criação de objetos para as classes Screen e Pattern. Crie um novo objeto de tela. Defina o caminho do arquivo que deseja carregar como parâmetro para o objeto Padrão.

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

Passo 4) As instruções abaixo envolvem a abertura do navegador Chrome com o URL de um aplicativo de demonstração para upload de arquivos: https://demo.guru99.com/test/image_upload/index.php

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

Passo 5) Clique no botão escolher arquivo usando a instrução abaixo

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

Passo 6) Aguarde o pop-up do Windows aparecer. O método Wait é usado para lidar com o atraso associado à abertura de janelas pop-up após clicar no botão navegar.

s.wait(fileInputTextBox, 20);

Passo 7) Digite o caminho do arquivo na caixa de texto do arquivo de entrada e clique no botão Abrir

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

Passo 8) Feche o navegador

driver.close();

saída

Inicialmente, o script abre o navegador Chrome

O navegador Chrome foi aberto na página de upload do arquivo de demonstração no início da execução.

Ao clicar no botão 'Escolher arquivo', a tela pop-up do arquivo do Windows aparecerá. Insere os dados na caixa de texto de entrada de arquivo e clica no botão 'Abrir'

Windows Uma janela pop-up exibe o caminho do arquivo digitado na caixa de texto de entrada de arquivo.

A tela abaixo é exibida quando o upload do arquivo é concluído e o navegador fecha

Página de demonstração confirmando que o upload foi concluído pouco antes do navegador ser fechado.

Como a correspondência depende de pixels, é necessário capturar novamente cada imagem de referência sempre que a interface for reestilizada. Essa fragilidade é o motivo pelo qual as equipes reservam o Sikuli para pop-ups. manipulação de arquivos WebDriver simples não pode alcançar.

Perguntas Frequentes

A imagem de referência não foi encontrada na tela. As causas mais comuns são uma resolução diferente, uma imagem redimensionada, um tema com novo estilo ou o elemento ainda não estar visível. Tente capturar novamente na resolução atual ou com uma similaridade menor.

Selenium O navegador interage com o DOM por meio de localizadores. O Sikuli interage com a tela por meio de capturas de tela, permitindo o acesso a diálogos nativos que o DOM nunca expõe. Os dois são usados ​​em conjunto.

Sim. Declare com.sikulix:sikulixapi como uma dependência e o Maven utiliza a mesma API, continueping a versão no arquivo de compilação em vez de um Eclipse caminho de construção.

Sim, SikuliX corre em Windows, Linux e macOSAs imagens de referência não são facilmente transferíveis entre plataformas, pois as decorações e as fontes diferem, sendo necessário capturar cada uma delas separadamente.

Os mecanismos de aprendizado de máquina toleram mudanças de cor, escala e tema que a comparação de pixels não consegue, e podem encontrar um controle pelo seu rótulo. Isso reduz o trabalho de recaptura necessário após uma reformulação.

Copiloto do GitHub Rascunhos de chamadas de tela e padrão e a configuração do WebDriver em torno delas. Não é possível capturar arquivos PNG, portanto, verifique o caminho de cada imagem gerada.

A correspondência de erros falha quando a interface é reestilizada ou a resolução muda, é mais lenta que a automação do DOM e reporta falhas de forma menos clara. É adequada para interfaces que mudam raramente.

O projeto de pesquisa original de Sikuli não é, mas sim o seu sucessor. SikuliX é e publica o artefato sikulixapi usado aqui. Artigos que citam JARs sikuli-script simples descrevem a linha anterior.

Resuma esta postagem com: