logar fora do dom ‐ autentiticar usuario de rede fora do dom utilizando um robo - sandersbr/automacao-selenium GitHub Wiki

  1. robô simples
  2. robô complexo
  3. robô que armazena login e senha em uma variável e cola ao invés de digitas

1. robô simples


import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class FormularioTest {

    @Test
    public void TestarElementosDoFormulario() throws Exception {

        System.setProperty("webdriver.chrome.driver", "C:/driver/chromedriver.exe");
        WebDriver navegador = new ChromeDriver();
        navegador.get("https://the-internet.herokuapp.com/basic_auth");

        // Aguarda um pouquinho para o popup aparecer
        Thread.sleep(2000);

        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_A);
        robot.keyPress(KeyEvent.VK_D);
        robot.keyRelease(KeyEvent.VK_D);
        robot.keyPress(KeyEvent.VK_M);
        robot.keyRelease(KeyEvent.VK_M);
        robot.keyPress(KeyEvent.VK_I);
        robot.keyRelease(KeyEvent.VK_I);
        robot.keyPress(KeyEvent.VK_N);
        robot.keyRelease(KeyEvent.VK_N);

        // Pressiona Tab para ir para o campo de senha
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);

        robot.keyPress(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_A);
        robot.keyPress(KeyEvent.VK_D);
        robot.keyRelease(KeyEvent.VK_D);
        robot.keyPress(KeyEvent.VK_M);
        robot.keyRelease(KeyEvent.VK_M);
        robot.keyPress(KeyEvent.VK_I);
        robot.keyRelease(KeyEvent.VK_I);
        robot.keyPress(KeyEvent.VK_N);
        robot.keyRelease(KeyEvent.VK_N);

        // Pressiona Enter
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);
    }
}


2. robô complexo


