iFrame no Selenium Webdriver
iFrame no Selenium Webdriver é uma página da web ou um quadro embutido que está embutido em outra página da web ou um documento HTML embutido em outro documento HTML. O iframe é freqüentemente usado para adicionar conteúdo de outras fontes, como um anúncio, em uma página da web. O iframe é definido com a tag < iframe >.
Neste tutorial, você aprenderá -
- Como identificar o iframe:
- Como alternar os elementos em iframes usando comandos do driver da Web:
- Conceito de frames aninhados (frames dentro de frames):
Como identificar o iframe:
Não podemos detectar os frames apenas vendo a página ou inspecionando o Firebug.
Observe a imagem abaixo, o anúncio que está sendo exibido é um Iframe, não podemos localizar ou reconhecer isso apenas inspecionando usando Firebug. Portanto, a questão é como você pode identificar o iframe?
Podemos identificar os frames no Selenium usando os métodos abaixo:
- Clique com o botão direito no elemento, se você encontrar a opção como 'Este quadro', então é um iframe. (Consulte o diagrama acima)
- Clique com o botão direito na página e clique em 'Exibir código-fonte da página' e pesquise com o 'iframe'. Se você encontrar qualquer nome de tag com o 'iframe', isso significa que a página consiste em um iframe.
No diagrama acima, você pode ver que a opção ' Este quadro ' está disponível ao clicar com o botão direito, então agora temos certeza de que é um iframe.
Podemos até identificar o número total de iframes usando o snippet abaixo.
Int size = driver.findElements (By.tagName ("iframe")). Size ();
Como alternar os elementos em iframes usando comandos do driver da Web:
Basicamente, podemos alternar os elementos e manipular frames no Selenium de 3 maneiras.
- Por índice
- Por nome ou id
- Por elemento da web
Mudar para o quadro por índice:
O índice é um dos atributos para tratamento de quadros no Selenium por meio do qual podemos alternar para ele.
O índice do iframe começa com '0'.
Suponha que se houver 100 quadros na página, podemos alternar para o quadro no Selenium usando o índice.
- driver.switchTo (). frame (0);
- driver.switchTo (). frame (1);
Mude para o quadro por Nome ou ID:
Nome e ID são atributos para lidar com frames no Selenium por meio dos quais podemos alternar para o iframe.
- driver.switchTo (). frame ("iframe1");
- driver.switchTo (). frame ("id do elemento");
Exemplo de mudança para iframe por meio de ID:
Vamos dar um exemplo para alternar o quadro no Selenium exibido na imagem abaixo. Nosso requisito é clicar no iframe.
Podemos acessar esse iframe por meio do URL abaixo: http: //demo.guru99.com/test/guru99home/
É impossível clicar em iframe diretamente através do XPath, pois é um iframe. Primeiro temos que mudar para o quadro e então podemos clicar usando o xpath.
Passo 1)
Driver WebDriver = novo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
- Inicializamos o driver do Firefox.
- Navegue até o site "guru99" que consiste no iframe.
- Maximizou a janela.
Passo 2)
driver.switchTo (). frame ("a077aa5e");
- Nesta etapa, precisamos descobrir o id do iframe inspecionando por meio do Firebug.
- Em seguida, mude para o iframe por meio de ID.
Etapa 3)
driver.findElement (By.xpath ("html / body / a / img")). click ();
- Aqui, precisamos descobrir o xpath do elemento a ser clicado.
- Clique no elemento usando o comando do driver da web mostrado acima.
Aqui está o código completo:
public class SwitchToFrame_ID {public static void main (String [] args) {Driver WebDriver = novo FirefoxDriver (); // navega para o navegadordriver.get ("http://demo.guru99.com/test/guru99home/");// navega para a página que consiste em um iframedriver.manage (). window (). maximize ();driver.switchTo (). frame ("a077aa5e"); // trocando o quadro por IDSystem.out.println ("******** Estamos mudando para o iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Clica no iframeSystem.out.println ("********* Terminamos ***************");}}
Resultado:
O navegador navega para a página que consiste no iframe acima e clica no iframe.
Mudar para o frame por Web Element:
Podemos até mudar para o iframe usando o elemento da web.
- driver.switchTo (). frame (WebElement);
Como voltar para o quadro principal
Precisamos sair do iframe.
Para voltar ao quadro pai, você pode usar switchTo (). ParentFrame () ou, se quiser voltar ao quadro principal (ou a maioria dos pais), pode usar switchTo (). DefaultContent ();
driver.switchTo (). parentFrame ();driver.switchTo (). defaultContent ();
Como alternar o quadro, se NÃO PODEMOS alternar usando ID ou Web Element:
Suponha que se houver 100 frames na página e não houver ID disponível, neste caso, simplesmente não sabemos de qual iframe o elemento requerido está sendo carregado (É o caso quando não sabemos o índice do frame Além disso).
A solução para a preocupação acima é encontrar o índice do iframe por meio do qual o elemento está sendo carregado e, em seguida, alternar para o iframe por meio do índice.
Abaixo estão as etapas para encontrar o índice do Quadro pelo qual o elemento está sendo carregado usando o trecho abaixo
Passo 1)
Driver WebDriver = novo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
- Inicialize o driver do Firefox.
- Navegue até o site "guru99" que consiste no iframe.
- Maximizou a janela.
Passo 2)
int size = driver.findElements (By.tagName ("iframe")). size ();
- O código acima encontra o número total de iframes presentes dentro da página usando o tagname 'iframe'.
Etapa 3)
O objetivo desta etapa seria descobrir o índice do iframe.
para (int i = 0; i <= tamanho; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}
Acima "forloop" itera todos os iframes na página e imprime '1' se nosso iframe obrigatório foi encontrado, senão retorna '0'.
Aqui está o código completo até a etapa 3:
public class IndexOfIframe {public static void main (String [] args) {Driver WebDriver = novo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();para (int i = 0; i <= tamanho; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}}}
Execute este programa e o resultado seria o seguinte:
Resultado:
100000Verifique a saída, você pode encontrar a série de 0 e 1.
- Sempre que você encontrar o '1' na saída, é o índice do Quadro pelo qual o elemento está sendo carregado.
- Desde o índice do iframe começa com '0' se você encontrar a 1 na 1 st lugar, então o índice é 0.
- Se você encontrar 1 no 3º lugar, o índice é 2.
driver.switchTo (). frame (0);
- Depois de encontrar o índice do elemento, você pode alternar o quadro usando o comando acima.
- driver.switchTo (). frame (índice encontrado na Etapa 3);
driver.findElement (By.xpath ("html / body / a / img")). click ();
- O código acima clica no iframe ou elemento no iframe.
public class SwitchToframe {public static void main (String [] args) throws NoSuchElementException {Driver WebDriver = novo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * para (int i = 0; i <= tamanho; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent (); // voltando do iframe} * /// Comentou o código para encontrar o índice do elementodriver.switchTo (). frame (0); // Mudando para o quadroSystem.out.println ("******** Mudamos para o iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Clicar no elemento alinhado com o AnúncioSystem.out.println ("********* Terminamos ***************");}}Saída: o navegador navega para a página que consiste no iframe acima e clica no iframe.
Conceito de frames aninhados (frames dentro de frames):
Vamos supor que existam dois quadros um dentro do outro como mostrado na imagem abaixo e nosso requisito é imprimir o texto no quadro externo e interno. No caso de frames aninhados,- Primeiro, devemos mudar para o quadro externo por Índice ou ID do iframe
- Assim que mudarmos para o quadro externo, podemos encontrar o número total de iframes dentro do quadro externo, e
- Podemos mudar para o quadro interno por qualquer um dos métodos conhecidos.
O código Html para o quadro aninhado acima é mostrado abaixo.
O código HTML acima explica claramente a tag iframe (destacada em verde) dentro de outra tag iframe, indicando a presença de iframes aninhados.
Abaixo estão as etapas para mudar para quadro externo e imprimir o texto em quadros externos: Etapa 1)
Driver WebDriver = novo FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total de frames -" + tamanho);// imprime o número total de quadrosdriver.switchTo (). frame (0); // Trocando o Quadro ExternoSystem.out.println (driver.findElement (By.xpath ("xpath do elemento externo")). GetText ());
- Mude para o quadro externo.
- Imprime o texto no quadro externo.
Assim que mudarmos para a moldura externa, devemos saber se alguma moldura interna está presente dentro da moldura externa
Passo 2)
size = driver.findElements (By.tagName ("iframe")). size ();// imprime o número total de quadros dentro do quadro externoSystem.out.println ("Total de frames -" + tamanho);
- Encontra o número total de iframes dentro do quadro externo.
- Se o tamanho for '0', então não há quadro interno dentro do quadro.
driver.switchTo (). frame (0); // Switching to innerframeSystem.out.println (driver.findElement (By.xpath ("xpath do elemento interno")). GetText ());
- Mudar para o quadro interno
- Imprime o texto no quadro interno.
public class FramesInsideFrames {public static void main (String [] args) {Driver WebDriver = novo FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total de frames -" + tamanho);// imprime o número total de quadrosdriver.switchTo (). frame (0); // Trocando o Quadro ExternoSystem.out.println (driver.findElement (By.xpath ("xpath do elemento externo")). GetText ());// Imprimindo o texto no quadro externosize = driver.findElements (By.tagName ("iframe")). size ();// imprime o número total de quadros dentro do quadro externoSystem.out.println ("Total de frames -" + tamanho);driver.switchTo (). frame (0); // Switching to innerframeSystem.out.println (driver.findElement (By.xpath ("xpath do elemento interno")). GetText ());// Imprimindo o texto no quadro internodriver.switchTo (). defaultContent ();}}Saída : A saída do código acima imprimiria o texto no quadro interno e no quadro externo.