handling iframes using selenium webdriver switchto method
hvordan du spiller shockwave flash-objekter
Håndtering av iFrames ved hjelp av Selen WebDriver: praktisk veiledning med praktiske eksempler
iFrame (innebygd ramme) er et HTML-dokument innebygd i et annet HTML-dokument.
iFrames brukes oftest til å vise annonser på en webside. iFrames er nevnt eksplisitt i HTML-dokument ved hjelp av HTML-koden
Denne opplæringen vil forklare deg alt om håndtering av iframes i Selenium sammen med de aktuelle kodeeksemplene for enkel forståelse.
=> Les gjennom Easy Selenium Training Series.
Hva du vil lære:
- Håndtering av iFrames ved bruk av selen
- OPPDATERING mars 2020
- Konklusjon
Håndtering av iFrames ved bruk av selen
En iframe på en webside kan identifiseres i Firefox-nettleseren hvis alternativet 'Denne rammen' vises på høyreklikkalternativene som vist nedenfor.
Alternativt kan vi også validere om en webside har noen iframes ved å se på kildekoden og søke etter taggen
List iframes = driver.findElements(By.tagName(“iframe”));
Metoder levert av Selen for håndtering av iFrames
Selen gir følgende innebygde metoder for å bytte frem og tilbake fra iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Denne metoden lar brukerne bytte til en bestemt ramme ved hjelp av ramme-ID.
- Rammenummeret er en nullbasert indeksverdi som betyr at den første rammen på websiden har indeksen 0, den andre rammen har indeksen 1 og den tredje rammen har indeksen 3 og så videre.
- Rammenummer kan også identifiseres ved hjelp av ramme-ID for elementet. Dette kan gjøres av Høyreklikk -> Inspiser element og søk etter iFrame. Valider hvis noen av iFrames har et ID-attributt.
Eksempel på iframe-element på kildekoden vil se ut som nevnt nedenfor.
Når id for iFrame er identifisert, kan vi bruke det samme for å bytte til rammen som nedenfor.
Eksempler:
driver.switchTo.frame (“a077aa5e”);
driver.switchTo.frame (0);
- Denne metoden kaster NoSuchFrameException når den nødvendige rammen ikke finnes på den gjeldende websiden.
# 2) switchTo.frame (string frameName)
- Denne metoden lar brukerne bytte til en bestemt ramme ved hjelp av det utviklerdefinerte navnet på rammen.
- Rammenavnet må være omsluttet av doble anførselstegn for at det skal betraktes som en strengparameter.
- Denne metoden kaster NoSuchFrameException når den nødvendige rammen ikke finnes på den gjeldende websiden.
Eksempel:
I koden nevnt ovenfor har både ramme-ID og rammenavn samme verdi. Bytt til ramme kan oppnås ved å bruke rammenavnet som nedenfor:
driver.switchTo.frame (“a077aa5e”);
# 3) switchTo.frame (WebElement frameElement)
- Denne metoden lar brukerne bytte til en ramme basert på plasseringen av Web Element.
- Denne metoden kaster NoSuchFrameException når den nødvendige rammen ikke er tilstede på websiden og StaleElementReferenceException hvis rammen som vises på websiden ikke er aktiv.
Eksempel:
WebElement frameElement = driver.findElement (By.id (“a077aa5e”));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Bytte frem og tilbake mellom iframes og foreldresiden kan oppnås ved hjelp av driver.switchTo (). DefaultContent () -metoden.
- Vær oppmerksom på at det er en lignende metode i Selen for å bytte mellom rammer som heter driver.switchTo (). ParentFrame () -metoden.
- Forskjellen mellom driver.switchTo (). DefaultContent () og driver.switchTo (). ParentFrame () er at den første metoden bytter kontrollen til hovedsiden uavhengig av antall bilder på websiden, mens den andre metoden bytter kontrollen til foreldrerammen til gjeldende ramme.
Eksempel:
Anta at det er tre rammer kalt i1, i2 og i3 på den overordnede nettsiden p1. Rammer i1, i2 og i3 er avhengige av hverandre, noe som betyr at en ramme vil være foreldren til en annen.
Ved hjelp av driver.switchTo (). DefaultContent () -metoden på ramme i3 flytter webdriverkontrollen til overordnet side, p1. Mens driver.switchTo (). ParentFrame () -metoden på ramme i3 bytter kontrollen tilbake til ramme i2 og så videre.
Kildekodeeksempel:
Nedenfor er testscenariet som skal automatiseres ved bruk av iframes i selen:
- Åpne SoftwareTestingHelp.com-nettstedet.
- Finn alle HTML-elementene med taggen iframe, tell antall forekomster av iFrame og skriv den ut på en konsoll.
- Bytt til en gyldig ramme på websiden ved hjelp av ramme-ID og skriv ut kildekoden til rammen.
- Lukk det nåværende nettleservinduet.
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(); } }
Kodeutgang:
Åpne nettstedet: https://www.softwaretestinghelp.com
Bytt til rammen som heter aswift_0.
Skriv ut antall iframes på websiden i formørkelseskonsollvinduet.
Skriv ut kildekoden til rammen på formørkelseskonsollen etter at du har byttet til rammen.
Kode Forklaring:
- Vi initialiserer et objekt av gecko-driveren ved hjelp av System.setProperty-metoden for å peke på geckodriver.exe-filbanen på den lokale maskinen.
- Vi instantierer deretter et objekt fra FireFox-driveren gjennom WebDriver-grensesnittet.
- Ved hjelp av Firefox-driverobjektet åpnes følgende webside: https://www.softwaretestinghelp.com.
- I neste trinn identifiserer vi antall iframe-elementer som vises på websiden, teller dem og viser iframe-antall på formørkelseskonsollen.
- Ved å bruke ramme-ID bytter vi til rammen på websiden. I ovennevnte tilfelle er ramme-iden 'aswift_0'.
- Når vi har byttet til rammen med suksess, skriver vi ut kildekoden til rammen på formørkelseskonsollen.
- Vi bytter deretter tilbake til den overordnede nettsiden ved hjelp av driver.switchTo (). DefaultContent () -uttalelse og til slutt stenger webdriverinstansen ved hjelp av metoden driver.quit.
Forskjellen mellom ramme og iFrame i selen
- En ramme brukes til å dele en side i flere seksjoner, med nytt innhold på hver seksjon.
- En iFrame brukes til å bygge innholdet på de eksterne nettstedene inn på websiden, for å unngå skriptsaker på tvers av nettsteder.
- En iFrame anses å være mindre sikker enn en ramme, da iFrame tillater utviklere å bygge inn innhold fra tredjeparts nettsteder. Dermed krever en iframe at en utvikler stoler på innholdet som han har innebygd i iframe.
- De fleste av webapplikasjonene som utvikles i dag, bruker ikke rammer for å dele siden, men de bruker iframes for å legge inn eksternt innhold, for eksempel annonser på websiden.
Håndtering av dynamiske rammer i selen
- På noen nettsider kan rammeegenskaper som ramme-ID og rammenavn endres dynamisk på en webside, men rammeposisjonen forblir den samme. I et slikt tilfelle kan vi ikke stole på ramme-ID eller rammenavn for å identifisere en ramme unikt.
- Vi kan bruke rammeindeks i et slikt tilfelle å identifisere rammen unikt basert på rammeposisjonen.
- I noen tilfeller endres ramme-ID-verdien hver gang siden lastes inn, men med en statisk tekst som ikke endres. For eksempel , vurder koden nedenfor for iframes.
I eksemplet ovenfor forblir teksten ‘frame_’ konstant mens den numeriske verdien endres for hver sideinnlasting.
- Vi kan identifisere rammen ovenfor unikt ved å bruke nedenstående XPath
// iframe (inneholder (@ id, ’ramme’))
OPPDATERING mars 2020
Hvordan finne elementene inne i rammen
For å få tilgang til elementene som er tilstede i rammen, i Selen, må vi først bytte inne i rammen og deretter identifisere elementene slik vi vanligvis gjør ved hjelp av forskjellige Selen-lokalisatorer. Selen-koden din finner ikke elementene dine uten å bytte til IFrame.
Skjermbildet nedenfor viser hvordan rammer er innebygd i en HTML-kode:
Ulike måter å bytte til en IFramme ved hjelp av selen
# 1) Bruk av rammenavn eller id
Bytt til IFrame ved å bruke rammenavn eller ramme-ID, noen ganger vil enten rammenavn eller id eller begge være til stede i en kode.
Syntaks:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Bruke rammeindeks
Finn rammen ved hjelp av rammeindeksen hvis tilgjengelig.
Syntaks:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Bruke Web Element
Finn rammen ved hjelp av Selenium locators .
Syntaks:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Andre operasjoner ved bruk av ramme
# 1) Bytte tilbake til foreldre- eller forfedrerammen
Bytte tilbake fra ramme 3 til ramme 2 ved å bruke kommandoen “switchTo.parentFrame” .
Syntaks:
driver.switchTo().parentFrame();
# 2) Bytte til en hvilken som helst annen ramme
Hvis du vil bytte fra ramme 3 til ramme 1 eller standardrammen, bruker du kommandoen 'switchTo.defaultContent'.
Syntaks:
driver.switchTo().defaultContent();
I koden nedenfor finner vi en navnetekstboks i en ramme.
Hva om vi prøver å finne den direkte uten å bytte til rammen?
La oss se resultatet:
Koden mislyktes med årsaken “Kan ikke finne element: {“ metode ”:” xpath ”,” selector ”:” // input (@ name = ’name’) ”}
Bytt nå inn i rammen ved hjelp av Web Element, eller si med Selenium locator og finn tekstfeltfeltet.
Nedenfor er den komplette koden for bytte inne i rammen:
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'); } }
Produksjon:
Slik må vi bytte mellom rammene for å lokalisere elementene ved hjelp av Selen. Hvis det er flere bilder på websiden din, må du bytte flere ganger.
Konklusjon
- iFrame er et HTML-dokument innebygd i et annet HTML-dokument. iFrames nevnes eksplisitt i HTML-dokumentet ved hjelp av HTML-koden
- switchTo.frame (int frameNumber) -metoden lar brukerne bytte til en bestemt ramme ved hjelp av ramme-id.
- switchTo.frame (string frameName) -metoden lar brukerne bytte til en bestemt ramme ved hjelp av det utviklerdefinerte navnet på rammen.
- switchTo.frame (WebElement frameElement) -metoden lar brukerne bytte til en ramme basert på plasseringen av Web Element.
=> Sjekk ALLE Selen-opplæringsprogrammer her.
Anbefalt lesing
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- Introduksjon til Selen WebDriver - Selenium Tutorial # 8
- Implementering av vårt første WebDriver Script - Selenium WebDriver Tutorial # 10
- Vanlige spørsmål om selen
- Hvordan håndtere varsler / popup-vinduer i Selen WebDriver - Selenium-veiledning nr. 16
- Håndtering av nettbord, rammer og dynamiske elementer i Selenium Script - Selenium Tutorial # 18
- Implisitt og eksplisitt ventetid i Selen WebDriver (Typer Selen Waits)
- Veiledning for å generere omfattende rapporter i Selenium WebDriver