Как да боравим с iFrames в Selenium Webdriver: switchTo ()

Съдържание:

Anonim

iFrame в Selenium Webdriver

iFrame в Selenium Webdriver е уеб страница или вградена рамка, която е вградена в друга уеб страница или HTML документ, вграден в друг HTML документ. Вградената рамка често се използва за добавяне на съдържание от други източници като реклама в уеб страница. Вградената рамка се дефинира с маркера < iframe >.

В този урок ще научите -

  1. Как да идентифицирам iframe:
  2. Как се превключват елементите в iframes с помощта на команди на Web Driver:
  3. Концепция за вложени рамки (рамки вътре в рамки):

Как да идентифицирам iframe:

Не можем да открием кадрите само като видим страницата или като проверим Firebug.

Обърнете внимание на изображението по-долу, Показваната реклама е Iframe, не можем да го открием или разпознаем, само като проверим с помощта на Firebug. Така че въпросът е как можете да идентифицирате рамката?

Как да идентифицирам iframe с помощта на Selenium WebDriver

Можем да идентифицираме кадрите в Selenium, като използваме методите, дадени по-долу:

  • Щракнете с десния бутон върху елемента, Ако намерите опцията като „Тази рамка“, това е вградена рамка. (Моля, вижте диаграмата по-горе)
  • Щракнете с десния бутон върху страницата и щракнете върху „Преглед на източника на страницата“ и търсете с „iframe“, ако можете да намерите име на етикет с „iframe“, тогава означава да кажете страницата, състояща се от iframe.

В диаграмата по-горе можете да видите, че опцията „ Тази рамка “ е достъпна при щракване с десния бутон, така че вече сме сигурни, че това е вградена рамка.

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

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

Как да превключвате елементите в iframes с помощта на команди на Web Driver:

По принцип можем да превключваме елементите и да обработваме рамки в Selenium по 3 начина.

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

Превключване към рамката по индекс:

Index е един от атрибутите за обработка на кадри в Selenium, чрез който можем да преминем към него.

Индексът на iframe започва с '0'.

Да предположим, че ако има 100 кадъра в страницата, можем да преминем към кадър в Selenium с помощта на index.

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

Превключване към рамката по име или идентификатор:

Името и идентификаторът са атрибути за обработка на кадри в Selenium, чрез които можем да преминем към iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame ("id на елемента");

Пример за превключване към iframe чрез ID:

Да вземем пример за превключване на рамка в Selenium, показана на изображението по-долу. Нашето изискване е да щракнете върху рамката.

Можем да осъществим достъп до тази рамка чрез този 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", който се състои от рамката.
  • Увеличен прозорецът.

Стъпка 2)

driver.switchTo (). frame ("a077aa5e");
  • В тази стъпка трябва да разберем идентификатора на вградената рамка чрез проверка чрез Firebug.
  • След това преминете към iframe чрез ID.

Стъпка 3)

driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Тук трябва да разберем пътя на елемента, върху който трябва да се щракне.
  • Щракнете върху елемента с помощта на командата за уеб драйвер, показана по-горе.

Ето пълния код:

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

Изход:

Браузърът се придвижва до страницата, състояща се от горния iframe и кликва върху iframe.

Превключване към рамката от уеб елемент:

Можем дори да преминем към iframe с помощта на уеб елемент.

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

Как да превключите обратно към основната рамка

Трябва да излезем от рамката.

За да се върнете към родителския кадър, можете да използвате 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", който се състои от рамката.
  • Увеличен прозорецът.

Стъпка 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Горният код намира общия брой на вградените рамки, присъстващи в страницата, като използва името на тага „iframe“.

Стъпка 3)

Целта на тази стъпка би била да се открие индексът на iframe.

за (int i = 0; i <= размер; 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 {публична статична 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 ();за (int i = 0; i <= размер; 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 на 1- во място, тогава индексът е 0.
  • Ако намерите 1 на 3 -то място, индексът е 2.
След като намерим индекса, можем да коментираме цикъла for. Стъпка 4)
driver.switchTo (). frame (0); 
  • След като намерите индекса на елемента, можете да превключите рамката с помощта на горната команда.
  • driver.switchTo (). frame (индекс, намерен от Стъпка 3);
Стъпка 5)
driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Горният код ще щракне върху рамката или елемента в рамката.
Така че пълният код ще бъде като по-долу:
публичен клас 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 ();/ * за (int i = 0; i <= размер; 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.

Концепция за вложени рамки (рамки вътре в рамки):

Да приемем, че има два кадъра един в друг, както е показано на изображението по-долу, и нашето изискване е да отпечатаме текста във външната рамка и вътрешната рамка. В случай на вложени рамки,
  • Отначало трябва да преминем към външната рамка или от индекс, или от идентификатор на 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 ("Общ брой рамки -" + размер);
  • Намира общия брой на вградените рамки във външната рамка.
  • Ако размерът е намерен „0“, тогава вътрешната рамка няма вътрешна рамка.
Стъпка 3)
driver.switchTo (). frame (0); // Превключване към вътрешна рамкаSystem.out.println (driver.findElement (By.xpath ("xpath на вътрешния елемент")). GetText ());
  • Превключете към вътрешната рамка
  • Отпечатва текста във вътрешната рамка.
Ето пълния код:
публичен клас FramesInsideFrames {публична статична 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 ();}}
Изход : Изходът на горния код ще отпечата текста във Вътрешната рамка и Външната рамка.