Manipulação de janelas popup

4,606 views
Skip to first unread message

Alison Americo

unread,
Jul 17, 2014, 8:19:58 PM7/17/14
to seleniu...@googlegroups.com
Boa noite pessoal!

Pesquisei um pouco na internet, mas a princípio não entendi muito bem como utilizar/manipular com Selenium WebDriver as "janelas popup". Gostaria de algumas digas, algum site, blog que possa explicar bem sobre o assunto ou os próprios amigos aqui.

Grato desde já.

Stefan Teixeira

unread,
Jul 17, 2014, 8:34:14 PM7/17/14
to Alison Americo, seleniu...@googlegroups.com
Oi Alison. Quando você diz "janelas popup", você está se referindo a algo como um alert/confirm JavaScript ou uma nova janela do browser?

Abs


--
Você recebeu essa mensagem porque está inscrito no grupo quot;Selenium Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-bras...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Stefan Teixeira

unread,
Jul 17, 2014, 9:04:46 PM7/17/14
to Alison Americo, seleniu...@googlegroups.com
Oi Alison. Dá uma lida nesses links, que são da própria documentação no site do Selenium:


Qualquer dúvida, só falar!

Abs


Em 17 de julho de 2014 21:53, Alison Americo <alison....@gmail.com> escreveu:
Stefan, boa noite.

Gostaria de saber sobre os dois... qual diferença, como utilizar, onde posso estudar mais sobre...



--
Att. Alison Américo








Andre Damasceno Dias

unread,
Jul 22, 2014, 1:58:22 PM7/22/14
to seleniu...@googlegroups.com
Boa tarde,

Estou com problemas com uma poupup, mas não e em relação a mensagem de alerta. Tem algumas telas do sistema que ao clicar em incluir abrem uma poupup para preenchimento dos campos, ao tentar rodar o webdriver continua procurando pelos campos na página principal e não na poupup. Alguém sabe como resolver?

Stefan Teixeira

unread,
Jul 22, 2014, 2:02:59 PM7/22/14
to Andre Damasceno Dias, seleniu...@googlegroups.com
Fala Andre, vou copiar aqui o que tinha respondido pro Alison anteriormente, acabei respondendo só pra ele. Aí vai:



Esse mecanismo de controlar múltiplas janelas é uma parte um pouquinho mais complexa do WebDriver.

Se o seu teste clicar em um elemento que abra uma nova janela do browser, e você quiser interagir com essa nova janela, você precisa dizer ao WebDriver para mudar (switch) para a nova janela. Isso é feito através do comando driver.switchTo().window("<nome da janela>").

O problema é quando a janela não tem id (ou name), aí temos que pegar o windowHandle da janela. Esse windowHandle é uma String única que identifica a janela. Imagine que quero fazer o seguinte teste:

1 - Clicar num elemento que abre uma nova janela
2 - Mudar para a nova janela
3 - Fechar a nova janela e mudar para a janela inicial

O teste ficaria assim:

//Guardando o windowHandle da janela inicial, porque vou precisar mudar pra ela no final do teste e, além disso, vou usar esse valor para descobrir o windowHandle da nova janela
String windowHandleJanelaInicial = driver.getWindowHandle();

//Clico no elemento que abre a nova janela
WebElement elementoQueAbreNovaJanela = driver.findElement(...);
elementoQueAbreNovaJanela.click();

//Qual é o windowHandle da nova janela? Não sei. Vamos pegar então todos os windowHandles e guardar numa lista. Se só temos a janela inicial e a nova abertas, essa lista vai ter apenas 2 elementos. Para descobrir o windowHandle da janela nova, basta percorrer a lista e achar o elemento que NÃO seja o windowHandle da janela inicial.
List<String> windowHandles = driver.getWindowHandles();

//Para cada windowHandle dentro da lista de windowHandles...
for(String windowHandle : windowHandles) {
    
    //Se o windowHandle NÃO é igual ao windowHandle da janela inicial, eu sei que é o da nova janela, então mando o WebDriver mudar para ela
    if( !windowHandle.equals(windowHandleJanelaInicial) ) {
         driver.switchTo().window(windowHandle);
    }
}

//Agora estou na nova janela e posso interagir com os elementos dela

//Fecho a janela atual (nova) e mudo para a janela inicial
driver.close();

driver.switchTo().window(windowHandleJanelaInicial);



Espero que tenha ajudado.

