handling iframes using selenium webdriver switchto method
testovanie webových služieb pomocou otázok z pohovoru soapui
Zaobchádzanie s rámami iFrames pomocou softvéru Selenium WebDriver: praktický návod s praktickými príkladmi
iFrame (vložený rámec) je dokument HTML vložený do iného dokumentu HTML.
iFrames sa najčastejšie používajú na zobrazovanie reklám na webovej stránke. Rámce iFrames sú v dokumente HTML výslovne uvedené pomocou značky HTML
Tento tutoriál vám vysvetlí všetko o manipulácii s prvkami iframe v seléne spolu s príslušnými príkladmi kódu pre vaše ľahké pochopenie.
=> Prečítajte si sériu Easy Selenium Training Series.
Čo sa dozviete:
Zaobchádzanie s rámami iFrames pomocou selénu
Rámec iframe na webovej stránke je možné v prehliadači Firefox identifikovať, ak sa pri možnostiach pravým tlačidlom myši zobrazuje možnosť s názvom „Tento rámec“, ako je uvedené nižšie.
Prípadne môžeme tiež overiť, či má webová stránka nejaké rámce iframe, a to tak, že sa pozrieme na zdrojový kód a vyhľadáme značku
List iframes = driver.findElements(By.tagName(“iframe”));
Metódy poskytované selénom na prácu s rámami iFrames
Selén poskytuje nasledujúce vstavané metódy prepínania medzi prvkami iframe a späť.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Táto metóda umožňuje používateľom prepnúť na konkrétny rámec pomocou ID rámca.
- Číslo rámca je hodnota indexu založená na nule, čo znamená, že prvý rámec webovej stránky má index 0, druhý rámec má index 1 a tretí rámec má index 3 atď.
- Číslo rámca je možné identifikovať aj pomocou ID rámca prvku. To je možné vykonať pomocou Kliknite pravým tlačidlom myši -> Skontrolovať prvok a vyhľadať iFrame. Overte, či má niektorý z rámcov iFrames atribút ID.
Vzorový prvok iframe na zdrojovom kóde bude vyzerať, ako je uvedené nižšie.
Keď je identifikované ID iFrame, môžeme ho použiť na prepnutie do rámca, ako je uvedené nižšie.
Príklady:
driver.switchTo.frame („a077aa5e“);
driver.switchTo.frame (0);
- Táto metóda vyvolá NoSuchFrameException, keď sa požadovaný rámec nenájde na aktuálnej webovej stránke.
# 2) switchTo.frame (reťazec frameName)
- Táto metóda umožňuje používateľom prepnúť na konkrétny rámec pomocou názvu rámca definovaného vývojárom.
- Názov rámu musí byť uzavretý v úvodzovkách, aby sa mohol považovať za parameter reťazca.
- Táto metóda vyvolá NoSuchFrameException, keď sa požadovaný rámec nenájde na aktuálnej webovej stránke.
Príklad:
V kóde uvedenom vyššie majú ID rámca aj názov rámca rovnakú hodnotu. Prepnúť na snímku sa dá dosiahnuť pomocou názvu snímky, ako je uvedené nižšie:
driver.switchTo.frame („a077aa5e“);
# 3) switchTo.frame (WebElement frameElement)
- Táto metóda umožňuje používateľom prepnúť na rámec na základe umiestnenia webového prvku.
- Táto metóda vyvolá NoSuchFrameException, keď požadovaný rámec nie je prítomný na webovej stránke, a StaleElementReferenceException, ak rámec zobrazený na webovej stránke nie je aktívny.
Príklad:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Prepínanie medzi prvkami iframe a nadradenou stránkou je možné dosiahnuť pomocou metódy driver.switchTo (). DefaultContent ().
- Upozorňujeme, že v seléne existuje podobná metóda na prepínanie medzi snímkami, ktoré sa nazývajú metóda driver.switchTo (). ParentFrame ().
- Rozdiel medzi driver.switchTo (). DefaultContent () a driver.switchTo (). ParentFrame () je v tom, že prvá metóda prepne kontrolu na hlavnú webovú stránku bez ohľadu na počet rámcov na webovej stránke, zatiaľ čo druhá metóda prepne riadenie na nadradený rámec aktuálneho rámca.
Príklad:
Predpokladajme, že v rámci nadradenej webovej stránky p1 sú tri rámce s názvom i1, i2 a i3. Rámce i1, i2 a i3 sú navzájom závislé, čo znamená, že jeden rámec bude rodičom druhého.
Pomocou metódy driver.switchTo (). DefaultContent () na ráme i3 sa ovládanie webového ovládača presunie na nadradenú stránku, p1. Zatiaľ čo metóda driver.switchTo (). ParentFrame () na ráme i3 prepína ovládací prvok späť na rám i2 atď.
Ukážka zdrojového kódu:
Ďalej je uvedený testovací scenár, ktorý sa má automatizovať pomocou prvkov iframe v seléne:
- Otvorte webovú stránku SoftwareTestingHelp.com.
- Nájdite všetky prvky HTML so značkou iframe, spočítajte počet výskytov prvku iFrame a vytlačte ich na konzolu.
- Prepnite na platný rámec na webovej stránke pomocou ID rámca a vytlačte zdrojový kód rámca.
- Zatvorte aktuálne okno prehľadávača.
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(); } }
Výstup kódu:
Otvorte webovú stránku: https://www.softwaretestinghelp.com
Prepnite na rám s názvom aswift_0.
Vytlačte počet prvkov iframe na webovej stránke v okne konzoly zatmenia.
Po prepnutí na rámček vytlačte na konzole zatmenia zdrojový kód rámu.
Vysvetlenie kódu:
- Inicializujeme objekt ovládača gecko pomocou metódy System.setProperty tak, aby ukazoval na cestu k súboru geckodriver.exe na lokálnom počítači.
- Potom vytvoríme inštanciu objektu ovládača FireFox prostredníctvom rozhrania WebDriver.
- Pomocou objektu ovládača firefox sa otvorí nasledujúca webová stránka: https://www.softwaretestinghelp.com.
- V ďalšom kroku identifikujeme počet prvkov iframe zobrazených na webovej stránke, spočítame ich a zobrazíme počet prvkov iframe na konzole zatmenia.
- Pomocou ID rámca prechádzame na rámec na webovej stránke. V uvedenom prípade je ID rámca „aswift_0“.
- Keď sme úspešne vykonali prepnutie na rám, tlačíme na konzolu zatmenia zdrojový kód rámu.
- Potom sa prepneme späť na nadradenú webovú stránku pomocou príkazu driver.switchTo (). DefaultContent () a nakoniec zatvoríme inštanciu webového ovládača pomocou metódy driver.quit.
Rozdiel medzi rámcom a iFrame v seléne
- Rám sa používa na rozdelenie stránky na viac častí, pričom v každej časti je nový obsah.
- Rám iFrame sa používa na vloženie obsahu externých webových stránok do webovej stránky, aby sa zabránilo problémom so skriptovaním medzi servermi.
- IFrame sa považuje za menej bezpečný ako rám, pretože iFrame umožňuje vývojárom vkladať obsah z webových stránok tretích strán. Preto iframe vyžaduje, aby vývojár dôveroval obsahu, ktorý vložil do iframe.
- Väčšina dnes vyvíjaných webových aplikácií nepoužíva na rozdelenie stránky rámce, ale na vloženie externého obsahu, ako sú napríklad reklamy, na webovú stránku používajú rámce iframe.
Manipulácia s dynamickými rámcami v seléne
- Na niektorých webových stránkach sa vlastnosti rámca, ako napríklad id rámca a názov rámca, môžu na webovej stránke dynamicky meniť, pozícia rámca však zostane rovnaká. V takom prípade sa nemôžeme spoľahnúť na jedinečnú identifikáciu rámca alebo jeho názvu.
- Môžeme použiť index rámu v takom prípade na jednoznačnú identifikáciu rámca na základe jeho polohy.
- V niektorých prípadoch sa hodnota ID rámca zmení zakaždým, keď sa stránka načíta, ale so statickým textom, ktorý sa nezmení. Napríklad , zvážte nasledujúci kód pre prvky iframe.
Vo vyššie uvedenom príklade zostáva text „frame_“ konštantný, zatiaľ čo sa číselná hodnota mení pri každom načítaní stránky.
- Vyššie uvedený rámec môžeme jednoznačne identifikovať pomocou nižšie uvedeného XPath
// iframe (contains (@ id, ‘frame‘))
AKTUALIZÁCIA v marci 2020
Ako nájsť prvky vo vnútri rámu
V seléne, aby sme mali prístup k prvkom nachádzajúcim sa vo vnútri rámu, je potrebné najskôr prepnúť do rámu a potom identifikovať prvky, ako to bežne robíme, pomocou rôznych lokátorov selénu. Váš selénový kód nedokáže nájsť vaše prvky bez prepnutia do IFrame.
Nasledujúca snímka obrazovky ukazuje, ako sú rámce vložené do kódu HTML:
Rôzne spôsoby prechodu na IFrame pomocou selénu
# 1) Použitie názvu alebo ID rámca
Prepnite na IFrame pomocou názvu rámca alebo ID rámca, niekedy bude v kóde buď názov rámca alebo id alebo obidva tieto názvy.
Syntax:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Používanie indexu rámcov
Vyhľadajte rám pomocou indexu rámu, ak je k dispozícii.
Syntax:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Používanie webového prvku
Nájdite rám pomocou lokátorov selénu .
Syntax:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Ďalšie operácie využívajúce rám
# 1) Prepnutie späť do rámca rodiča alebo predka
Prepnutie späť z rámca 3 do rámca 2 pomocou príkazu „switchTo.parentFrame“ .
Syntax:
driver.switchTo().parentFrame();
# 2) Prechod na akýkoľvek iný rámec
Ak chcete prepnúť z rámca 3 na rám 1 alebo na predvolený rámec, použite príkaz „switchTo.defaultContent“.
Syntax:
driver.switchTo().defaultContent();
V nižšie uvedenom kóde nájdeme textové pole názvu nachádzajúce sa vo vnútri rámca.
Čo keď sa to pokúsime nájsť priamo bez toho, aby sme prešli do rámu?
Pozrime sa na výsledok:
Kód zlyhal z dôvodu „Nepodarilo sa nájsť element: {„ method “:„ xpath “,„ selector “:„ // vstup (@ name = ‘name’) ”}}
Teraz prepnite do rámčeka pomocou webového prvku alebo povedzme pomocou lokátora selénu a vyhľadajte pole textového poľa.
Ďalej je uvedený kompletný kód pre prepnutie do rámu:
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'); } }
Výkon:
Takto musíme prepínať medzi rámcami na lokalizáciu prvkov pomocou selénu. Ak je na vašej webovej stránke viac rámcov, musíte ich prepnúť niekoľkokrát.
Záver
- iFrame je dokument HTML vložený do iného dokumentu HTML. Rámce iFrames sú v dokumente HTML výslovne uvedené pomocou značky HTML
- metóda switchTo.frame (int frameNumber) umožňuje používateľom prepnúť na konkrétny rámec pomocou id rámca.
- metóda switchTo.frame (string frameName) umožňuje používateľom prepnúť na konkrétny rámec pomocou názvu rámca definovaného vývojárom.
- Metóda switchTo.frame (WebElement frameElement) umožňuje používateľom prepnúť na rámec na základe umiestnenia webového prvku.
=> Skontrolujte VŠETKY návody na selén tu.
Odporúčané čítanie
- Výukový program Cucumber Selenium: Cucumber Java Selenium WebDriver Integration
- Úvod do softvéru Selenium WebDriver - Výučba selénu č. 8
- Implementácia nášho prvého skriptu WebDriver - výučba selénu WebDriver č. 10
- Časté otázky o seléne
- Ako zaobchádzať s upozorneniami alebo vyskakovacími oknami v selenovom webovom ovládači - selénský výukový program č. 16
- Zaobchádzanie s webovými tabuľkami, rámcami a dynamickými prvkami v selenovom skripte - selénský výukový program č. 18
- Implicitné a explicitné čakanie v ovládači selénu WebDriver (typy čakania na selén)
- Sprievodca generovaním rozsahu správ v selenovom webovom ovládači