handling iframes using selenium webdriver switchto method
c programmeringsintervjuer och svar pdf
Hantering av iFrames med hjälp av Selen WebDriver: Handledning med praktiska exempel
iFrame (inline frame) är ett HTML-dokument inbäddat i ett annat HTML-dokument.
iFrames används oftast för att visa annonser på en webbsida. iFrames nämns uttryckligen i HTML-dokument med hjälp av HTML-taggen
Denna handledning kommer att förklara för dig allt om hantering av iframes i Selenium tillsammans med de berörda kodexemplen för din enkla förståelse.
=> Läs igenom The Easy Selenium Training Series.
Vad du kommer att lära dig:
Hantering av iFrames med hjälp av selen
En iframe på en webbsida kan identifieras i Firefox-webbläsaren om alternativet 'Denna ram' visas på högerklickalternativen som visas nedan.
Alternativt kan vi också validera om en webbsida har några iframes genom att titta på källkoden och söka efter taggen
List iframes = driver.findElements(By.tagName(“iframe”));
Metoder som tillhandahålls av Selen för hantering av iFrames
Selen erbjuder följande inbyggda metoder för att växla fram och tillbaka från iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Denna metod tillåter användare att byta till en viss ram med ram-id.
- Ramnumret är ett nollbaserat indexvärde vilket innebär att den första ramen på webbsidan har index 0, den andra ramen har index 1 och den tredje ramen har index 3 och så vidare.
- Ramnummer kan också identifieras med elementets ram-ID. Detta kan göras av Högerklicka -> Inspektera element och sök efter iFrame. Validera om någon av iFrames har ett ID-attribut.
Exempel på iframe-element på källkoden skulle se ut som nämnts nedan.
När id för iFrame har identifierats kan vi använda samma för att växla till ramen som nedan.
Exempel:
driver.switchTo.frame (“a077aa5e”);
driver.switchTo.frame (0);
- Denna metod kastar NoSuchFrameException när den önskade ramen inte finns på den aktuella webbsidan.
# 2) switchTo.frame (string frameName)
- Den här metoden gör det möjligt för användare att byta till en viss ram med hjälp av ramens utvecklardefinierade namn.
- Ramnamnet måste ingå i dubbla citattecken för att det ska kunna betraktas som en strängparameter.
- Denna metod kastar NoSuchFrameException när den önskade ramen inte finns på den aktuella webbsidan.
Exempel:
I koden som nämns ovan har både ram-ID och ramnamn samma värde. Växling till ram kan utföras med ramnamnet enligt nedan:
driver.switchTo.frame (“a077aa5e”);
# 3) switchTo.frame (WebElement frameElement)
- Denna metod gör det möjligt för användare att växla till en ram baserat på platsen för webbelementet.
- Denna metod kastar NoSuchFrameException när den önskade ramen inte finns på webbsidan och StaleElementReferenceException om ramen som visas på webbsidan inte är aktiv.
Exempel:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Växling fram och tillbaka mellan iframes och överordnad sida kan uppnås med hjälp av driver.switchTo (). DefaultContent () -metoden.
- Observera att det finns en liknande metod i Selen för att växla mellan ramar som heter driver.switchTo (). ParentFrame () -metoden.
- Skillnaden mellan driver.switchTo (). DefaultContent () och driver.switchTo (). ParentFrame () är att den första metoden växlar kontrollen till huvudsidan oavsett antalet bilder på webbsidan, medan den andra metoden växlar kontrollen till den överordnade ramen för den aktuella ramen.
Exempel:
Antag att det finns tre ramar med namnet i1, i2 och i3 inom den överordnade webbsidan p1. Ramarna i1, i2 och i3 är beroende av varandra vilket innebär att en ram kommer att vara förälder till en annan.
Med hjälp av driver.switchTo (). DefaultContent () -metoden på ram i3 flyttar webbdrivrutinen till överordnad sida, p1. Medan driver.switchTo (). ParentFrame () -metoden på ram i3 byter kontrollen tillbaka till ram i2 och så vidare.
Källkodsexempel:
Nedan följer testscenariot som ska automatiseras med iframes i selen:
- Öppna webbplatsen SoftwareTestingHelp.com.
- Hitta alla HTML-element med taggen iframe, räkna antalet förekomster av iFrame och skriv ut den på en konsol.
- Byt till en giltig ram på webbsidan med ram-id och skriv ut källkoden för ramen.
- Stäng det aktuella webbläsarfönstret.
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(); } }
Kodutgång:
Öppna webbplatsen: https://www.softwaretestinghelp.com
Byt till ramen som heter aswift_0.
Skriv ut antalet iframes på webbsidan i Eclipse-konsolfönstret.
Skriv ut källkoden för ramen på förmörkelsekonsolen efter att du bytt till ramen.
Kodförklaring:
- Vi initialiserar ett objekt av gecko-drivrutinen med System.setProperty-metoden för att peka på geckodriver.exe-filvägen på den lokala maskinen.
- Vi installerar sedan ett objekt från FireFox-drivrutinen via WebDriver-gränssnittet.
- Med Firefox-drivrutinsobjektet öppnas följande webbsida: https://www.softwaretestinghelp.com.
- I nästa steg identifierar vi antalet iframe-element som visas på webbsidan, räknar dem och visar iframe-räkningen på förmörkelsekonsolen.
- Med hjälp av ram-id byter vi till ramen på webbsidan. I ovanstående fall är ram-id ”aswift_0”.
- När vi väl har bytt till ramen, skriver vi ut källkoden för ramen på förmörkelsekonsolen.
- Vi byter sedan tillbaka till den överordnade webbsidan med hjälp av driver.switchTo (). DefaultContent () uttalande och slutligen stänger webbdrivrutinsinstansen med metoden driver.quit.
Skillnad mellan ram och iFrame i selen
- En ram används för att dela upp en sida i flera sektioner med nytt innehåll i varje avsnitt.
- En iFrame används för att bädda in innehållet på de externa webbplatserna på webbsidan för att undvika skriptproblem på flera platser.
- En iFrame anses vara mindre säker än en ram, eftersom iFrame tillåter utvecklare att bädda in innehåll från tredje parts webbplatser. Således kräver en iframe att en utvecklare litar på innehållet som han har inbäddat i iframe.
- De flesta webbapplikationer som utvecklas idag använder inte ramar för att dela upp sidan, utan de använder iframes för att bädda in externt innehåll som annonser på webbsidan.
Hantering av dynamiska ramar i selen
- På vissa webbsidor kan ramegenskaper som ram-id och ramnamn ändras dynamiskt på en webbsida, men rampositionen förblir densamma. I ett sådant fall kan vi inte förlita oss på ram-id eller ramnamn för att identifiera en ram unikt.
- Vi kan använda ramindex i ett sådant fall att unikt identifiera ramen baserat på rampositionen.
- I vissa fall ändras ram-ID-värdet varje gång sidan laddas, men med en statisk text som inte ändras. Till exempel , beakta nedanstående kod för iframes.
I exemplet ovan förblir texten 'ram_' konstant medan det numeriska värdet ändras för varje sidbelastning.
- Vi kan identifiera ovanstående ram unikt med hjälp av nedanstående XPath
// iframe (innehåller (@ id, 'ram'))
UPPDATERING mars 2020
Hur man hittar elementen inuti ramen
För att få åtkomst till elementen som finns i ramen måste vi först byta in i ramen och sedan identifiera elementen som vi normalt gör med olika Selen-lokaliserare. Din Selen-kod kan inte hitta dina element utan att byta till IFrame.
Nedanstående skärmdump visar hur ramar är inbäddade i en HTML-kod:
Olika sätt att byta till en IF-ram med selen
# 1) Använda ramnamn eller id
Byt till IFrame med ramnamn eller ram-id, ibland kommer antingen ramnamn eller id eller båda att finnas i en kod.
Syntax:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Använda ramindex
Leta reda på ramen med hjälp av ramindex om det finns tillgängligt.
Syntax:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Använda webbelement
Leta reda på ramen med hjälp av Selen-lokalisatorer .
Syntax:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Andra funktioner med ram
# 1) Växla tillbaka till förälder- eller förfäderramen
Växla tillbaka från ram 3 till bild 2 med kommandot 'switchTo.parentFrame' .
Syntax:
driver.switchTo().parentFrame();
# 2) Växla till någon annan ram
Om du vill byta från ram 3 till ram 1 eller standardramen, använd sedan kommandot 'switchTo.defaultContent'.
Syntax:
driver.switchTo().defaultContent();
I koden nedan hittar vi en namntextruta som finns i en ram.
Vad händer om vi försöker hitta den direkt utan att byta till ramen?
Låt oss se resultatet:
Koden misslyckades med anledningen ”Det gick inte att hitta element: {“ metod ”:” xpath ”,” selector ”:” // input (@ name = ’name’) ”}
Byt nu in i ramen med Web Element eller säg med Selenium locator och leta reda på textrutans fält.
Nedan följer den kompletta koden för att växla inuti ramen:
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'); } }
Produktion:
Så här måste vi växla mellan ramarna för att lokalisera elementen med hjälp av Selen. Om det finns flera ramar på din webbsida måste du byta flera gånger.
Slutsats
- iFrame är ett HTML-dokument inbäddat i ett annat HTML-dokument. iFrames nämns uttryckligen i HTML-dokumentet med HTML-taggen
- switchTo.frame (int frameNumber) -metoden gör att användarna kan växla till en viss ram med ram-id.
- switchTo.frame (string frameName) -metoden låter användarna byta till en viss ram med hjälp av ramens utvecklardefinierade namn.
- switchTo.frame (WebElement frameElement) -metoden tillåter användare att växla till en ram baserat på platsen för webbelementet.
=> Kontrollera ALLA Selen-handledning här.
Rekommenderad läsning
- Gurkselen-handledning: Gurka Java Selen WebDriver-integration
- Introduktion till Selen WebDriver - Selen Tutorial # 8
- Implementation of Our First WebDriver Script - Selenium WebDriver Tutorial # 10
- Vanliga frågor om selen
- Hur man hanterar varningar / popup-fönster i Selen WebDriver - Selen Tutorial # 16
- Hantering av webbtabeller, ramar och dynamiska element i Selen Script - Selen Tutorial # 18
- Implicit och Explicit Wait i Selen WebDriver (Typer av Selen Waits)
- Guide för att generera omfattande rapporter i Selen WebDriver