Jak zacházet s prvky iFrame v Selenium Webdriver: switchTo()

iFrame v Selenium Webdriver

iFrame v Selenium Webdriver je webová stránka nebo vložený rámec, který je vložen do jiné webové stránky nebo dokument HTML vložený do jiného dokumentu HTML. Prvek iframe se často používá k přidávání obsahu z jiných zdrojů, jako je reklama, na webovou stránku. Iframe je definován pomocíiframe> tag.

Jak identifikovat iFrame

Nemůžeme detekovat rámce pouhým zobrazením stránky nebo kontrolou Firebugu.

Podívejte se na obrázek níže, Zobrazovaná reklama je iframe, nemůžeme to najít ani rozpoznat pouhým prohlédnutím pomocí Firebugu. Otázkou tedy je, jak můžete identifikovat iframe?

Identifikujte prvek iframe
Jak identifikovat iframe pomocí Selenium webový ovladač

Můžeme identifikovat rámy v Selenium pomocí níže uvedených metod:

  • Klikněte pravým tlačítkem na prvek, pokud najdete možnost jako 'Tento rámec', pak se jedná o prvek iframe. (Viz výše uvedený diagram)
  • Klikněte pravým tlačítkem na stránku a klikněte na 'Zobrazit zdrojový kód stránky' a vyhledejte pomocí 'iframe'. Pokud najdete nějaký název značky s 'iframe', pak to znamená, že stránka se skládá z iframe.

Na výše uvedeném diagramu můžete vidět, že 'Tento RámMožnost je dostupná po kliknutí pravým tlačítkem, takže jsme si nyní jisti, že se jedná o iframe.

Pomocí níže uvedeného úryvku můžeme dokonce identifikovat celkový počet prvků iframe.

Int size = driver.findElements(By.tagName("iframe")).size();

Jak zacházet s rámy v Selenium pomocí příkazů WebDriver

V podstatě můžeme přepínat prvky a manipulovat s rámečky Selenium pomocí 3 způsobů.

  • Podle indexu
  • Podle jména nebo ID
  • Podle Web Element

Metoda 1: Přepněte na rámec podle indexu

Index je jedním z atributů pro manipulaci s rámcem Selenium přes který se na něj můžeme přepnout.

Index prvku iframe začíná „0“.

Předpokládejme, že pokud je na stránce 100 snímků, můžeme přepnout na frame in Selenium pomocí indexu.

  • driver.switchTo().frame(0);
  • driver.switchTo().frame(1);

Metoda 2: Přepněte do rámce podle názvu nebo ID

Název a ID jsou atributy pro zpracování rámců Selenium přes který se můžeme přepnout do iframe.

  • driver.switchTo().frame("iframe1");
  • driver.switchTo().frame("id of the element");

Příklad přechodu na iframe prostřednictvím ID:

do rámu pomocí Web Element

K tomuto prvku iframe můžeme přistupovat prostřednictvím této adresy URL: https://demo.guru99.com/test/guru99home/

Rukojeť rámy dovnitř Selenium Použití příkazů WebDriver

Není možné kliknout na iframe přímo skrz XPath protože je to iframe. Nejprve se musíme přepnout do rámečku a poté můžeme kliknout pomocí xpath.

Krok 1)

WebDriver driver = new FirefoxDriver();

driver.get("https://demo.guru99.com/test/guru99home/");

driver.manage().window().maximize();

  • Inicializujeme Firefox Řidič.
  • Přejděte na stránku „guru99“, která obsahuje prvek iframe.
  • Maximalizováno okno.

Krok 2)

driver.switchTo().frame("a077aa5e");
  • V tomto kroku potřebujeme zjistit ID prvku iframe kontrolou přes Firebug.
  • Poté pomocí ID přepněte na iframe.

Krok 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Zde musíme zjistit xpath prvku, na který máme kliknout.
  • Klikněte na prvek pomocí příkazu webového ovladače zobrazeného výše.

Zde je úplný kód:

public class SwitchToFrame_ID {
public static void main(String[] args) {

		WebDriver driver = new FirefoxDriver(); //navigates to the Browser
	    driver.get("https://demo.guru99.com/test/guru99home/"); 
	       // navigates to the page consisting an iframe

	       driver.manage().window().maximize();
	       driver.switchTo().frame("a077aa5e"); //switching the frame by ID

			System.out.println("********We are switch to the iframe*******");
     		driver.findElement(By.xpath("html/body/a/img")).click();
  		    //Clicks the iframe
       
  			System.out.println("*********We are done***************");
      }
}		

Výstup:

Prohlížeč přejde na stránku sestávající z výše uvedeného prvku iframe a klikne na prvek iframe.

Metoda 3: Přepnutí do rámce pomocí webového prvku

Můžeme se dokonce přepnout na iframe pomocí webového prvku .

  • driver.switchTo().frame(WebElement);

Jak přepnout zpět do hlavního rámce

Musíme vyjít z iframe.

Chcete-li se přesunout zpět do nadřazeného rámce, můžete buď použít switchTo().parentFrame(), nebo pokud se chcete vrátit zpět do hlavního (nebo většiny nadřazeného) rámce, můžete použít switchTo().defaultContent();

	    driver.switchTo().parentFrame();
	    driver.switchTo().defaultContent();

Jak přepnout rámec, pokud NEMŮŽEME přepnout pomocí ID nebo Web Element:

Předpokládejme, že pokud je na stránce 100 rámců a není k dispozici žádné ID, v tomto případě jen nevíme, ze kterého prvku iframe se načítá požadovaný prvek (to je případ, kdy neznáme index rámce taky).

