[AJUDA] Selenium WebDriver - C# Windows Form

371 views
Skip to first unread message

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 9:23:08 AM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Bom dia pessoal,

Estou desenvolvendo uma aplicação para realizar testes de regressão em um de nossos sistemas.
Construí a aplicação em C# utilizando o Selenium WebDriver e juntamente uma interface em windows form para que outras pessoas pudessem executar e coletar os dados que são gerados.

Antes de tudo, desenvolvi a mesma aplicação em Java e funcionou em outros computadores normalmente.
Agora que troquei para o C# a aplicação não está executando em outros computadores (só funciona no meu).

Eu acredito estar faltando algum componente do tipo [Server] do Selenium para executar em computadores de terceiro. 
Alguém que já tentou fazer algo do tipo, e se deparou com o problema, poderia me auxiliar?!

As telas de falhas são:

Jonathan Machado

unread,
Oct 2, 2015, 9:33:22 AM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Opa, não conheço muito bem C#, mas pela mensagem que você capturou, não foi possível localizar o elemento de id igual a "txtUSER". Não seria algum problema referente ao elemento ainda não estar na tela quando vc tenta encontrar? Utilizando um wait não resolveria ?

Passei por situação semelhante durante uns testes que realizei. Na minha empresa, o código funcionava. Em minha casa não. Fui ver, o problema era porque na minha casa a internet é mais lenta e demorava demais para exibir o componente que eu estava "buscando". Configurei um wait de 15 segundos e funcionou.

Abraços.

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 11:10:40 AM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Então.

Coloquei mais de 30 segundos de espera, mas ele não encontra... 

Quando executado, ele abre o navegador e insere o link para acessar, neste momento de inserir o link é que da o erro.
Se eu rodar o aplicativo e inserir manualmente o link e inserir login e senha, o aplicativo consegue funcionar... Ou seja, ele não está conseguindo inserir o link por não estar encontrando o navegador talvez. 

O problema de tempo, acredito que não seja :(

Jonathan Machado

unread,
Oct 2, 2015, 12:49:46 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Estranho estar dando o erro no momento de inserir o link de acesso à aplicação, pois o erro está ocorrendo em função de não encontrar o txtUSER... Tem como postar o código onde está dando o erro?

Eduardo Brusch

unread,
Oct 2, 2015, 1:02:19 PM10/2/15
to guts-rs...@googlegroups.com

Oi,

Pelo stack trace ali vc tá chamando diretamente o findelement dentro de um método de login. O mais adequado eh criar um método que espera até o elemento ficar presente. Tem varoas formas de fazer, mas segue uma dica.

http://stackoverflow.com/questions/6992993/selenium-c-sharp-webdriver-wait-until-element-is-present

--
Você recebeu esta mensagem porque está inscrito para o Google
Grupos "Grupo de Usuarios de Teste de Software - SUCESU-RS" grupo.

Para postar neste grupo, envie um email para guts-rs...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
guts-rs-suces...@googlegroups.com
Para mais opções, visite este grupo em
http://groups.google.com/group/guts-rs-sucesu?hl=pt?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para guts-rs-suces...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 1:43:56 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Opa, vou postar aqui o pedaço onde ele faz(tenta) fazer o login:

            //cria o driver
            FirefoxDriver driver = new FirefoxDriver();
            Thread.Sleep(2000);
            driver.Manage().Window.Maximize();
            //tenta inserir o link de acesso
            Elemento(driver, link);
            driver.Manage().Window.Maximize();
           
            if (acessou == true)
            {
                try
                {
                    Espera("txtUSER", driver);
                    driver.FindElementById("txtUSER").SendKeys(id);

                    Espera("txtPassWord", driver);
                    driver.FindElementById("txtPassWord").SendKeys(senha);

                    Espera("btnLogin", driver);
                    driver.FindElementById("btnLogin").Click();
                }
                catch (NoSuchElementException e)
                {
                    MessageBox.Show("Ocorreu uma exceção: " + e);
                }
            }
            else
            {
                MessageBox.Show("Não é possível prosseguir com a aplicação!");
            }

método Elemento:

        public Boolean Elemento(FirefoxDriver driver, string link)
        {
            try
            {
                driver.Navigate().GoToUrl(link);
                acessou = true;
                return true;
            }
            catch (NoSuchElementException e)
            {
                MessageBox.Show("Ocorreu uma exceção: " + e);
                acessou = false;
                return false;
            }
        }

Lembrando que por algum motivo no meu pc, funciona normalmente... Em questão de espera, coloquei 3 minutos já, e ele não consegue inserir o link.

Agora eu estou abrindo o Selenium RC nos computadores de terceiros, mas não funciona do mesmo jeito.

Stefan Teixeira

unread,
Oct 2, 2015, 2:10:10 PM10/2/15
to guts-rs...@googlegroups.com
Thiago, o que o método "Espera" faz? Coloca o código dele, por favor.

Abs

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 2:13:15 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Aqui:

       public void Espera(String what, FirefoxDriver driver)
       {
           int timeOut = 10;
           new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)).Until(ExpectedConditions.ElementExists((By.Id(what))));
       }


