handling iframes using selenium webdriver switchto method
спритна методологія скраму інтерв'ю запитання відповіді
Обробка iFrames за допомогою Selenium WebDriver: практичний посібник із практичними прикладами
iFrame (вбудований кадр) - це документ HTML, вбудований в інший документ HTML.
iFrames найчастіше використовуються для показу реклами на веб-сторінці. iFrames явно згадуються в документі HTML за допомогою тегу HTML
Цей підручник пояснить вам усе про обробку фреймів у Selenium, а також відповідні приклади коду для вашого легкого розуміння.
=> Прочитайте навчальну серію Easy Selenium.
Що ви дізнаєтесь:
- Обробка iFrames за допомогою селену
- ОНОВЛЕННЯ в березні 2020 року
- Висновок
Обробка iFrames за допомогою селену
Вбудований фрейм на веб-сторінці можна визначити у браузері Firefox, якщо параметр із назвою «Цей кадр» відображається у параметрах правої кнопки миші, як показано нижче.
Крім того, ми також можемо перевірити наявність веб-сторінки будь-яких фреймів шляхом перегляду вихідного коду та пошуку тегу
List iframes = driver.findElements(By.tagName(“iframe”));
Методи, надані селеном для обробки iFrames
Селен пропонує наступні вбудовані методи для перемикання вперед і назад із фреймів.
- switchTo.frame (int frameNumber)
- switchTo.frame (рядок 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 (рядок 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 ()
- Переключення між рамками iframes і батьківською сторінкою можна здійснити за допомогою методу 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.
Надрукуйте кількість фреймів на веб-сторінці у вікні консолі затемнення.
Надрукуйте вихідний код кадру на консолі затемнення після перемикання на кадр.
Пояснення коду:
- Ми ініціалізуємо об’єкт драйвера gecko за допомогою методу System.setProperty, щоб вказати шлях до файлу geckodriver.exe на локальній машині.
- Потім ми створюємо екземпляр об’єкта драйвера FireFox через інтерфейс WebDriver.
- За допомогою об’єкта драйвера firefox відкривається така веб-сторінка: https://www.softwaretestinghelp.com.
- На наступному кроці ми визначаємо кількість елементів iframe, що відображаються на веб-сторінці, підраховуємо їх і відображаємо кількість iframe на консолі затемнення.
- Використовуючи ідентифікатор кадру, ми переходимо до кадру на веб-сторінці. У наведеному вище випадку ідентифікатор кадру - „aswift_0“.
- Після того, як ми успішно перейшли до кадру, ми друкуємо вихідний код кадру на консолі eclipse.
- Потім ми повертаємось до батьківської веб-сторінки за допомогою оператора driver.switchTo (). DefaultContent () і, нарешті, закриваємо екземпляр веб-драйвера за допомогою методу driver.quit.
Різниця між Frame та iFrame у Selenium
- Кадр використовується для розділення сторінки на кілька розділів, у кожному розділі - новий вміст.
- IFrame використовується для вбудовування вмісту зовнішніх веб-сайтів у веб-сторінку, щоб уникнути проблем між сценаріями між сайтами.
- IFrame вважається менш безпечним, ніж фрейм, оскільки iFrame дозволяє розробникам вбудовувати вміст із сторонніх веб-сайтів. Таким чином, iframe вимагає від розробника довіри до вмісту, який він вбудував у iframe.
- Більшість веб-додатків, що розробляються сьогодні, не використовують фрейми для розділення сторінки, скоріше вони використовують фрейми для вбудовування зовнішнього вмісту, такого як реклама на веб-сторінці.
Обробка динамічних кадрів у селені
- На деяких веб-сторінках властивості кадру, такі як ідентифікатор кадру та назва кадру, можуть динамічно змінюватися на веб-сторінці, однак положення кадру залишатиметься незмінним. У такому випадку ми не можемо покладатися на ідентифікатор кадру або ім’я кадру для однозначної ідентифікації кадру.
- Ми можемо використовувати покажчик кадру в такому випадку для однозначної ідентифікації кадру на основі положення кадру.
- У деяких випадках значення ідентифікатора кадру змінюється кожного разу, коли сторінка завантажується, але зі статичним текстом, який не змінюється. Наприклад , розглянемо наведений нижче код для фреймів.
У наведеному вище прикладі текст ‘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) Використання покажчика кадру
Знайдіть кадр, використовуючи індекс кадру, якщо такий є.
Синтаксис:
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 - Підручник з селену No16
- Обробка веб-таблиць, кадрів та динамічних елементів у сценарії селену - Підручник з селену No18
- Неявне та явне очікування в Selenium WebDriver (типи очікувань селену)
- Посібник із створення звітів про обсяги в Selenium WebDriver