Як працювати з iFrames в Selenium Веб-драйвер: switchTo()
iFrame в Selenium Веб-драйвер
iFrame в Selenium Веб-драйвер це веб-сторінка або вбудований фрейм, який вбудовано в іншу веб-сторінку або документ HTML, вбудований в інший документ HTML. Фрейм iframe часто використовується для додавання на веб-сторінку вмісту з інших джерел, наприклад реклами. iframe визначається за допомогоюЗ дати> тег.
Як визначити iFrame
Ми не можемо виявити фрейми, просто переглянувши сторінку або перевіривши Firebug.
Зверніть увагу на зображення нижче. Реклама, що відображається, є iframe, ми не можемо знайти чи розпізнати це, просто перевіривши за допомогою Firebug. Отже, питання полягає в тому, як ви можете ідентифікувати iframe?

Ми можемо ідентифікувати кадри в Selenium за допомогою методів, наведених нижче:
- Клацніть правою кнопкою миші на елементі. Якщо ви знайдете опцію «Цей кадр», це означає, що це 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/
Неможливо клацнути 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();
Як переключитися між фреймом, якщо ми НЕ МОЖЕМ перемикатися за допомогою ідентифікатора або веб-елемента:
Припустімо, якщо на сторінці 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
- Перейшовши до зовнішнього фрейму, ми можемо знайти загальну кількість iframes у зовнішньому фреймі та
- Ми можемо перейти на внутрішній каркас будь-яким із відомих способів.
Виходячи з кадру, ми повинні виходити в тому ж порядку, в якому ми входили спочатку з внутрішнього кадру, а потім із зовнішнього.
Html-код для наведеного вище вкладеного кадру виглядає так, як показано нижче.
Наведений вище HTML-код чітко пояснює тег 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);
- Знаходить загальну кількість iframes у зовнішньому фреймі.
- Якщо розмір було знайдено як «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(); } }
Вихід:
Результат наведеного вище коду надрукує текст у внутрішньому та зовнішньому фреймі.