Как работать с iFrames в Selenium Webdriver: switchTo ()

Содержание:

Anonim

iFrame в Selenium Webdriver

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

В этом руководстве вы узнаете -

  1. Как определить iframe:
  2. Как переключать элементы в окнах iframe с помощью команд веб-драйвера:
  3. Концепция вложенных фреймов (фреймы внутри фреймов):

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

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

Обратите внимание на изображение ниже. Отображаемая реклама - это iframe, мы не можем найти или распознать это, просто проверив с помощью Firebug. Итак, вопрос в том, как определить iframe?

Как определить iframe с помощью Selenium WebDriver

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

  • Щелкните правой кнопкой мыши по элементу, если вы найдете такой вариант, как «Этот фрейм», тогда это iframe. (См. Диаграмму выше)
  • Щелкните страницу правой кнопкой мыши и выберите «Просмотр источника страницы» и выполните поиск с помощью «iframe». Если вы можете найти какое-либо имя тега с «iframe», то это означает, что страница состоит из iframe.

На приведенной выше диаграмме вы можете видеть, что опция « Этот фрейм » доступна после щелчка правой кнопкой мыши, поэтому теперь мы уверены, что это iframe.

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

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

Как переключать элементы в окнах iframe с помощью команд веб-драйвера:

По сути, мы можем переключать элементы и обрабатывать фреймы в Selenium тремя способами.

  • По индексу
  • По имени или идентификатору
  • По веб-элементу

Перейти к кадру по индексу:

Индекс - это один из атрибутов обработки кадров в Selenium, с помощью которого мы можем переключиться на него.

Индекс iframe начинается с «0».

Предположим, что если на странице 100 фреймов, мы можем переключиться на фрейм в Selenium с помощью index.

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

Переключитесь на фрейм по имени или ID:

Имя и идентификатор - это атрибуты для обработки фреймов в Selenium, через которые мы можем переключиться на iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame ("идентификатор элемента");

Пример перехода на iframe через ID:

Давайте рассмотрим пример переключения кадра в Selenium, показанного на изображении ниже. Наше требование - щелкнуть 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 ();
  • Здесь нам нужно узнать xpath элемента, на который нужно щелкнуть.
  • Щелкните элемент с помощью команды веб-драйвера, показанной выше.

Вот полный код:

открытый класс SwitchToFrame_ID {public static void main (String [] args) {Драйвер WebDriver = новый FirefoxDriver (); // переходит в браузерdriver.get ("http://demo.guru99.com/test/guru99home/");// переходит на страницу, содержащую iframedriver.manage (). window (). maximize ();driver.switchTo (). frame ("a077aa5e"); // переключение кадра по IDSystem.out.println ("******** Мы переходим на iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Щелкает по iframeSystem.out.println ("********* Мы закончили ***************");}}

Выход:

Браузер переходит на страницу, содержащую указанный выше iframe, и нажимает на него.

Переключитесь на фрейм по веб-элементу:

Мы даже можем переключиться на iframe с помощью веб-элемента.

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

Как вернуться к основному фрейму

Мы должны выйти из iframe.

Чтобы вернуться к родительскому фрейму, вы можете использовать switchTo (). ParentFrame () или, если вы хотите вернуться к основному (или самому родительскому) фрейму, вы можете использовать switchTo (). DefaultContent ();

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

Как переключить фрейм, если мы НЕ МОЖЕМ переключиться с помощью ID или веб-элемента:

Предположим, что если на странице 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» выполняет итерацию по всем фреймам на странице и печатает «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
Проверьте вывод, вы можете найти серию нулей и единиц.
  • Где бы вы ни находили «1» в выводе, это индекс кадра, с помощью которого загружается элемент.
  • Поскольку индекс iframe начинается с '0', если вы найдете 1 в 1- м месте, то индекс равен 0.
  • Если вы найдете 1 на 3- м месте, индекс равен 2.
Мы можем закомментировать цикл for, как только найдем index. Шаг 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) выбрасывает 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.
  • Как только мы переключимся на внешний фрейм, мы сможем найти общее количество фреймов внутри внешнего фрейма, и
  • Переключиться на внутренний фрейм можно любым из известных способов.
При выходе из кадра мы должны выйти в том же порядке, в котором мы вошли в него, сначала из внутреннего кадра, а затем из внешнего кадра.
Вложенные iFrames в Selenium WebDriver

Код HTML для указанного выше вложенного фрейма показан ниже.

Приведенный выше HTML-код четко объясняет тег iframe (выделен зеленым) в другом теге iframe, указывая на наличие вложенных окон iframe.

Ниже приведены шаги для переключения на внешний фрейм и печати текста во внешних фреймах: Шаг 1)

Драйвер WebDriver = новый 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 («Всего кадров -» + размер);// выводит общее количество кадровdriver.switchTo (). frame (0); // Переключение внешнего кадраSystem.out.println (driver.findElement (By.xpath ("xpath внешнего элемента")). GetText ()); 
  • Переключитесь на внешнюю рамку.
  • Печатает текст на внешней рамке.

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

Шаг 2)

size = driver.findElements (By.tagName ("iframe")). size ();// выводит общее количество кадров внутри внешнего кадраSystem.out.println («Всего кадров -» + размер);
  • Находит общее количество окон iframe во внешнем фрейме.
  • Если был найден размер «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 (). implicitlyWait (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 ();}}
Вывод : вывод приведенного выше кода будет печатать текст во внутреннем фрейме и внешнем фрейме.