handling iframes using selenium webdriver switchto method
Dotazy a odpovědi na server SQL Server po dobu 5 let zkušeností
Manipulace s iFrames pomocí Selenium WebDriver: Praktický výukový program s praktickými příklady
iFrame (vložený snímek) je dokument HTML vložený do jiného dokumentu HTML.
iFrames se nejčastěji používají k zobrazování reklam na webové stránce. Rámce iFrames jsou v dokumentu HTML výslovně uvedeny pomocí značky HTML
V tomto kurzu vám vysvětlíme vše o manipulaci s prvky iframe v selenu spolu s příslušnými příklady kódu pro vaše snadné pochopení.
=> Přečtěte si sérii Easy Selenium Training Series.
Co se naučíte:
Manipulace s iFrames pomocí selenu
Iframe na webové stránce lze identifikovat v prohlížeči Firefox, pokud je u možností s pravým tlačítkem myši zobrazena možnost s názvem „Tento rámec“, jak je uvedeno níže.
Alternativně můžeme také ověřit, zda má webová stránka nějaké iframe, když se podíváme na zdrojový kód a vyhledáme značku
List iframes = driver.findElements(By.tagName(“iframe”));
Metody poskytované selenem pro zpracování iFrames
Selen poskytuje následující vestavěné metody pro přepínání mezi iframe a zpět.
- switchTo.frame (int frameNumber)
- switchTo.frame (řetězec frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Tato metoda umožňuje uživatelům přepnout na konkrétní snímek pomocí ID rámce.
- Číslo snímku je nulová hodnota indexu, což znamená, že první snímek webové stránky má index 0, druhý snímek má index 1 a třetí snímek má index 3 atd.
- Číslo rámečku lze také identifikovat pomocí ID rámečku prvku. To lze provést pomocí Klikněte pravým tlačítkem -> Zkontrolovat prvek a vyhledejte iFrame. Ověřte, zda některý z iFrames má atribut ID.
Ukázkový prvek iframe ve zdrojovém kódu bude vypadat, jak je uvedeno níže.
Jakmile je identifikováno ID iFrame, můžeme použít stejné k přepnutí na rámec, jak je uvedeno níže.
Příklady:
driver.switchTo.frame („a077aa5e“);
driver.switchTo.frame (0);
- Tato metoda vyvolá NoSuchFrameException, když se požadovaný snímek na aktuální webové stránce nenajde.
# 2) switchTo.frame (řetězec frameName)
- Tato metoda umožňuje uživatelům přepnout na konkrétní rámec pomocí názvu rámce definovaného vývojářem.
- Název rámce musí být uzavřen do uvozovek, aby mohl být považován za parametr řetězce.
- Tato metoda vyvolá NoSuchFrameException, když se požadovaný snímek na aktuální webové stránce nenajde.
Příklad:
V kódu uvedeném výše mají ID rámce i název rámce stejnou hodnotu. Přepnutí na snímek lze provést pomocí názvu rámečku, jak je uvedeno níže:
driver.switchTo.frame („a077aa5e“);
# 3) switchTo.frame (WebElement frameElement)
- Tato metoda umožňuje uživatelům přepnout na rámec na základě umístění webového prvku.
- Tato metoda vyvolá NoSuchFrameException, když požadovaný rámec není na webové stránce k dispozici, a StaleElementReferenceException, pokud rámec zobrazený na webové stránce není aktivní.
Příklad:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Přepínání tam a zpět mezi prvky iframe a nadřazenou stránkou lze dosáhnout pomocí metody driver.switchTo (). DefaultContent ().
- Vezměte prosím na vědomí, že v selenu existuje podobná metoda pro přepínání mezi snímky s názvem driver.switchTo (). ParentFrame ().
- Rozdíl mezi driver.switchTo (). DefaultContent () a driver.switchTo (). ParentFrame () je v tom, že první metoda přepne ovládací prvek na hlavní webovou stránku bez ohledu na počet rámců na webové stránce, zatímco druhá metoda přepne ovládací prvek na nadřazený rámec aktuálního rámce.
Příklad:
Předpokládejme, že na nadřazené webové stránce p1 jsou tři snímky s názvem i1, i2 a i3. Rámečky i1, i2 a i3 jsou na sobě navzájem závislé, což znamená, že jeden snímek bude rodičem druhého.
Pomocí metody driver.switchTo (). DefaultContent () na snímku i3 se ovládací prvek webového ovladače přesune na nadřazenou stránku, p1. Zatímco metoda driver.switchTo (). ParentFrame () na snímku i3 přepne ovládání zpět na snímek i2 atd.
Ukázka zdrojového kódu:
Níže je uveden testovací scénář, který má být automatizován pomocí prvků iframe v selenu:
- Otevřete web SoftwareTestingHelp.com.
- Najděte všechny prvky HTML se značkou iframe, spočítejte počet výskytů prvku iFrame a vytiskněte jej na konzole.
- Přepněte na platný rámec na webové stránce pomocí ID rámce a vytiskněte zdrojový kód rámce.
- Zavřete aktuální okno prohlížeče.
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:
Otevřete web: https://www.softwaretestinghelp.com
Přepněte na rámec s názvem aswift_0.
Vytiskněte počet prvků iframe na webové stránce v okně konzoly zatmění.
Po přepnutí na rámeček vytiskněte zdrojový kód rámečku na konzole zatmění.
Vysvětlení kódu:
- Inicializujeme objekt ovladače gecko pomocí metody System.setProperty tak, aby ukazoval na cestu k souboru geckodriver.exe na místním počítači.
- Poté vytvoříme instanci objektu ovladače FireFox prostřednictvím rozhraní WebDriver.
- Pomocí objektu ovladače firefox se otevře následující webová stránka: https://www.softwaretestinghelp.com.
- V dalším kroku identifikujeme počet prvků iframe zobrazených na webové stránce, spočítáme je a zobrazíme počet prvků iframe na konzole zatmění.
- Pomocí ID rámce přecházíme na rámec na webové stránce. Ve výše uvedeném případě je ID rámce „aswift_0“.
- Jakmile jsme úspěšně provedli přepnutí do rámečku, tiskneme zdrojový kód rámečku na konzoli zatmění.
- Poté přepneme zpět na nadřazenou webovou stránku pomocí příkazu driver.switchTo (). DefaultContent () a nakonec zavřeme instanci webového ovladače pomocí metody driver.quit.
Rozdíl mezi Frame a iFrame v selenu
- Rámec se používá k rozdělení stránky na více sekcí, přičemž v každé sekci je nový obsah.
- IFrame se používá k vložení obsahu externích webů na webovou stránku, aby se předešlo problémům se skriptováním mezi weby.
- IFrame je považován za méně bezpečný než rámec, protože iFrame umožňuje vývojářům vkládat obsah z webů třetích stran. Iframe tedy vyžaduje, aby vývojář důvěřoval obsahu, který vložil do iframe.
- Většina dnes vyvíjených webových aplikací nepoužívá k rozdělení stránky rámce, ale k vložení externího obsahu, jako jsou reklamy, na webovou stránku používají prvky iframe.
Manipulace s dynamickými rámečky na selenu
- Na některých webových stránkách se vlastnosti rámce, jako je id rámce a název rámce, mohou na webové stránce dynamicky měnit, pozice rámce však zůstane stejná. V takovém případě se nemůžeme spolehnout na jednoznačnou identifikaci rámce nebo jeho názvu.
- Můžeme použít index snímků v takovém případě jednoznačně identifikovat rámec na základě polohy rámce.
- V některých případech se hodnota ID rámce změní pokaždé, když se stránka načte, ale se statickým textem, který se nezmění. Například zvažte níže uvedený kód pro prvky iframe.
Ve výše uvedeném příkladu zůstává text „frame_“ konstantní, zatímco číselná hodnota se mění s každým načtením stránky.
- Výše uvedený snímek můžeme jednoznačně identifikovat pomocí níže uvedeného XPath
// iframe (contains (@ id, ‘frame‘))
AKTUALIZACE v březnu 2020
Jak najít prvky uvnitř rámu
V selenu, abychom získali přístup k prvkům přítomným uvnitř rámečku, musíme nejprve přepnout dovnitř rámečku a poté identifikovat prvky, jak to běžně děláme pomocí různých lokátorů selenu. Váš selenový kód nemůže najít vaše prvky bez přepnutí do IFrame.
Následující snímek obrazovky ukazuje, jak jsou rámce vloženy do kódu HTML:
Různé způsoby přepnutí na IFrame pomocí selenu
# 1) Použití názvu nebo ID rámečku
Přepněte na IFrame pomocí názvu rámce nebo ID rámce, někdy bude v kódu uveden název rámce nebo ID nebo obojí.
Syntax:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Použití indexu snímků
Vyhledejte rámeček pomocí indexu rámečku, pokud je k dispozici.
Syntax:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Použití webového prvku
Vyhledejte rám pomocí lokátorů selenu .
Syntax:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Další operace využívající rám
# 1) Přepnutí zpět do rámce rodiče nebo předka
Přepnutí zpět z rámečku 3 do rámečku 2 pomocí příkazu „switchTo.parentFrame“ .
Syntax:
driver.switchTo().parentFrame();
# 2) Přepnutí na jakýkoli jiný snímek
Pokud chcete přepnout z rámečku 3 na rámeček 1 nebo výchozí rámeček, použijte příkaz „switchTo.defaultContent“.
Syntax:
driver.switchTo().defaultContent();
V níže uvedeném kódu vyhledáme textové pole pro jméno, které se nachází uvnitř rámečku.
Co když se to pokusíme najít přímo bez přepnutí do rámečku?
Podívejme se na výsledek:
Kód se nezdařil z důvodu „Nelze najít prvek: {„ method “:„ xpath “,„ selector “:„ // input (@ name = ‘name’) ”}}
Nyní přepněte do rámečku pomocí webového prvku nebo řekněte pomocí lokátoru selenu a vyhledejte pole textového pole.
Níže je uveden kompletní kód pro přepínání uvnitř rámečku:
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ýstup:
Takto musíme přepínat mezi snímky pro lokalizaci prvků pomocí selenu. Pokud je na vaší webové stránce více rámců, musíte je přepnout několikrát.
Závěr
- iFrame je dokument HTML vložený do jiného dokumentu HTML. Rámce iFrames jsou v dokumentu HTML výslovně uvedeny pomocí značky HTML
- metoda switchTo.frame (int frameNumber) umožňuje uživatelům přepnout na konkrétní snímek pomocí ID rámce.
- metoda switchTo.frame (string frameName) umožňuje uživatelům přepnout na konkrétní snímek pomocí názvu rámce definovaného vývojářem.
- metoda switchTo.frame (WebElement frameElement) umožňuje uživatelům přepnout na rámec na základě umístění webového prvku.
=> Podívejte se na VŠECHNY výukové programy selenu zde.
Doporučené čtení
- Cucumber Selenium Tutorial: Cucumber Java Selenium WebDriver Integration
- Úvod do selenu WebDriver - Selenium Tutorial # 8
- Implementace našeho prvního skriptu WebDriver - výuka selenu WebDriver # 10
- Selenium FAQ
- Jak zpracovat upozornění / vyskakovací okna v Selenium WebDriver - Selenium Tutorial # 16
- Manipulace s webovými tabulkami, rámy a dynamickými prvky v selenovém skriptu - Selenium Tutorial # 18
- Implicitní a explicitní čekání v selenu WebDriver (typy čekání na selen)
- Průvodce generováním rozsahu zpráv v selenu WebDriver