import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class CadastrarConvenioBancarioTest {
    
    /*
     * - incluir a anotação @Test e incluir o import se necessário;
     * - criar metodo de test 
     *     exemplo
     *     testCalcularValorCorreto
     *     test[NomeDaClasseOuMetodo]_[CasoDeTeste]
     *     abrir e fechar chaves
     *  
     * - informar o diretório do chromedriver.exe
     * - instanciar o navegador chrome e incluir o import se necessário;
     * - informar a url dos site ou arquivo que irá acessar
     * - chamar o robot para realizar a autenticacao de rede
     *   armazena o usuario
     *   armazena a senha
     *   cria o metodo para digitar
     *   digita o usuario
     *   pressiona o tab
     *   despressiona o tab
     *   digita a senha
     *   pressiona o tab
     *   despressiona o tab
     *   pressione o enter
     *   despressiona o enter     *   
     * - chamar o driver ralizar a realizar a autenticação no sistema
     *   procura o elemento pelo atributo e incluir o import se necessário, e escreve;
     *   procura o elemento pelo atributo e incluir o import se necessário, e escreve;
     *   
     *  
     *    
     * acessar a url
     */
    
    WebDriver driver;
    
    @Before
    public void SetUp() throws AWTException, InterruptedException {        
      
     // Caminho para o chromedriver. O código abaixo deve ser ajustado para o local correto do seu chromedriver.
        System.setProperty("webdriver.chrome.driver","C:/driver/chromedriver.exe");
        
     // Inicializa o WebDriver para o Chrome        
        driver = new ChromeDriver();
     
     // Espera implicita de 5 segundos  
     // O controlador deve sondar a página até que o elemento tenha sido encontrado ou este tempo limite expire antes de lançar uma NoSuchElementException.
        driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);

     // Acessa a página de login do sistema
        //driver.get("https://grpforfcprodmirror.sefin.fortaleza.ce.gov.br/grpforfc/");
        driver.get("http://localhost:8080/grpforfc/");        
        driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);

        
        //-------------------------------------------------------------------------------------------
        // AUTENTICAÇÃO DE REDE - informar login e senha de rede        
        //-------------------------------------------------------------------------------------------
        
        // Inicializa o objeto Robot, que será usado para simular as ações do teclado
           Robot robot = new Robot();   
        
        // Defina o nome de usuário e senha para autenticação
           String usuario = "t0665773";   
           String senha = "#S@ndersbr12";
        
        // Digita o nome de usuário no campo de autenticação
           digitar(robot, usuario);
        
        // Pressiona TAB para mover o foco para o campo de senha
           robot.keyPress(KeyEvent.VK_TAB);
           robot.keyRelease(KeyEvent.VK_TAB);
           Thread.sleep(1000); // Dá um tempo para o foco mudar

        // Digita a senha no campo de autenticação
           digitar(robot, senha);

        // Pressiona TAB para mover o foco para o botão "Fazer login"
           robot.keyPress(KeyEvent.VK_TAB);
           robot.keyRelease(KeyEvent.VK_TAB);
           Thread.sleep(500); 
        
        // Pressiona ENTER para submeter o formulário de login
           robot.keyPress(KeyEvent.VK_ENTER);
           robot.keyRelease(KeyEvent.VK_ENTER);

        // Espera a resposta do sistema (tempo suficiente para login ser processado)
           Thread.sleep(3000);
        
        //-------------------------------------------------------------------------------------------
        // realizar autenticação do sistema
        // informar login e senha de rede        
        //-------------------------------------------------------------------------------------------       
        
    }
    
    @After
    public void tearDown() {
        
        //Fechar o navegador
        //driver.quit();
        
    }
    
    @Test
    public void test(){
        
     // informa o login do usuario do sistema   
        driver.findElement(By.id("username")).sendKeys("66969050300");
        
     // informa a senha do usuario do sistema
        driver.findElement(By.id("password")).sendKeys("@dmin123");
        
     // clica no botão entrar (para inicia autenticação do usuário informado)             
        driver.findElement(By.id("botao-entrar")).click();
        
     // Selecionar uma unidade funcional
        /*
         * o elemento é um combobox (caixa de seleção html)
         * o elemento é localizado, é identificado e coletato o atributo único (no caso o id)
         * é instanciado um objeto Select em que no construto foi passado o combo 
         * em seguida selecionado a opção do combo (caixa de seleção html) 
         */
        
        WebElement elemento = driver.findElement(By.id("formSelecionarUnidadeFuncional:unidadeFuncionalDecorate:uf"));
        
        Select combo = new Select(elemento);
        //combo.selectByIndex(2);
        //combo.selectByValue("superior");
        combo.selectByVisibleText("SEFIN - CEDES");
        //combo.selectByVisibleText("SEFIN - ATENDTRIB");
        
        driver.findElement(By.id("formSelecionarUnidadeFuncional:unidadeFuncionalDecorate:botaoSelecionarUnidade")).click();
        
        //cadastro basico // //*[@id="formMenuTopo:menuCadastrosBasicos:cadastrosBasicos"]/div[1]
        

        //convenio bancario
        
        
    }
    
  //---------------------------------------------------------------------------------------------
 // ABAIXO: FUNÇÕES 
 //---------------------------------------------------------------------------------------------    

     // Função para digitar o texto utilizando o Robot
     private void digitar(Robot robot, String texto) throws InterruptedException {
         // Itera sobre cada caractere do texto fornecido
         for (char c : texto.toCharArray()) {
             switch (c) {
                 // Processa os caracteres especiais que requerem SHIFT (ex: !, @, #, etc.)
                 case '!':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_1);
                     robot.keyRelease(KeyEvent.VK_1);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '@':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_2);
                     robot.keyRelease(KeyEvent.VK_2);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '#':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_3);
                     robot.keyRelease(KeyEvent.VK_3);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '$':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_4);
                     robot.keyRelease(KeyEvent.VK_4);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '%':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_5);
                     robot.keyRelease(KeyEvent.VK_5);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '&':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_7);
                     robot.keyRelease(KeyEvent.VK_7);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '*':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_8);
                     robot.keyRelease(KeyEvent.VK_8);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '(':
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_9);
                     robot.keyRelease(KeyEvent.VK_9);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case ')':
                     // Quando pressionado SHIFT + 0, exibe o caractere ')'
                     robot.keyPress(KeyEvent.VK_SHIFT);
                     robot.keyPress(KeyEvent.VK_0);
                     robot.keyRelease(KeyEvent.VK_0);
                     robot.keyRelease(KeyEvent.VK_SHIFT);
                     break;
                 case '0':
                     // Corrigido: digita '0' sem SHIFT
                     robot.keyPress(KeyEvent.VK_0);
                     robot.keyRelease(KeyEvent.VK_0);
                     break;
                 // Processa os caracteres especiais 'ç' e 'Ç' utilizando teclas ALT
                 case 'ç':
                     digitarCedilhaMinusculo(robot);
                     break;
                 case 'Ç':
                     digitarCedilhaMaiusculo(robot);
                     break;
                 // Processa os demais caracteres (alfabéticos e números)
                 default:
                     boolean upperCase = Character.isUpperCase(c);
                     int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);

                     // Verifica se o código da tecla é indefinido
                     if (keyCode == KeyEvent.VK_UNDEFINED) {
                         throw new RuntimeException("Não sei digitar o caractere: " + c);
                     }

                     // Se o caractere for maiúsculo, pressiona SHIFT antes
                     if (upperCase) {
                         robot.keyPress(KeyEvent.VK_SHIFT);
                     }

                     robot.keyPress(keyCode);
                     robot.keyRelease(keyCode);

                     // Solta o SHIFT se for maiúsculo
                     if (upperCase) {
                         robot.keyRelease(KeyEvent.VK_SHIFT);
                     }
                     break;
             }
             // Pausa entre cada caractere digitado para evitar problemas de sincronização
             Thread.sleep(100);
         }
     }

     // Digita o 'ç' minúsculo utilizando ALT + código numérico (0231)
     private void digitarCedilhaMinusculo(Robot robot) throws InterruptedException {
         robot.keyPress(KeyEvent.VK_ALT);
         digitarNumPad(robot, 0);
         digitarNumPad(robot, 2);
         digitarNumPad(robot, 3);
         digitarNumPad(robot, 1);
         robot.keyRelease(KeyEvent.VK_ALT);
         Thread.sleep(200);
     }

     // Digita o 'Ç' maiúsculo utilizando ALT + código numérico (0199)
     private void digitarCedilhaMaiusculo(Robot robot) throws InterruptedException {
         robot.keyPress(KeyEvent.VK_ALT);
         digitarNumPad(robot, 0);
         digitarNumPad(robot, 1);
         digitarNumPad(robot, 9);
         digitarNumPad(robot, 9);
         robot.keyRelease(KeyEvent.VK_ALT);
         Thread.sleep(200);
     }

     // Função auxiliar para digitar um número no teclado numérico (usado para os caracteres especiais como ç e Ç)
     private void digitarNumPad(Robot robot, int numero) throws InterruptedException {
         int keyCode;
         switch (numero) {
             case 0: keyCode = KeyEvent.VK_NUMPAD0; break;
             case 1: keyCode = KeyEvent.VK_NUMPAD1; break;
             case 2: keyCode = KeyEvent.VK_NUMPAD2; break;
             case 3: keyCode = KeyEvent.VK_NUMPAD3; break;
             case 4: keyCode = KeyEvent.VK_NUMPAD4; break;
             case 5: keyCode = KeyEvent.VK_NUMPAD5; break;
             case 6: keyCode = KeyEvent.VK_NUMPAD6; break;
             case 7: keyCode = KeyEvent.VK_NUMPAD7; break;
             case 8: keyCode = KeyEvent.VK_NUMPAD8; break;
             case 9: keyCode = KeyEvent.VK_NUMPAD9; break;
             default: throw new IllegalArgumentException("Número não suportado: " + numero);
         }

         robot.keyPress(keyCode);
         robot.keyRelease(keyCode);
         Thread.sleep(100);
     }
    
}


3. robô que armazena login e senha em uma variável e cola ao invés de digitas


import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

public class FormularioTest {

    public void colarComRobot(Robot robot, String texto) throws Exception {
        // Copia a string para a área de transferência
        StringSelection selecao = new StringSelection(texto);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selecao, null);

        // Ctrl + V
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);

        Thread.sleep(500); // pausa para garantir que o texto seja colado
    }

    @Test
    public void TestarElementosDoFormulario() throws Exception {
        System.setProperty("webdriver.chrome.driver", "C:/driver/chromedriver.exe");
        WebDriver navegador = new ChromeDriver();
        navegador.get("https://the-internet.herokuapp.com/basic_auth");

        Thread.sleep(2000); // Espera o popup

        Robot robot = new Robot();

        // Cola o usuário
        colarComRobot(robot, "admin");

        // Tab para ir para o campo de senha
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);
        Thread.sleep(500);

        // Cola a senha
        colarComRobot(robot, "admin");

        // Pressiona Enter
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);
    }
}