handling iframes using selenium webdriver switchto method
conversor de youtube para mp3 download grátis de alta qualidade
Manipulando iFrames usando Selenium WebDriver: Tutorial prático com exemplos práticos
iFrame (quadro embutido) é um documento HTML incorporado em outro documento HTML.
Os iframes são mais comumente usados para exibir anúncios em uma página da web. Os iframes são mencionados explicitamente no documento HTML usando a tag HTML
Este tutorial explicará a você tudo sobre como lidar com iframes no Selenium junto com os exemplos de código em questão para sua fácil compreensão.
=> Leia a série de treinamento Easy Selenium.
O que você aprenderá:
- Manuseio de iFrames usando Selenium
- ATUALIZAÇÃO em março de 2020
- Conclusão
Manuseio de iFrames usando Selenium
Um iframe dentro de uma página da web pode ser identificado no navegador Firefox se a opção chamada ‘Este quadro’ for exibida nas opções de clique com o botão direito como mostrado abaixo.
Como alternativa, também podemos validar se uma página da web tem iframes, observando o código-fonte e procurando a tag
List iframes = driver.findElements(By.tagName(“iframe”));
Métodos fornecidos pela Selenium para lidar com iFrames
O Selenium fornece os seguintes métodos integrados para alternar entre iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Este método permite que os usuários alternem para um determinado quadro usando a id do quadro.
- O número do quadro é um valor de índice baseado em zero, o que significa que o primeiro quadro da página da web tem o índice 0, o segundo quadro tem o índice 1 e o terceiro quadro tem o índice 3 e assim por diante.
- O número do quadro também pode ser identificado usando o ID do quadro do elemento. Isso pode ser feito por Clique com o botão direito -> Inspecionar elemento e pesquise o iFrame. Valide se algum dos iFrames possui um atributo de ID.
O elemento iframe de amostra no código-fonte teria a aparência mencionada abaixo.
Assim que o id do iframe for identificado, podemos usar o mesmo para alternar para o quadro conforme abaixo.
Exemplos:
driver.switchTo.frame (“a077aa5e”);
driver.switchTo.frame (0);
- Este método lança NoSuchFrameException quando o quadro necessário não é encontrado na página da web atual.
# 2) switchTo.frame (string frameName)
- Este método permite que os usuários mudem para um quadro específico usando o nome do quadro definido pelo desenvolvedor.
- O nome do quadro deve ser colocado entre aspas duplas para ser considerado um parâmetro String.
- Este método lança NoSuchFrameException quando o quadro necessário não é encontrado na página da web atual.
Exemplo:
No código mencionado acima, tanto o ID do quadro quanto o nome do quadro possuem o mesmo valor. A mudança para quadro pode ser realizada usando o nome do quadro conforme abaixo:
driver.switchTo.frame (“a077aa5e”);
# 3) switchTo.frame (WebElement frameElement)
- Este método permite que os usuários mudem para um quadro com base na localização do Web Element.
- Este método lança NoSuchFrameException quando o quadro necessário não está presente na página da web e StaleElementReferenceException se o quadro exibido na página da web não está ativo.
Exemplo:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Alternar entre iframes e página pai pode ser feito usando o método driver.switchTo (). DefaultContent ().
- Observe que existe um método semelhante no Selenium para alternar entre os quadros denominado método driver.switchTo (). ParentFrame ().
- A diferença entre driver.switchTo (). DefaultContent () e driver.switchTo (). ParentFrame () é que o primeiro método muda o controle para a página principal da web, independentemente do número de quadros na página, enquanto o segundo método muda o controle para o quadro pai do quadro atual.
Exemplo:
Suponha que haja três quadros chamados i1, i2 e i3 na página da web pai p1. Os quadros i1, i2 e i3 são dependentes um do outro, o que significa que um quadro será pai do outro.
Usando o método driver.switchTo (). DefaultContent () no frame i3, o controle do driver da web se move para a página pai, p1. Enquanto o método driver.switchTo (). ParentFrame () no quadro i3 muda o controle de volta para o quadro i2 e assim por diante.
Amostra de código fonte:
Abaixo está o cenário de teste a ser automatizado usando iframes em selênio:
- Abra o site SoftwareTestingHelp.com.
- Encontre todos os elementos HTML com o tag iframe, conte o número de ocorrências do iframe e imprima em um console.
- Mude para um quadro válido na página da web usando a id do quadro e imprima o código-fonte do quadro.
- Feche a janela do navegador atual.
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String() args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
Saída de código:
Abra o site: https://www.softwaretestinghelp.com
Mude para o quadro denominado aswift_0.
Imprima o número de iframes na página da web na janela do console do Eclipse.
Imprima o código-fonte do quadro no console do Eclipse após alternar para o quadro.
Explicação do código:
- Estamos inicializando um objeto do driver gecko usando o método System.setProperty para apontar para o caminho do arquivo geckodriver.exe na máquina local.
- Em seguida, estamos instanciando um objeto do driver FireFox por meio da interface do WebDriver.
- Usando o objeto de driver do firefox, a seguinte página da Web: https://www.softwaretestinghelp.com é aberta.
- Na próxima etapa, estamos identificando o número de elementos iframe exibidos na página da web, contando-os e exibindo a contagem iframe no console do Eclipse.
- Usando o id do frame, estamos mudando para o frame na página da web. No caso acima, o id do frame é ‘aswift_0’.
- Assim que tivermos feito uma mudança para o quadro com sucesso, estamos imprimindo o código-fonte do quadro no console do Eclipse.
- Em seguida, estamos voltando para a página da web pai usando a instrução driver.switchTo (). DefaultContent () e, finalmente, fechando a instância do driver da web usando o método driver.quit.
Diferença entre Frame e iFrame no Selenium
- Um quadro é usado para dividir uma página em várias seções, com novo conteúdo em cada seção.
- Um iFrame é usado para incorporar o conteúdo de sites externos na página da web, a fim de evitar problemas de script entre sites.
- Um iFrame é considerado menos seguro do que um quadro, pois o iFrame permite que os desenvolvedores incorporem conteúdo de sites de terceiros. Portanto, um iframe exige que o desenvolvedor confie no conteúdo que ele incorporou ao iframe.
- A maioria dos aplicativos da web em desenvolvimento hoje não usa frames para dividir a página, em vez disso, eles usam iframes para incorporar conteúdo externo, como anúncios, na página da web.
Manipulação de frames dinâmicos no selênio
- Em algumas páginas da web, as propriedades do quadro, como id e nome do quadro, podem mudar dinamicamente em uma página da web; no entanto, a posição do quadro permanecerá a mesma. Nesse caso, não podemos confiar no id do frame ou nome do frame para identificar exclusivamente um frame.
- Podemos usar o índice de quadro em tal caso, para identificar exclusivamente o quadro com base na posição do quadro.
- Em alguns casos, o valor do id do quadro muda sempre que a página é carregada, mas com um texto estático que não muda. Por exemplo , considere o código abaixo para iframes.
No exemplo acima, o texto ‘frame_’ permanece constante enquanto o valor numérico muda com cada carregamento de página.
- Podemos identificar o quadro acima exclusivamente usando o seguinte XPath
// iframe (contém (@ id, ’frame’))
ATUALIZAÇÃO em março de 2020
Como localizar os elementos dentro da moldura
No Selenium, para acessar os elementos presentes dentro do quadro, primeiro precisamos alternar dentro do quadro e, em seguida, identificar os elementos como normalmente fazemos usando diferentes localizadores de Selenium. Seu código Selenium não pode localizar seus elementos, sem mudar para IFrame.
A captura de tela abaixo mostra como os frames são incorporados em um código HTML:
Diferentes maneiras de mudar para um IFrame usando selênio
# 1) Usando o nome ou id do Frame
Mude para o IFrame usando o nome do quadro ou id do quadro, às vezes o nome do quadro ou id ou ambos estarão presentes em um código.
Sintaxe:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Usando o índice de quadros
Localize o quadro usando o índice de quadros, se disponível.
Sintaxe:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Usando o Web Element
Localize o quadro usando localizadores Selenium .
Sintaxe:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Outras operações usando quadro
# 1) Voltar para o quadro pai ou ancestral
Alternando de volta do quadro 3 para o quadro 2 usando o comando “switchTo.parentFrame” .
Sintaxe:
driver.switchTo().parentFrame();
# 2) Mudar para qualquer outro quadro
Se você deseja alternar do quadro 3 para o quadro 1 ou o quadro padrão, use o comando “switchTo.defaultContent”.
Sintaxe:
driver.switchTo().defaultContent();
No código a seguir, estamos localizando uma caixa de texto de nome presente dentro de um quadro.
E se tentarmos localizá-lo diretamente sem alternar para o quadro?
Vamos ver o resultado:
O código falhou com o motivo “Incapaz de localizar o elemento: {“ method ”:” xpath ”,” selector ”:” // input (@ name = ’name’) ”}
Agora mude dentro do quadro usando Web Element ou diga usando Selenium locator e localize o campo da caixa de texto.
A seguir está o Código Completo para Trocar dentro da Estrutura:
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div(@id='eduFooterWrap')//iframe(1)'))); driver.findElement(By.xpath('//input(@name='name')')).sendKeys('SoftwareTestingHelp.com'); } }
Resultado:
É assim que precisamos alternar entre os quadros para localizar os elementos usando Selenium. Se houver vários quadros em sua página da web, você precisará alternar várias vezes.
Conclusão
- iFrame é um documento HTML incorporado em outro documento HTML. iFrames são mencionados explicitamente no documento HTML usando a tag HTML
- O método switchTo.frame (int frameNumber) permite que os usuários alternem para um determinado quadro usando o id do quadro.
- O método switchTo.frame (string frameName) permite que os usuários alternem para um determinado quadro usando o nome definido pelo desenvolvedor do quadro.
- O método switchTo.frame (WebElement frameElement) permite que os usuários mudem para um quadro com base na localização do Web Element.
=> Verifique TODOS os tutoriais do Selenium aqui.
Leitura recomendada
- Tutorial Cucumber Selenium: Cucumber Java Selenium WebDriver Integration
- Introdução ao Selenium WebDriver - Selenium Tutorial # 8
- Implementação do nosso primeiro script WebDriver - Selenium WebDriver Tutorial # 10
- Selenium FAQs
- Como lidar com alertas / pop-ups no Selenium WebDriver - Tutorial do Selenium nº 16
- Manipulando tabelas, frames e elementos dinâmicos da Web no Selenium Script - Selenium Tutorial # 18
- Espera implícita e explícita no Selenium WebDriver (tipos de esperas de selênio)
- Guia para gerar relatórios de extensão no Selenium WebDriver