iFrame в Selenium Webdriver
iFrame у Selenium Webdriver - це веб-сторінка або вбудований фрейм, який вбудований в іншу веб-сторінку або документ HTML, вбудований в інший документ HTML. Рамка iframe часто використовується для додавання вмісту з інших джерел, наприклад реклами, на веб-сторінку. Iframe визначається тегом < iframe >.
У цьому підручнику ви дізнаєтесь -
- Як визначити iframe:
- Як перемикати елементи у фреймах за допомогою команд веб-драйвера:
- Концепція вкладених кадрів (Frames inside Frames):
Як визначити iframe:
Ми не можемо виявити кадри, просто побачивши сторінку або оглянувши Firebug.
Зверніть увагу на зображення нижче. Реклама, що відображається, є iframe, ми не можемо її знайти або розпізнати, просто перевіривши за допомогою Firebug. Тож питання в тому, як можна визначити iframe?
Ми можемо ідентифікувати кадри в Selenium, використовуючи наведені нижче методи:
- Клацніть правою кнопкою миші на елементі. Якщо ви знайдете такий параметр, як "Цей кадр", то це iframe. (Будь ласка, зверніться до схеми вище)
- Клацніть правою кнопкою миші на сторінці та натисніть «Переглянути джерело сторінки» та виконайте пошук за допомогою «iframe», якщо ви можете знайти будь-яку назву тегу з «iframe», то це означає сказати сторінку, що складається з iframe.
На наведеній вище схемі ви можете бачити, що опція " Цей кадр " доступна після клацання правою кнопкою миші, тому ми тепер впевнені, що це iframe.
Ми навіть можемо визначити загальну кількість фреймів, використовуючи фрагмент нижче.
Int size = driver.findElements (By.tagName ("iframe")). Size ();
Як перемикати елементи у фреймах за допомогою команд веб-драйвера:
В основному, ми можемо перемикати елементи та обробляти кадри в Selenium, використовуючи 3 способи.
- За покажчиком
- За іменем або ідентифікатором
- За веб-елементом
Перехід до кадру за індексом:
Індекс - це один з атрибутів обробки кадрів у Selenium, за допомогою якого ми можемо перейти до нього.
Індекс iframe починається з "0".
Припустимо, якщо на сторінці є 100 кадрів, ми можемо перейти до кадру в Selenium за допомогою index.
- driver.switchTo (). frame (0);
- driver.switchTo (). frame (1);
Перейти до кадру за іменем або ідентифікатором:
Ім'я та ідентифікатор - це атрибути для обробки кадрів у Selenium, за допомогою яких ми можемо перейти до iframe.
- driver.switchTo (). frame ("iframe1");
- driver.switchTo (). frame ("ідентифікатор елемента");
Приклад переходу на iframe через ID:
Візьмемо приклад перемикання кадру в селені, що відображається на зображенні нижче. Наша вимога полягає в тому, щоб натиснути iframe.
Ми можемо отримати доступ до цього iframe за цією URL-адресою нижче: http: //demo.guru99.com/test/guru99home/
Неможливо натиснути iframe безпосередньо через XPath, оскільки це iframe. Спочатку ми маємо перейти до кадру, а потім ми можемо клацнути за допомогою xpath.
Крок 1)
Драйвер WebDriver = новий FirefoxDriver ();driver.get ("http://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 ();
- Тут нам потрібно з’ясувати шлях шляху, до якого потрібно натиснути.
- Клацніть елемент за допомогою команди веб-драйвера, показаної вище.
Ось повний код:
відкритий клас SwitchToFrame_ID {public static void main (String [] args) {Драйвер WebDriver = новий FirefoxDriver (); // переходить до браузераdriver.get ("http://demo.guru99.com/test/guru99home/");// переходить до сторінки, що складається з внутрішнього кадруdriver.manage (). window (). maximize ();driver.switchTo (). frame ("a077aa5e"); // перемикання кадру за ідентифікаторомSystem.out.println ("******** Ми перейшли на iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Клацає iframeSystem.out.println ("********* Ми закінчили ***************");}}
Вихід:
Браузер переходить на сторінку, що складається із зазначеного вище iframe, і клацає на iframe.
Перехід до кадру за допомогою веб-елемента:
Ми навіть можемо перейти до iframe, використовуючи веб-елемент.
- driver.switchTo (). frame (WebElement);
Як повернутися до головного кадру
Ми маємо вийти з iframe.
Щоб повернутися до батьківського кадру, ви можете використовувати switchTo (). ParentFrame (), або якщо ви хочете повернутися до основного (або самого батьківського) кадру, ви можете використовувати switchTo (). DefaultContent ();
driver.switchTo (). parentFrame ();driver.switchTo (). defaultContent ();
Як переключити кадр, якщо ми НЕ МОЖЕМ перейти за допомогою ідентифікатора або веб-елемента:
Припустимо, якщо на сторінці є 100 кадрів, а ідентифікатор недоступний, у цьому випадку ми просто не знаємо, з якого завантажується необхідний елемент iframe (це той випадок, коли ми не знаємо індекс кадру також).
Рішенням для вищезазначеної проблеми є те, що ми повинні знайти індекс iframe, через який завантажується елемент, а потім нам потрібно перейти до iframe через індекс.
Нижче наведені кроки для пошуку індексу фрейму, за допомогою якого елемент завантажується, використовуючи фрагмент нижче
Крок 1)
Драйвер WebDriver = новий FirefoxDriver ();driver.get ("http://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 (всього);driver.switchTo (). defaultContent ();}
Над "forloop" переглядаються всі вставки iframe на сторінці, і він друкує '1', якщо наш необхідний iframe був знайдений, інакше повертає '0'.
Ось повний код до кроку 3:
публічний клас IndexOfIframe {public static void main (String [] args) {Драйвер WebDriver = новий FirefoxDriver ();driver.get ("http://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 (всього);driver.switchTo (). defaultContent ();}}}
Виконайте цю програму, і результат буде таким, як показано нижче:
Вихід:
100000Перевірте вихід, ви можете знайти ряди 0 і 1.
- Де б ви не знайшли "1" у вихідних даних, це індекс Frame, за яким завантажується елемент.
- Оскільки індекс iframe починається з '0', якщо ви знайдете 1 на першому місці, тоді індекс дорівнює 0.
- Якщо ви знаходитесь на 1 -му місці, індекс дорівнює 2.
driver.switchTo (). frame (0);
- Після того, як ви знайдете індекс елемента, ви можете переключити кадр за допомогою наведеної вище команди.
- driver.switchTo (). frame (індекс знайдений з кроку 3);
driver.findElement (By.xpath ("html / body / a / img")). click ();
- Наведений вище код клацає iframe або елемент у iframe.
відкритий клас SwitchToframe {public static void main (String [] args) кидає NoSuchElementException {Драйвер WebDriver = новий FirefoxDriver ();driver.get ("http://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 (всього);driver.switchTo (). defaultContent (); // перехід назад з iframe} * /// Прокоментував код пошуку індексу елементаdriver.switchTo (). frame (0); // Перемикання на кадрSystem.out.println ("******** Ми перейшли на iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Клацання елемента відповідно до "Реклама"System.out.println ("********* Ми закінчили ***************");}}Вихідні дані: Браузер переходить на сторінку, що складається із зазначеного вище iframe, і клацає на iframe.
Концепція вкладених кадрів (Frames inside Frames):
Припустимо, що є два кадри один усередині іншого, як показано на малюнку нижче, і наша вимога - це друк тексту у зовнішній рамці та внутрішній рамці. У випадку вкладених кадрів,- Спочатку ми повинні перейти до зовнішнього кадру за допомогою Index або ID iframe
- Після того, як ми перейдемо до зовнішнього кадру, ми зможемо знайти загальну кількість фреймів всередині зовнішнього кадру, і
- Ми можемо перейти до внутрішнього кадру будь-яким із відомих методів.
Код Html для вищевказаного вкладеного кадру такий, як показано нижче.
Наведений вище HTML-код чітко пояснює тег iframe (виділений зеленим кольором) у межах іншого тегу iframe, вказуючи на наявність вкладених фреймів.
Нижче наведені кроки для переходу на зовнішню рамку та друку тексту на зовнішніх кадрах: Крок 1)
Драйвер WebDriver = новий FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). неявноWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Загальна кількість кадрів -" + розмір);// друкує загальну кількість кадрівdriver.switchTo (). frame (0); // Перемикання зовнішнього кадруSystem.out.println (driver.findElement (By.xpath ("xpath зовнішнього елемента")). GetText ());
- Переключіться на зовнішню рамку.
- Друкує текст на зовнішній рамці.
Переключившись на зовнішню рамку, ми повинні знати, чи є якась внутрішня рамка всередині зовнішньої рамки
Крок 2)
size = driver.findElements (By.tagName ("iframe")). size ();// друкує загальну кількість кадрів усередині зовнішнього кадруSystem.out.println ("Загальна кількість кадрів -" + розмір);
- Знаходить загальну кількість фреймів всередині зовнішнього кадру.
- Якщо розмір був знайдений «0», тоді всередині кадру немає внутрішнього кадру.
driver.switchTo (). frame (0); // Перехід на внутрішній кадрSystem.out.println (driver.findElement (By.xpath ("xpath внутрішнього елемента")). GetText ());
- Переключіться на внутрішню раму
- Друкує текст на внутрішньому кадрі.
публічний клас FramesInsideFrames {public static void main (String [] args) {Драйвер WebDriver = новий FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). неявноWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Загальна кількість кадрів -" + розмір);// друкує загальну кількість кадрівdriver.switchTo (). frame (0); // Перемикання зовнішнього кадруSystem.out.println (driver.findElement (By.xpath ("xpath зовнішнього елемента")). GetText ());// Друк тексту у зовнішній рамціsize = driver.findElements (By.tagName ("iframe")). size ();// друкує загальну кількість кадрів усередині зовнішнього кадруSystem.out.println ("Загальна кількість кадрів -" + розмір);driver.switchTo (). frame (0); // Перехід на внутрішній кадрSystem.out.println (driver.findElement (By.xpath ("xpath внутрішнього елемента")). GetText ());// Друк тексту у внутрішньому фрейміdriver.switchTo (). defaultContent ();}}Вихідні дані : Висновок вищевказаного коду надрукує текст у внутрішньому та зовнішньому кадрі.