Як обробляти iFrames у Selenium Webdriver: switchTo ()

Зміст:

Anonim

iFrame в Selenium Webdriver

iFrame у Selenium Webdriver - це веб-сторінка або вбудований фрейм, який вбудований в іншу веб-сторінку або документ HTML, вбудований в інший документ HTML. Рамка iframe часто використовується для додавання вмісту з інших джерел, наприклад реклами, на веб-сторінку. Iframe визначається тегом < iframe >.

У цьому підручнику ви дізнаєтесь -

  1. Як визначити iframe:
  2. Як перемикати елементи у фреймах за допомогою команд веб-драйвера:
  3. Концепція вкладених кадрів (Frames inside Frames):

Як визначити iframe:

Ми не можемо виявити кадри, просто побачивши сторінку або оглянувши Firebug.

Зверніть увагу на зображення нижче. Реклама, що відображається, є iframe, ми не можемо її знайти або розпізнати, просто перевіривши за допомогою Firebug. Тож питання в тому, як можна визначити iframe?

Як визначити iframe за допомогою Selenium WebDriver

Ми можемо ідентифікувати кадри в 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.
Як тільки ми знайдемо індекс, ми можемо прокоментувати цикл for. Крок 4)
driver.switchTo (). frame (0); 
  • Після того, як ви знайдете індекс елемента, ви можете переключити кадр за допомогою наведеної вище команди.
  • driver.switchTo (). frame (індекс знайдений з кроку 3);
Крок 5)
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
  • Після того, як ми перейдемо до зовнішнього кадру, ми зможемо знайти загальну кількість фреймів всередині зовнішнього кадру, і
  • Ми можемо перейти до внутрішнього кадру будь-яким із відомих методів.
Виходячи з кадру, ми повинні виходити в тому самому порядку, як ми входили в нього спочатку із внутрішнього, а потім із зовнішнього кадру.
Вкладені iFrames в Selenium WebDriver

Код 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», тоді всередині кадру немає внутрішнього кадру.
Крок 3)
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 ();}}
Вихідні дані : Висновок вищевказаного коду надрукує текст у внутрішньому та зовнішньому кадрі.