Abraços!


--

Alison Americo

unread,
Jul 22, 2014, 2:08:16 PM7/22/14
to Stefan Teixeira, Andre Damasceno Dias, selenium-brasil
André, boa tarde!

A dica de Stefan é muito boa. Pesquisando, achei também no SlideShare esse link:


é bem detalhado.

Se não me engano a partir do slide 141 tem específico sobre o assunto.


--
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Selenium Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/selenium-brasil/L1AZq4ROXYw/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para selenium-bras...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Att. Alison Américo







Andre Damasceno Dias

unread,
Jul 22, 2014, 2:20:18 PM7/22/14
to Alison Americo, Stefan Teixeira, selenium-brasil
Valeu galera, vou testar aqui

Obrigado
--
 
Andre Damasceno Dias
Analista de Qualidade e Testes de Software
Celular: (21) 98758-0608
http://twitter.com/andreddias
Play the game, test the game

Andre Damasceno Dias

unread,
Jul 24, 2014, 8:32:42 AM7/24/14
to Stefan Teixeira, selenium-brasil
Fala galera bom dia,

Só tive tempo de fazer o teste hoje e fiquei com uma dúvida em relação a frase abaixo:


O problema é quando a janela não tem id (ou name), aí temos que pegar o windowHandle da janela.

No caso eu achei o id, mas não estou conseguindo utilizar, seria algo assim? 

   driver.switchTo().window(By.id("popUpBehaviorID_foregroundElement"));

Acho que não entendi muito bem o conceito, ao tentar utilizar o eclipse não reconheceu a palavra window


Em 22 de julho de 2014 15:02, Stefan Teixeira <stef...@gmail.com> escreveu:

Stefan Teixeira

unread,
Jul 24, 2014, 9:09:39 AM7/24/14
to Andre Damasceno Dias, selenium-brasil
Fala Andre.

Então, a gente tem que identificar a janela de alguma forma, seja com id, name ou windowHandle. Se você sabe o id da nova janela, perfeito, mas no trecho que você mandou tem um negócio errado. Passa o mouse em cima do erro do Eclipse, provavelmente ele vai dizer que não existe método window recebendo um WebElement como argumento. O argumento do método window é, na verdade, uma String.

Você teria que fazer: driver.switchTo().window("popUpBehaviorID_foregroundElement");

O importante é entender que, antes de mudar o WebDriver para uma nova janela, temos que guardar o windowHandle da janela inicial, para conseguirmos voltar para ela posteriormente.

Responde depois se deu tudo certo.


Abs!

Andre Damasceno Dias

unread,
Jul 24, 2014, 9:30:39 AM7/24/14
to Stefan Teixeira, selenium-brasil
Obrigado Stefan, nunca trabalhei com poupup e estou com uma certa dificuldade rs

Tentei dos dois jeitos, no primeiro comentado deu erro ao localizar a nova janela, não achou esse id. O interessante e que vi no firebug que é esse nome mesmo

Tentei de outro jeito e apesar de parecer que trocou não localizou o elemento da página nova, pelo que vi acho que não trocou mesmo porque coloquei um System.out.println e o nome que apareceu antes (Origem) e depois (winHandle) foi o  mesmo, ou seja parece que não troucou a janela

/*
        String Origem = driver.getWindowHandle(); // Obtém o identificador de janela atual
        driver.findElement(By.id("MainContent_btnNovoProjeto")).click(); // Clique algum link que abre uma nova janela
        Thread.sleep(5000);
        driver.switchTo().window("popUpBehaviorID_foregroundElement");
        String Poupup = driver.getTitle();
        System.out.println(Poupup);
*/
        String Origem = driver.getWindowHandle(); // Obtém o identificador de janela atual
        Thread.sleep(5000);
        driver.findElement(By.id("MainContent_btnNovoProjeto")).click(); // Clique algum link que abre uma nova janela

        for (String winHandle : driver.getWindowHandles()) {
            driver.switchTo().window(winHandle); // Troca para o próximo identificador de janela encontrado (que é a sua janela aberta)


        }

Stefan Teixeira

unread,
Jul 24, 2014, 9:47:40 AM7/24/14
to Andre Damasceno Dias, selenium-brasil
Andre, se mesmo passando o id entre aspas, como eu tinha dito antes, não funcionou, então vamos ter que usar os windowHandles mesmo.

