Как да боравите с iFrames в Selenium Уебдрайвер: switchTo()

iFrame в Selenium Уебдрайвер

iFrame в Selenium Уебдрайвер е уеб страница или вградена рамка, която е вградена в друга уеб страница или HTML документ, вграден в друг HTML документ. Вградената рамка често се използва за добавяне на съдържание от други източници като реклама в уеб страница. Вградената рамка се дефинира свградена рамка> етикет.

Как да идентифицирате iFrame

Не можем да открием кадрите, като просто видим страницата или като проверим Firebug.

Наблюдавайте изображението по-долу, показваната реклама е вградена рамка, не можем да я намерим или разпознаем, като просто проверим с помощта на Firebug. Така че въпросът е как можете да идентифицирате iframe?

Идентифицирайте iframe
Как да идентифицирате iframe с помощта на Selenium уебдрайвер

Можем да идентифицираме рамките в Selenium използвайки методите, дадени по-долу:

  • Щракнете с десния бутон върху елемента, ако намерите опция като „Тази рамка“, тогава това е вградена рамка. (Моля, вижте диаграмата по-горе)
  • Щракнете с десния бутон върху страницата и щракнете върху „Преглед на изходния код на страницата“ и Търсене с „iframe“, ако можете да намерите име на етикет с „iframe“, тогава това означава, че страницата се състои от iframe.

В горната диаграма можете да видите, че "Тази рамка' е достъпна при щракване с десен бутон, така че вече сме сигурни, че това е вградена рамка.

Можем дори да идентифицираме общия брой вградени рамки, като използваме фрагмента по-долу.

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

Как да боравим с рамки в Selenium с помощта на команди на WebDriver

По принцип можем да превключваме елементите и да обработваме рамки Selenium използвайки 3 начина.

  • По индекс
  • По име или идентификатор
  • Чрез уеб елемент

Метод 1: Превключете към рамката по индекс

Индексът е един от атрибутите за обработка на рамка Selenium чрез който можем да преминем към него.

Индексът на iframe започва с '0'.

Да предположим, че ако в страницата има 100 кадъра, можем да превключим на вградена рамка Selenium чрез използване на индекс.

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

Метод 2: Превключете към рамката по Име или ID

Името и ID са атрибути за обработка на рамки Selenium чрез който можем да преминем към iframe.

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

Пример за превключване към iframe чрез ID:

към рамката от уеб елемент

Можем да осъществим достъп до този iframe чрез следния URL адрес: https://demo.guru99.com/test/guru99home/

Дръжка Рамки В Selenium Използване на команди на WebDriver

Невъзможно е да щракнете директно върху iframe XPath тъй като е iframe. Първо трябва да превключим към рамката и след това можем да щракнем с помощта на xpath.

Стъпка 1)

WebDriver driver = new FirefoxDriver();

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

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

  • Инициализираме Firefox шофьор.
  • Отидете до сайта „guru99“, който се състои от iframe.
  • Максимизира прозореца.

Стъпка 2)

driver.switchTo().frame("a077aa5e");
  • В тази стъпка трябва да открием идентификатора на iframe чрез проверка чрез Firebug.
  • След това превключете към iframe чрез ID.

Стъпка 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Тук трябва да намерим xpath на елемента, върху който ще щракнем.
  • Щракнете върху елемента с помощта на командата на уеб драйвер, показана по-горе.

Ето пълния код:

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***************");
      }
}		

Изход:

Браузърът навигира до страницата, състояща се от горния iframe, и щраква върху iframe.

Метод 3: Превключете към рамката чрез уеб елемент

Можем дори да превключим към iframe с помощта на уеб елемент.

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

Как да превключите обратно към основната рамка

Трябва да излезем от iframe.

За да се върнете към родителския кадър, можете да използвате switchTo().parentFrame() или ако искате да се върнете към основния (или повечето родителски) кадър, можете да използвате switchTo().defaultContent();

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

Как да превключим рамката, ако НЕ МОЖЕМ да превключим чрез ID или уеб елемент:

Да предположим, че ако има 100 кадъра в страницата и няма наличен идентификатор, в този случай ние просто не знаем от кой iframe изискваният елемент се зарежда (Това е случаят, когато не знаем индекса на кадъра също).

Решението на горния проблем е, че трябва да намерим индекса на iframe, през който се зарежда елементът, и след това трябва да превключим към iframe чрез индекса.

По-долу са посочени стъпките за намиране на индекса на рамката, чрез който елементът се зарежда, като използвате фрагмента по-долу

Стъпка 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Инициализирайте Firefox шофьор.
  • Отидете до сайта „guru99“, който съдържа iframe.
  • Максимизира прозореца.

Стъпка 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Кодът по-горе намира общия брой вградени рамки, присъстващи в страницата, като използва името на маркера „iframe“.

Стъпка 3)

Цел за тази стъпка ще бъде намирането на индекса на 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();}

Горният „forloop“ итерира всички вградени рамки в страницата и отпечатва „1“, ако нашата необходима вградена рамка е намерена, иначе връща „0“.

Ето пълния код до стъпка 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();}}}

Изпълнете тази програма и изходът ще бъде като по-долу:

Изход:

1
0
0
0	
0
0

Проверете изхода, можете да намерите серията от 0 и 1.

  • Където и да намерите „1“ в изхода, това е индексът на Frame, чрез който елементът се зарежда.
  • Тъй като индексът на iframe започва с '0', ако намерите 1 в 1stмясто, тогава индексът е 0.
  • Ако намерите 1 от 3rd място, индексът е 2.

Можем да коментираме for цикъла, след като намерим индекса.

Стъпка 4)

driver.switchTo().frame(0);
  • След като намерите индекса на елемента, можете да превключите рамката с горната команда.
  • driver.switchTo().frame(индекс, намерен от стъпка 3);

Стъпка 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Горният код ще щракне върху iframe или елемент в iframe.

Така че пълният код ще бъде като по-долу:

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***************");
	        }
	    }

Изход:

Браузърът навигира до страницата, състояща се от горния iframe, и щраква върху iframe.

Концепция за вложени рамки в Selenium

Да приемем, че има две рамки една в друга, както е показано на изображението по-долу, и нашето изискване е да отпечатаме текста във външната рамка и вътрешната рамка.

В случай на вложени рамки,

  • Първо трябва да превключим към външната рамка чрез индекс или ID на iframe
  • След като превключим към външната рамка, можем да намерим общия брой iframes във външната рамка и
  • Можем да преминем към вътрешната рамка по някой от известните методи.

Докато излизаме от рамката, трябва да излезем в същия ред, в който сме влезли в нея първо от вътрешната рамка и след това от външната рамка.

Html кодът за горната вложена рамка е както е показано по-долу.

Концепция за вложени рамки в Selenium

Горният HTML код ясно обяснява етикета за iframe (маркиран в зелено) в друг таг за iframe, което показва наличието на вложени iframe.

По-долу са описани стъпките за превключване към външна рамка и отпечатване на текста върху външните рамки:

Стъпка 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());
  • Преминете към външната рамка.
  • Отпечатва текста върху външната рамка.

След като преминем към външната рамка, трябва да знаем дали има вътрешна рамка във външната рамка

Стъпка 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Намира общия брой вградени рамки във външната рамка.
  • Ако размерът е намерен '0', тогава няма вътрешна рамка вътре в рамката.

Стъпка 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Преминете към вътрешната рамка
  • Отпечатва текста върху вътрешната рамка.

Ето пълния код:

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();
	}
}

Продукция:

Резултатът от горния код ще отпечата текста във вътрешната рамка и външната рамка.