Winium automatizando testes DeskTop com Selenium



  • De repente me deparo com um cenário diferente, novo emprego cheio de desafios e oportunidades. Ocasião de exercer e executar minha maior paixão que é a de automatizar testes.

    Primeiro desafio, nos últimos 8 anos trabalhei com equipes de desenvolvedores Java, eis que minha nova equipe só possui Dev’s C#. Então seguindo as boas práticas onde o QA deve falar a mesma língua da equipe vamos aprender Selenium com C#! Mas isso é assunto pra um próximo artigo.

    O Desafio que vou compartilhar aqui é a necessidade de automatizar para aplicações Desktop. Pesquisei e encontrei ferramentas bem interessantes como Autoit, Sikuli…

    Mas será que não dá pra automatizar desktop usando o glorioso Selenium?

    Foi ai que conheci o Winium Uma ferramenta Open Source mantida pela 2GIS para automação de aplicativos desktop. Que veio oferecer através do seu Driver suporte para aplicações Windows. Com ela podemos escrever testes em qualquer linguagem de programação que seja suportada pelo Webdriver e ela oferece suporte para Aplicativos do Windows Desktop (WPF, WinForms) entre outros como aplicação mobile para Windowsphone.

    Neste Post, estarei mostrando como automatizar uma operação simples na calculadora do Windows.
    Primeiro vamos fazer o download do Winium Driver,
    https://github.com/2gis/Winium.Desktop/releases
    É necessário também o uso de uma ferramenta que nos apontará qual Locator (elementos da tela) que deveremos usar nos testes com Selenium. Testei 3 ferramentas, o

    Mãos a massa!

    Crie uma classe de test no Visual studio ;
    Crie a propiedade RemoteWebDriver
    public RemoteWebDriver Driver { get; set; }

    Para iniciar é necessário chamar o navegador do Winium criaremos então o método SetUp assim:

    public void SetUp()
            {
                var dc = new DesiredCapabilities();
                dc.SetCapability("app", @"C:\Windows\System32\calc.exe");
                this.Driver = new RemoteWebDriver(new Uri("http://localhost:9999"), dc);
    }
    

    Para o tearDow podemos usar método close do Selenium webdriver.

    [TearDown]
           public void after()
           {
               Driver.Close();
           }
    

    Vamos Agora começar a inspecionar as janelas abertas para isso abra o UISpy;

    0_1488551144019_2017-03-02_083559artigo1.png

    Observe que o UISpy exibe todas as janelas abertas entre elas esta a calculadora , que será o aplicativo que iremos testar.
    Navegando na Treeview encontraremos os elementos no painel properties na lateral direita. Para automatizar o teste podemos passar o AutomationID ou o Name.

    0_1488551185072_2017-03-02_092710a3.png

    Observe que para o numero “2” o Name é “2” e o AutomationID é “132”.Dessa forma vamos fazer o método de teste somando 2 + 2;

    [Test]
            public void Calcular()
            {
    
                Driver.FindElement(By.Id("132")).Click();
                Driver.FindElement(By.Id("93")).Click();
                Driver.FindElement(By.Name("2")).Click();
                Driver.FindElement(By.Name("Igual a")).Click();
                Thread.Sleep(2000);
                Assert.AreEqual(true, Driver.FindElement(By.Name("4")).Displayed);
               
                
            }
    

    Para executar o teste é preciso que o driver do Winium esteja rodando, Descompacte o Driver baixado no início deste artigo e execute.
    0_1488551062888_2017-03-02_150858a4.png

    Agora é so rodar o teste .



  • Ótimo Tutorial, parabéns.



  • Excelente, faz tempo que procuro algo do tipo.



  • @bruwesley , Obrigado pelo feedback!


  • ADM

    Boa @Fernando-Pimentel eu vejo bastante gente perguntando sobre isso, já é um ponta pé inicial para os interessados(as).



  • Excelente artigo!

    Apenas complementando, atentem-se de utilizar o package “using OpenQA.Selenium.Remote;” para rodar certinho ;)



  • @Fernando-Pimentel muito bom.



  • Obrigado @Fred-Moreira ,@CarolCiola e @Rafael-Chiavegatto , esses Feedbacks são muito importantes para publicação de novos posts. abraço!



  • @Fernando-Pimentel pelo que percebi o AutomationId gera um número diferente a cada vez que abrimos o UISpy, já o Name não. Creio que por conta disso, a utilização do Name seja melhor, correto?



  • @CarolCiola , é um cuidado que se pode tomar, entretanto a aplicação que estou automatizando não deparei com essa mudança de Id’s . Mas acredito que seja uma pratica eficiente , alinhar com os Dev’s quanto a colocação de names e usar os mesmos.



  • Ótimo post @Fernando-Pimentel, de grande valia.
    Porém sobre a ferramenta UISpy, o site da microsoft informa que é obsoleto e não está mais dispon´vel, sendo substituída pelo Inspect.exe.



  • Obrigado ´pelo FeedBack @Paulo-Gonçalves , apesar da microsoft ter descontinuado ela ainda é a que melhor me atende , no github do winium eles disponibilizam a ferramenta para dowload

    https://github.com/2gis/Winium.Cruciatus/tree/master/tools/UISpy



  • Tenho uma duvida, comparando o Winnium com o appium desktop vocês teriam um Prós e Contras?



  • @Fernando-Pimentel, excelente artigo.



  • Pergunta @Fernando-Pimentel você tem algum exemplo de utilização de menus e submenus?



  • @Fernando-Pimentel muito útil o artigo, obrigado por compartilhar!



  • Que bom que gostou @bredah !



  • Ótimo post sobre o Winium estava na pesquisa há algum tempo, gostaria de tirar uma dúvida. Aqui na empresa utilizamos um projeto java com a implementação do Selenium WebDriver e estou em um novo projeto onde um fluxo web termina com as informações em uma aplicação desktop. Gostaria de saber se a utilização do Winium com o java e os elementos WebDriver ele funciona corretamente ?



  • Olá @fernando-pimentel . Obrigado por compartilhar conosco o teu conhecimento!
    Falando sobre o método Calcular(), pelo que eu pude entender, o “Displayed” ele localiza qualquer coisa que tenha o nome “4” e retorna TRUE se localizado. No exemplo demonstrado, ele está retornando TRUE pois ele encontrou o botão 4 do teclado da calculadora. Pois bem, se eu alterar a linha para Assert.AreEqual(true, Driver.FindElement(By.Name(“0”)).Displayed); ele também retornará TRUE, pois também encontrou o botão 0 do teclado da calculadora.

    Estou usando o Win10 em pt, a solução que eu achei para este método foi este:

        [Test]
        public void TesteCalculoDoisMaisDois()
        {
    
            Driver.FindElement(By.Name("Dois")).Click();    //Botão 2
            Driver.FindElement(By.Name("Mais")).Click();    //Botão +
            Driver.FindElement(By.Name("Dois")).Click();    //Botão 2
            Driver.FindElement(By.Name("Igual a")).Click(); //Botão Igual
            Thread.Sleep(2000); //aguarde 2 segundos
            Assert.AreEqual(true, Driver.FindElement(By.Name("Exibição é 4")).Displayed); // Verifica se o resultado 
              //é 4 e retorna TRUE, senão false
             //Onde o "Exibição é" é o nome do meu campo resultado.
        }
    

    Ainda atua com Teste Automatizado com aplicações desktop? Se sim, recomenda algum curso online?
    Estou começando os meus estudos em Teste Automatizado e ainda tenho muito que aprender :D
    Obrigado novamente!


  • MVP

    @alissonkissel O elemento já é procurado por nome, isso já deixa a asserção já um pouco fraca. No caso tu reforçou ela um pouco mais…Acho que talvez procurar a tela onde é informado isso e depois procurar um “locator filho” podia deixar um pouco menos dependente a texto…Mas não né… as vezes não tem como…heehhee