Jônatas Kirsch

unread,
Oct 2, 2015, 2:13:35 PM10/2/15
to guts-rs...@googlegroups.com

Olá,

1. Como o seu método "Espera" está esperando o WebElement?
Espera(String id, WebDriver driver)

2. Na espera, o driver está sendo instanciado na classe novamente ou a classe faz um extends de outra que contém o WebDriver instanciado?

Stefan Teixeira

unread,
Oct 2, 2015, 2:20:00 PM10/2/15
to guts-rs...@googlegroups.com
Thiago, depois que você instanciar o driver, adiciona uma espera implícita com um tempo razoável (sei lá, 15s) e vê se resolve.

driver.Manage().Timeouts().ImplicitlyWait()

PS: vê em C# como é a sintaxe certinha, provavelmente vc deve usar esse TimeSpan pra dizer quantos segundos.


Abs

Jonathan Machado

unread,
Oct 2, 2015, 2:20:02 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
o meu problema, resolvi com o seguinte comando:


new WebDriverWait(driver,15).until(ExpectedConditions.visibilityOfElementLocated(By.id(id_do_elemento)


Porém utilizo o Selenium WebDriver, acho que tem diferença pro Selenium RC......

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 2:20:24 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Neste método, ela recebe por parâmetro o driver já criado, ele é passado na parte principal do código....

Criei hoje está forma de espera, a outra que existia era feita de forma mais otimizada porém também não havia funcionado.

Jonathan Machado

unread,
Oct 2, 2015, 2:26:31 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Ou tenta colocar um Thread.sleep(tempo de espera) antes desse código driver.FindElementById("txtUSER").SendKeys(id) e ve o que acontece. Só tem que ver a sintaxe certinho no caso de C#.....

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 2:30:21 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Então, o tempo de espera eu ja cheguei a colocar 3 minutos para aguardar estes campos... Acredito não ser o tempo de espera o problema, porque com o Java, ele não leva nem 10 segundos para iniciar a executar mesmo em outros computadores.
Estou acreditando que seja alguma coisa que falta no C#, ou DLL, ou algo do tipo.

Vou por enquanto voltar ao Java, pois estou a quase 2 dias parado neste problema, vou continuar lendo e tentando o que eu encontrar aqui no grupo.
Se eu encontrar a resposta, eu posto aqui;

Att

Jonathan Machado

unread,
Oct 2, 2015, 2:41:11 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
E se tentar usar esse método da classe ExpectedConditions : ElementIsVisible

Ao invés de ElementExists, será que não funciona?

thiago...@agendaassessoria.com.br

unread,
Oct 2, 2015, 3:01:06 PM10/2/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Também não funcionou Jonathan =/

thiago...@agendaassessoria.com.br

unread,
Oct 7, 2015, 10:25:49 AM10/7/15
to GUTS-RS - Grupo de Usuários de Testes de Software do RS - SUCESU-RS
Bom dia pessoal,

Só pra finalizar a questão...
Voltei a implementar com o Java, e agora deu certo.

Aparentemente o problema era: eu estava criando um executável da aplicação para ser executado em uma maquina de terceiro e mesmo levantando o Selenium server neste computador, por algum motivo o selenium não conseguia prosseguir com a rotina.

A solução-------
Coloquei o Selenium Server em uma maquina(servidor) e conectei no mesmo através do Remote Web Driver, desta forma o computador de um usuário executava a rotina em background enquanto no servidor os testes eram executados.

Obrigado a todos que ajudaram :)
Reply all
Reply to author
Forward
0 new messages