Как обрабатывать iFrames в Selenium Веб-драйвер: switchTo()

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

iFrame в Selenium Вебдрайвер — это веб-страница или встроенный фрейм, встроенный в другую веб-страницу, или документ HTML, встроенный в другой документ HTML. iframe часто используется для добавления на веб-страницу контента из других источников, например рекламы. iframe определяется с помощьюIFRAME> тег.

Как определить iFrame

Мы не можем обнаружить фреймы, просто просмотрев страницу или проверив Firebug.

Посмотрите на изображение ниже: отображаемая реклама представляет собой Iframe, мы не можем найти или распознать ее, просто проверив с помощью Firebug. Итак, вопрос в том, как идентифицировать iframe?

Определите Iframe
Как определить iframe с помощью Selenium Вебдрайвер

Мы можем идентифицировать кадры в Selenium используя методы, приведенные ниже:

  • Щелкните элемент правой кнопкой мыши. Если вы найдете такой вариант, как «Этот фрейм», значит, это iframe. (см. диаграмму выше)
  • Щелкните правой кнопкой мыши на странице и выберите «Просмотреть исходный код страницы» и выполните поиск с помощью «iframe». Если вы можете найти какое-либо имя тега с «iframe», то это означает, что страница состоит из 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: переключиться на фрейм по имени или идентификатору.

Имя и идентификатор — атрибуты для обработки кадров в 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 или Web Element:

Предположим, что на странице 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, присутствующих на странице, используя тэг «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» перебирает все iframe на странице и печатает «1», если требуемый iframe был найден, иначе возвращает «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» в выводе, это индекс кадра, с помощью которого загружается элемент.
  • Поскольку индекс 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

Предположим, что есть два фрейма один внутри другого, как показано на изображении ниже, и нашим требованием является печать текста во внешнем и внутреннем фрейме.

В случае вложенных фреймов

  • Сначала мы должны переключиться на внешний фрейм по индексу или идентификатору iframe.
  • Переключившись на внешний фрейм, мы сможем найти общее количество iframe внутри внешнего фрейма и
  • Переключиться на внутренний кадр мы можем любым из известных способов.

Выходя из кадра, мы должны выйти в том же порядке, в каком мы вошли в него, сначала из внутреннего кадра, а затем из внешнего кадра.

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);
  • Находит общее количество iframe внутри внешнего фрейма.
  • Если размер был найден «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();
	}
}

Результат:

Вывод приведенного выше кода будет печатать текст во внутренней и внешней рамке.

Читать прочитайте больше