Как обрабатывать 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();
}
}
Результат:
Вывод приведенного выше кода будет печатать текст во внутренней и внешней рамке.