Nesse foreach do trecho de código que você postou, você não tá verificando se o windowHandle é a janela antiga ou não. Se você tá com uma janela inicial e uma nova abertas, o método getWindowHandles() vai retornar 2 itens, certo? Como que eu sei qual é o windowHandle da janela nova? Basta ver qual NÃO é o da janela inicial.

Então você teria que fazer:

for (String winHandle : driver.getWindowHandles()) {
    if(!winHandle.equals(origem)) {    //SE winHandle NÃO (operador '!') é igual à janela de origem, então eu sei que é a janela nova
          driver.switchTo().window(winHandle);
    }
}

Provavelmente nesse trecho de código o WebDriver tava abrindo uma nova janela, mas voltando para a anterior, que deve ser a primeira da lista de windowHandles.

Outra coisa: não coloque nomes de variáveis começando com letra maiúscula, porque essa é a convenção para nomes de classes, você pode acabar se confundindo depois.


Abs!

Alison Americo

unread,
Jul 24, 2014, 9:49:17 AM7/24/14
to Andre Damasceno Dias, Stefan Teixeira, selenium-brasil
André bom dia...

Veja se esse exemplo melhora um pouco mais na compreensão. Também estava com  dúvidas.

@Test
  public void deveInteragirComUmaNovaJanela() {
    String nomeDaJanelaDeOrigem = driver.getWindowHandle();// Vai retornar o nome da janela ativa, importante para voltar para janela de origem após alternar para outra janela.
    WebElement botaoAbrir = driver.findElement(By.id("btn_abrir_window"));// Localiza o emento "btn_abrir_window" para ir para outra janela.
    botaoAbrir.click();// realizar ação do click.
    String nomeDaJanelaDeDestino = "Nova Janela"; // Na nova janela "ou popup" aberta, inspecione a janela que apareceu, depois vá em "console" e digite comando "window.name" que mostrará o nome da mesma(caso tenha rs), senão mostrará duas aspas em branco (" ")
    driver.switchTo().window(nomeDaJanelaDeDestino);// comando "switchTo().window" tem a função de alternar o driver para outra janela.
    assertEquals("Selenium - Playland - Nova Janela", driver.getTitle());//Verifica se o título da nova janela é esse mesmo, comando "getTitle" irá retornar o título.
    WebElement titulo = driver.findElement(By.tagName("h3"));//verifica onde está o elemento.
    assertEquals("Nova Janela", titulo.getText());
    WebElement botaoFechar = driver.findElement(By.id("btn_fechar"));
    botaoFechar.click();//realizar ação do botão click para fechar janela(popup).
    driver.switchTo().window(nomeDaJanelaDeOrigem); // Após fechar a janela(popup), estamos agora na janela "inicial" ou janela de "origem"
    assertEquals("Selenium - Playland", driver.getTitle());  // Aqui irá verificar se o título página de origem(após ter saído da janela popup) é a mesma.
  }  

=)


--
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Selenium Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/selenium-brasil/L1AZq4ROXYw/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para selenium-bras...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Att. Alison Américo







Elias Nogueira

unread,
Jul 24, 2014, 9:52:58 AM7/24/14
to Andre Damasceno Dias, Stefan Teixeira, selenium-brasil
Oi pessoal,
Me corrijam por favor se eu estiver errado, mas não há formas de obter um ID de uma janela porque este item não existe, correto?

Nos casos que eu já vi sobre um ID na janela, era um campo escondido (hidden). Outro caso é conseguir pegar um windowID internamente nas engines [1]

No caso do WebDriver o próprio método switchTo().window() [2] só aceita o name (através de uma String). Name esse que é controlado dinamicamente pelo browser.

Neste caso, como o nome é sempre dinâmico, a idéia é pegar todas as janelas ativas e verificar qual delas tu precisas interagir.
Ex: url ou titulo da página (ou até um elemento contido nela).

Pra isso se usa o windowHandle (pra garantir a janela que tu estavas) e o windowHandles que é uma lista de String (nome dinâmico de cada browser).

String janelaAtual = driver.getWindowHandle();
Set<String> janelas = driver.getWindowHandles();

for (String janela : janelas) {
     driver.switchTo().window(janela);
     if(driver.getCurrentURL().equals("URL DO BROWSER")) {
        break;
     }
}

Da pra fazer a mesma coisa com o driver.getTitle(), mas com o driver.currentURL() é mais garantido
Reply all
Reply to author
Forward
0 new messages