Řešením pro výše uvedenou obavu je, že musíme najít index prvku iframe, přes který se prvek načítá, a poté se musíme pomocí indexu přepnout na prvek iframe.

Níže jsou uvedeny kroky k nalezení indexu rámce, kterým je prvek načítán, pomocí níže uvedeného fragmentu

Krok 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Inicializujte Firefox Řidič.
  • Přejděte na stránku „guru99“, která obsahuje prvek iframe.
  • Maximalizováno okno.

Krok 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Výše uvedený kód najde celkový počet prvků iframe přítomných na stránce pomocí názvu značky „iframe“.

Krok 3)

Cíl pro tímto krokem by bylo zjištění indexu iframe.

for(int i=0; i<=size; i++){
	driver.switchTo().frame(i);
	int total=driver.findElements(By.xpath("html/body/a/img")).size();
	System.out.println(total);
	    driver.switchTo().defaultContent();}

Nad „forloop“ iteruje všechny prvky iframe na stránce a vypíše „1“, pokud byl nalezen požadovaný prvek iframe, jinak vrátí „0“.

Zde je úplný kód až do kroku 3:

public class IndexOfIframe {
public static void main(String[] args) {
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
	    int size = driver.findElements(By.tagName("iframe")).size();

	    for(int i=0; i<=size; i++){
		driver.switchTo().frame(i);
		int total=driver.findElements(By.xpath("html/body/a/img")).size();
		System.out.println(total);
	    driver.switchTo().defaultContent();}}}

Spusťte tento program a výstup bude vypadat následovně:

Výstup:

1
0
0
0	
0
0

Ověřte výstup, můžete najít řadu 0 a 1.

  • Kdekoli ve výstupu najdete '1', je to index Frame, kterým je prvek načítán.
  • Protože index prvku iframe začíná '0', pokud najdete 1 v 1stmísto, pak je index 0.
  • Pokud najdete 1 ze 3rd místo, index je 2.

Jakmile najdeme index, můžeme zakomentovat cyklus for.

Krok 4)

driver.switchTo().frame(0);
  • Jakmile najdete index prvku, můžete přepnout rám pomocí výše uvedeného příkazu.
  • driver.switchTo().frame(index nalezený v kroku 3);

Krok 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Výše uvedený kód klikne na prvek iframe nebo prvek v prvku iframe.

Kompletní kód by tedy vypadal takto:

public class SwitchToframe   {
public static void main(String[] args) throws NoSuchElementException{
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //int size = driver.findElements(By.tagName("iframe")).size();
	
	/*for(int i=0; i<=size; i++){
	    driver.switchTo().frame(i);
	    int total=driver.findElements(By.xpath("html/body/a/img")).size();
		System.out.println(total);
	    driver.switchTo().defaultContent(); //switching back from the iframe
	 }*/
	            
		//Commented the code for finding the index of the element
	    driver.switchTo().frame(0); //Switching to the frame
		System.out.println("********We are switched to the iframe*******");
		driver.findElement(By.xpath("html/body/a/img")).click();
		
		//Clicking the element in line with Advertisement
	    System.out.println("*********We are done***************");
	        }
	    }

Výstup:

Prohlížeč přejde na stránku sestávající z výše uvedeného prvku iframe a klikne na prvek iframe.

Koncept vnořených rámců v Selenium

Předpokládejme, že existují dva rámečky jeden v druhém, jak je znázorněno na obrázku níže, a naším požadavkem je tisk textu ve vnějším rámečku a vnitřním rámečku.

V případě vnořených rámců

  • Nejprve se musíme přepnout na vnější rámec pomocí indexu nebo ID prvku iframe
  • Jakmile přepneme na vnější rámec, můžeme najít celkový počet prvků iframe uvnitř vnějšího rámce a
  • Na vnitřní rám můžeme přepnout kteroukoli ze známých metod.

Při vystupování z rámu musíme vyjít ven ve stejném pořadí, v jakém jsme do něj vstupovali nejprve z vnitřního rámu a poté z vnějšího rámu.

Html kód pro výše vnořený rámec je uveden níže.

Koncept vnořených rámců v Selenium

Výše uvedený kód HTML jasně vysvětluje značku iframe (zvýrazněnou zeleně) v jiné značce iframe, což naznačuje přítomnost vnořených prvků iframe.

Níže jsou uvedeny kroky pro přepnutí na vnější rámeček a tisk textu na vnější rámečky:

Krok 1)

	WebDriver driver=new 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 Frames --" + size);
	    
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());
  • Přepněte na vnější rám.
  • Vytiskne text na vnější rámeček.

Jakmile přepneme na vnější rám, měli bychom vědět, zda se uvnitř vnějšího rámu nachází nějaký vnitřní rám

Krok 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Najde celkový počet prvků iframe uvnitř vnějšího rámce.
  • Pokud byla nalezena velikost '0', pak uvnitř rámu není žádný vnitřní rám.

Krok 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Přepněte na vnitřní rám
  • Vytiskne text na vnitřní rámeček.

Zde je úplný kód:

public class FramesInsideFrames {
public static void main(String[] args) {
WebDriver driver=new 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 Frames --" + size);
               
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());

		//Printing the text in outer frame
		size = driver.findElements(By.tagName("iframe")).size();
	    // prints the total number of frames inside outer frame           
                                                                                                          
	    System.out.println("Total Frames --" + size);
	    driver.switchTo().frame(0); // Switching to innerframe
	    System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
		
		//Printing the text in inner frame
		driver.switchTo().defaultContent();
	}
}

Výstup:

Výstup výše uvedeného kódu by vytiskl text ve vnitřním a vnějším rámci.

Více Přečtěte si více