iFrame в Selenium Webdriver
iFrame в Selenium Webdriver - это веб-страница или встроенный фрейм, который встроен в другую веб-страницу или HTML-документ, встроенный в другой HTML-документ. Iframe часто используется для добавления контента из других источников, например рекламы, на веб-страницу. Iframe определяется тегом < iframe >.
В этом руководстве вы узнаете -
- Как определить iframe:
- Как переключать элементы в окнах iframe с помощью команд веб-драйвера:
- Концепция вложенных фреймов (фреймы внутри фреймов):
Как определить iframe:
Мы не можем обнаружить фреймы, просто просматривая страницу или проверяя Firebug.
Обратите внимание на изображение ниже. Отображаемая реклама - это iframe, мы не можем найти или распознать это, просто проверив с помощью Firebug. Итак, вопрос в том, как определить iframe?
Мы можем идентифицировать фреймы в 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.
driver.switchTo (). frame (0);
- Как только вы найдете индекс элемента, вы можете переключить фрейм, используя указанную выше команду.
- driver.switchTo (). frame (индекс найден на шаге 3);
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.
- Как только мы переключимся на внешний фрейм, мы сможем найти общее количество фреймов внутри внешнего фрейма, и
- Переключиться на внутренний фрейм можно любым из известных способов.
Код 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», значит, внутри фрейма нет внутренней рамки.
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 ();}}Вывод : вывод приведенного выше кода будет печатать текст во внутреннем фрейме и внешнем фрейме.