handling iframes using selenium webdriver switchto method
въпроси за интервю за настройка на производителността на oracle dba
Работа с iFrames с помощта на Selenium WebDriver: Практически урок с практически примери
iFrame (вградена рамка) е HTML документ, вграден в друг HTML документ.
iFrames се използват най-често за показване на реклами в рамките на уеб страница. iFrames са изрично споменати в HTML документ с помощта на HTML тагове
Този урок ще ви обясни всичко за боравенето с iframes в Selenium заедно със съответните примери за кодове за вашето лесно разбиране.
=> Прочетете серията Easy Training Training.
Какво ще научите:
- Работа с iFrames с помощта на селен
- АКТУАЛИЗИРАНЕ на март 2020 г.
- Заключение
Работа с iFrames с помощта на селен
Вътрешна рамка в уеб страница може да бъде идентифицирана в браузъра Firefox, ако опцията с име „Този кадър“ се показва в опциите с десен бутон, както е показано по-долу.
Друга възможност е да проверим дали уеб страница има някакви вградени рамки, като разгледаме изходния код и търсим маркера
List iframes = driver.findElements(By.tagName(“iframe”));
Методи, предоставени от селен за работа с iFrames
Селенът предлага следните вградени методи за превключване напред и назад от рамки.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Този метод позволява на потребителите да преминат към определен кадър, използвайки идентификатора на кадъра.
- Номерът на кадъра е нулева стойност на индекса, което означава, че първият кадър на уеб страницата има индекс 0, вторият кадър има индекс 1, а третият кадър има индекс 3 и т.н.
- Номерът на кадъра също може да бъде идентифициран с помощта на ИД на рамката на елемента. Това може да се направи от Щракнете с десния бутон на мишката -> Проверете елемента и потърсете iFrame. Проверете дали някой от iFrames има атрибут ID.
Примерен елемент на iframe в изходния код ще изглежда както е споменато по-долу.
След като идентификаторът на iFrame бъде идентифициран, можем да използваме същото, за да превключим към рамката, както е показано по-долу.
Примери:
driver.switchTo.frame (“a077aa5e”);
driver.switchTo.frame (0);
- Този метод изхвърля NoSuchFrameException, когато необходимият кадър не е намерен на текущата уеб страница.
# 2) switchTo.frame (string frameName)
- Този метод позволява на потребителите да преминат към определен кадър, използвайки дефинираното от разработчика име на кадъра.
- Името на рамката трябва да бъде затворено в двойни кавички, за да се счита за параметър String.
- Този метод изхвърля NoSuchFrameException, когато необходимият кадър не е намерен на текущата уеб страница.
Пример:
В кода, споменат по-горе, и идентификаторът на кадъра, и името на кадъра имат една и съща стойност. Превключването към кадър може да се осъществи с помощта на името на кадъра, както е показано по-долу:
driver.switchTo.frame (“a077aa5e”);
# 3) switchTo.frame (WebElement frameElement)
- Този метод позволява на потребителите да преминат към рамка въз основа на местоположението на уеб елемента.
- Този метод изхвърля NoSuchFrameException, когато необходимият кадър не присъства на уеб страницата и StaleElementReferenceException, ако кадърът, показан на уеб страницата, не е активен.
Пример:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Превключването напред-назад между вградените рамки и родителската страница може да се постигне с помощта на метода driver.switchTo (). DefaultContent ().
- Моля, обърнете внимание, че в Selenium има подобен метод за превключване между кадрите с име driver.switchTo (). ParentFrame ().
- Разликата между driver.switchTo (). DefaultContent () и driver.switchTo (). ParentFrame () е, че първият метод превключва контролата към основната уеб страница, независимо от броя на кадрите в уеб страницата, докато вторият метод превключва контрола към родителския кадър на текущия кадър.
Пример:
Да предположим, че в родителската уеб страница p1 има три кадъра, наречени i1, i2 и i3. Кадрите i1, i2 и i3 са зависими един от друг, което означава, че един кадър ще бъде родител на друг.
Използвайки метода driver.switchTo (). DefaultContent () на кадър i3, управлението на уеб драйвера се премества на родителската страница, p1. Докато методът driver.switchTo (). ParentFrame () на кадър i3 превключва контрола обратно към кадър i2 и т.н.
Пример за изходен код:
По-долу е тестовият сценарий, който трябва да бъде автоматизиран с помощта на iframes в селен:
- Отворете уебсайта SoftwareTestingHelp.com.
- Намерете всички HTML елементи с етикета iframe, пребройте броя появявания на iFrame и го отпечатайте на конзола.
- Превключете към валиден кадър на уеб страницата, като използвате идентификатора на кадъра и отпечатайте изходния код на кадъра.
- Затворете текущия прозорец на браузъра.
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String() args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
Изход на код:
Отворете уебсайта: https://www.softwaretestinghelp.com
Превключете към рамката с име aswift_0.
Отпечатайте броя на вградените рамки на уеб страницата в прозореца на конзолата на eclipse.
Отпечатайте изходния код на рамката на конзолата на eclipse след превключване към рамката.
Обяснение на кода:
- Ние инициализираме обект на драйвер на gecko, използвайки метода System.setProperty, за да насочим към файловия път geckodriver.exe на локалната машина.
- След това създаваме екземпляр на обект от драйвер на FireFox чрез интерфейса WebDriver.
- С помощта на обекта на драйвера на firefox се отваря следната уеб страница: https://www.softwaretestinghelp.com.
- В следващата стъпка ние идентифицираме броя на iframe елементите, показани на уеб страницата, броим ги и показваме броя на iframe на конзолата на eclipse.
- Използвайки идентификатора на кадъра, ние преминаваме към кадъра на уеб страницата. В горния случай идентификаторът на кадъра е ‘aswift_0’.
- След като сме направили преминаване към рамката успешно, ние отпечатваме изходния код на рамката на конзолата на eclipse.
- След това превключваме обратно към родителската уеб страница с помощта на оператора driver.switchTo (). DefaultContent () и накрая затваряме екземпляра на уеб драйвера, използвайки метода driver.quit.
Разлика между Frame и iFrame в Selenium
- Рамка се използва за разделяне на страница на множество секции, с ново съдържание във всяка секция.
- IFrame се използва за вграждане на съдържанието на външните уебсайтове в уеб страницата, за да се избегнат проблеми със скриптове между сайтове.
- IFrame се счита за по-малко защитен от рамка, тъй като iFrame позволява на разработчиците да вграждат съдържание от уебсайтове на трети страни. По този начин, вградената рамка изисква от разработчика да се довери на съдържанието, което е вградил във вградената рамка.
- Повечето уеб приложения, които се разработват днес, не използват рамки за разделяне на страницата, а използват iframes за вграждане на външно съдържание като реклами в уеб страницата.
Работа с динамични рамки в селен
- В някои уеб страници свойствата на рамката, като идентификатор на рамката и име на кадър, могат да се променят динамично на уеб страница, но позицията на кадъра ще остане същата. В такъв случай не можем да разчитаме на идентификатора на рамката или името на кадъра, за да идентифицираме уникално рамката.
- Можем да използваме индекс на кадрите в такъв случай за уникално идентифициране на рамката въз основа на позицията на рамката.
- В някои случаи стойността на идентификатора на кадъра се променя всеки път, когато страницата се зарежда, но със статичен текст, който не се променя. Например , помислете за кода по-долу за iframes.
В горния пример текстът „frame_“ остава постоянен, докато числовата стойност се променя с всяко зареждане на страницата.
- Можем да идентифицираме горния кадър по уникален начин, като използваме долу XPath
// iframe (съдържа (@ id, ’frame’))
АКТУАЛИЗИРАНЕ на март 2020 г.
Как да намерим елементите вътре в рамката
В Selenium, за да осъществим достъп до елементите, присъстващи в рамката, първо трябва да превключим вътре в рамката и след това да идентифицираме елементите, както обикновено използваме различни локатори на Selenium. Вашият Selenium код не може да намери вашите елементи, без да превключвате в IFrame.
Снимката по-долу показва как се вграждат рамки в HTML код:
Различни начини за преминаване към IFrame с помощта на селен
# 1) Използване на име на рамка или идентификатор
Преминете към IFrame, като използвате име на рамка или идентификатор на рамка, понякога или име на рамка или идентификатор, или и двете ще присъстват в код.
Синтаксис:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Използване на Frame Index
Намерете кадъра, като използвате индекса на кадрите, ако е наличен.
Синтаксис:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Използване на уеб елемент
Намерете рамката, като използвате локатори Selenium .
Синтаксис:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Други операции, използващи Frame
# 1) Превключване обратно към рамката на родител или предшественик
Превключване от кадър 3 към кадър 2 с помощта на командата „switchTo.parentFrame“ .
Синтаксис:
driver.switchTo().parentFrame();
# 2) Превключване към всяка друга рамка
Ако искате да превключите от кадър 3 към кадър 1 или по подразбиране, използвайте командата „switchTo.defaultContent“.
Синтаксис:
driver.switchTo().defaultContent();
В кода по-долу намираме текстово поле с име, присъстващо в рамка.
Ами ако се опитаме да го намерим директно, без да превключваме в рамката?
Нека видим резултата:
Кодът е неуспешен с причина „Не може да се намери елемент: {„ метод “:„ xpath “,„ селектор “:„ // вход (@ name = ’name’) “}}
Сега превключете вътре в рамката с помощта на Web Element или кажете с помощта на локатора на Selenium и намерете полето за текстово поле.
По-долу е даден пълният код за превключване вътре в рамката:
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div(@id='eduFooterWrap')//iframe(1)'))); driver.findElement(By.xpath('//input(@name='name')')).sendKeys('SoftwareTestingHelp.com'); } }
Изход:
Ето как трябва да превключваме между кадрите за намиране на елементите с помощта на Selenium. Ако на вашата уеб страница има няколко кадъра, трябва да превключите няколко пъти.
Заключение
- iFrame е HTML документ, вграден в друг HTML документ. iFrames са изрично споменати в HTML документа с помощта на HTML тагове
- Методът switchTo.frame (int frameNumber) позволява на потребителите да преминат към определен кадър, използвайки идентификатора на кадъра.
- Методът switchTo.frame (низ frameName) позволява на потребителите да преминат към определен кадър, използвайки името на рамката, определено от разработчика.
- SwitchTo.frame (WebElement frameElement) метод позволява на потребителите да преминат към рамка въз основа на местоположението на уеб елемента.
=> Проверете ВСИЧКИ уроци за селен тук.
Препоръчително четене
- Урок за краставици селен: Интеграция на краставица Java Selenium WebDriver
- Въведение в Selenium WebDriver - Урок № 8 за селен
- Внедряване на нашия първи скрипт за WebDriver - Урок № 10 за Selenium WebDriver
- Често задавани въпроси за селен
- Как да боравим със сигнали / изскачащи прозорци в Selenium WebDriver - Урок за селен # 16
- Работа с уеб таблици, рамки и динамични елементи в Selenium Script - Селен Урок # 18
- Неявно и явно чакане в Selenium WebDriver (Видове чакане на селен)
- Ръководство за генериране на обширни отчети в Selenium WebDriver