Как обрабатывать iFrames в Selenium Веб-драйвер: switchTo()
iFrame в Selenium Вебдрайвер
iFrame в Selenium Вебдрайвер — это веб-страница или встроенный фрейм, встроенный в другую веб-страницу, или документ HTML, встроенный в другой документ HTML. iframe часто используется для добавления на веб-страницу контента из других источников, например рекламы. iframe определяется с помощьюIFRAME> тег.
Как определить iFrame
Мы не можем обнаружить фреймы, просто просмотрев страницу или проверив Firebug.
Посмотрите на изображение ниже: отображаемая реклама представляет собой Iframe, мы не можем найти или распознать ее, просто проверив с помощью Firebug. Итак, вопрос в том, как идентифицировать iframe?

Мы можем идентифицировать кадры в Selenium используя методы, приведенные ниже:
- Щелкните элемент правой кнопкой мыши. Если вы найдете такой вариант, как «Этот фрейм», значит, это iframe. (см. диаграмму выше)
- Щелкните правой кнопкой мыши на странице и выберите «Просмотреть исходный код страницы» и выполните поиск с помощью «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();
Как переключить фрейм, если НЕ МОЖЕМ переключиться по ID или Web Element:
Предположим, что на странице 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.
- Переключившись на внешний фрейм, мы сможем найти общее количество iframe внутри внешнего фрейма и
- Переключиться на внутренний кадр мы можем любым из известных способов.
Выходя из кадра, мы должны выйти в том же порядке, в каком мы вошли в него, сначала из внутреннего кадра, а затем из внешнего кадра.
HTML-код для приведенного выше вложенного фрейма показан ниже.
Приведенный выше HTML-код четко объясняет тег iframe (выделен зеленым) внутри другого тега 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);
- Находит общее количество iframe внутри внешнего фрейма.
- Если размер был найден «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(); } }
Результат:
Вывод приведенного выше кода будет печатать текст во внутренней и внешней рамке.