handling iframes using selenium webdriver switchto method
tools voor het verzamelen van vereisten die worden gebruikt door bedrijfsanalisten
Omgaan met iFrames met Selenium WebDriver: praktische zelfstudie met praktische voorbeelden
iFrame (inline frame) is een HTML-document dat is ingesloten in een ander HTML-document.
iFrames worden meestal gebruikt voor het weergeven van advertenties op een webpagina. iFrames worden expliciet vermeld op HTML-documenten met behulp van de HTML-tag
Deze tutorial legt je alles uit over het omgaan met iframes in Selenium, samen met de betrokken codevoorbeelden voor een gemakkelijk begrip.
Lees de Easy Selenium Training Series door.
Wat je leert:
- Omgaan met iFrames met behulp van selenium
- UPDATE op maart 2020
- Gevolgtrekking
Omgaan met iFrames met behulp van selenium
Een iframe binnen een webpagina kan worden geïdentificeerd in de Firefox-browser als de optie met de naam ‘Dit frame’ wordt weergegeven bij de rechtsklikopties, zoals hieronder weergegeven.
Als alternatief kunnen we ook valideren of een webpagina iframes heeft door naar de broncode te kijken en naar de tag te zoeken
Methoden geleverd door Selenium voor het omgaan met iFrames
Selenium biedt de volgende ingebouwde methoden om heen en weer te schakelen tussen iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (tekenreeks frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Met deze methode kunnen gebruikers overschakelen naar een bepaald frame met behulp van de frame-ID.
- Het framenummer is een op nul gebaseerde indexwaarde, wat betekent dat het eerste frame van de webpagina de index 0 heeft, het tweede frame de index 1 en het derde frame de index 3 enzovoort.
- Het framenummer kan ook worden geïdentificeerd met behulp van de frame-ID van het element. Dit kan gedaan worden door Klik met de rechtermuisknop -> Inspecteer element en zoek naar het iFrame. Valideer of een van de iFrames een ID-kenmerk heeft.
Voorbeeld van een iframe-element op de broncode zou eruitzien zoals hieronder vermeld.
Zodra de id van het iFrame is geïdentificeerd, kunnen we dezelfde gebruiken om over te schakelen naar het frame zoals hieronder.
Voorbeelden:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Deze methode genereert NoSuchFrameException wanneer het vereiste frame niet op de huidige webpagina wordt gevonden.
# 2) switchTo.frame (string frameName)
- Met deze methode kunnen gebruikers naar een bepaald frame overschakelen met de door de ontwikkelaar gedefinieerde naam van het frame.
- De framenaam moet tussen dubbele aanhalingstekens staan om te worden beschouwd als een String-parameter.
- Deze methode genereert NoSuchFrameException wanneer het vereiste frame niet op de huidige webpagina wordt gevonden.
Voorbeeld:
In de hierboven genoemde code hebben zowel de frame-ID als de framenaam dezelfde waarde. Overschakelen naar frame kan worden bereikt met behulp van de framenaam, zoals hieronder:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Met deze methode kunnen gebruikers overschakelen naar een frame op basis van de locatie van het webelement.
- Deze methode genereert NoSuchFrameException wanneer het vereiste frame niet aanwezig is op de webpagina en StaleElementReferenceException als het frame dat op de webpagina wordt weergegeven niet actief is.
Voorbeeld:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- U kunt heen en weer schakelen tussen iframes en de bovenliggende pagina met de methode driver.switchTo (). DefaultContent ().
- Merk op dat er een vergelijkbare methode is in Selenium om tussen frames te schakelen met de naam driver.switchTo (). ParentFrame () methode.
- Het verschil tussen driver.switchTo (). DefaultContent () en driver.switchTo (). ParentFrame () is dat de eerste methode de besturing naar de hoofdwebpagina schakelt, ongeacht het aantal frames op de webpagina, terwijl de tweede methode schakelt de besturing naar het bovenliggende frame van het huidige frame.
Voorbeeld:
Stel dat er drie frames zijn met de naam i1, i2 en i3 binnen de bovenliggende webpagina p1. Frames i1, i2 en i3 zijn afhankelijk van elkaar, wat betekent dat het ene frame de ouder is van het andere.
Met de methode driver.switchTo (). DefaultContent () op frame i3, wordt de besturing van het webstuurprogramma verplaatst naar de bovenliggende pagina, p1. Terwijl de methode driver.switchTo (). ParentFrame () op frame i3 de besturing terugschakelt naar frame i2 enzovoort.
Broncode voorbeeld:
Hieronder ziet u het testscenario dat moet worden geautomatiseerd met iframes in selenium:
- Open de website SoftwareTestingHelp.com.
- Zoek alle HTML-elementen met de tag iframe, tel het aantal keren dat het iFrame voorkomt en druk het af op een console.
- Schakel over naar een geldig frame op de webpagina met behulp van de frame-ID en druk de broncode van het frame af.
- Sluit het huidige browservenster.
Code-uitvoer:
Open de website: https://www.softwaretestinghelp.com
Schakel over naar het frame met de naam aswift_0.
Druk het aantal iframes op de webpagina af in het eclipse-consolevenster.
Druk de broncode van het frame af op de eclipse-console nadat u naar het frame bent overgeschakeld.
Code Verklaring:
- We initialiseren een object van een gekko-stuurprogramma met behulp van de System.setProperty-methode om naar het bestandspad geckodriver.exe op de lokale computer te verwijzen.
- We instantiëren vervolgens een object van de FireFox-driver via de WebDriver-interface.
- Met behulp van het firefox-driverobject wordt de volgende webpagina: https://www.softwaretestinghelp.com geopend.
- In de volgende stap identificeren we het aantal iframe-elementen dat op de webpagina wordt weergegeven, tellen we ze en geven we het iframe-aantal weer op de eclipse-console.
- Met behulp van de frame-ID schakelen we over naar het frame op de webpagina. In het bovenstaande geval is de frame-ID ‘aswift_0’.
- Als we eenmaal met succes naar het frame zijn overgeschakeld, drukken we de broncode van het frame af op de eclipse-console.
- We schakelen dan terug naar de bovenliggende webpagina met de instructie driver.switchTo (). DefaultContent () en sluiten ten slotte de webdriverinstantie met de methode driver.quit.
Verschil tussen Frame en iFrame in Selenium
- Een frame wordt gebruikt om een pagina in meerdere secties te verdelen, met nieuwe inhoud voor elke sectie.
- Een iFrame wordt gebruikt om de inhoud van de externe websites in de webpagina in te bedden, om cross-site scripting-problemen te voorkomen.
- Een iFrame wordt als minder veilig beschouwd dan een frame, aangezien iFrame ontwikkelaars in staat stelt inhoud van websites van derden in te sluiten. Een iframe vereist dus dat een ontwikkelaar de inhoud vertrouwt die hij in het iframe heeft ingesloten.
- De meeste webtoepassingen die tegenwoordig worden ontwikkeld, gebruiken geen frames om de pagina te verdelen, maar gebruiken iframes om externe inhoud, zoals advertenties, in de webpagina in te sluiten.
Omgaan met dynamische frames in selenium
- Op sommige webpagina's kunnen frame-eigenschappen zoals frame-id en framenaam dynamisch op een webpagina veranderen, maar de framepositie blijft hetzelfde. In dat geval kunnen we niet vertrouwen op de frame-ID of framenaam om een frame uniek te identificeren.
- We kunnen de frame-index in dat geval om het frame uniek te identificeren op basis van de framepositie.
- In sommige gevallen verandert de frame-ID-waarde elke keer dat de pagina wordt geladen, maar met een statische tekst die niet verandert. Bijvoorbeeld , overweeg dan de onderstaande code voor iframes.
In het bovenstaande voorbeeld blijft de tekst ‘frame_’ constant terwijl de numerieke waarde verandert met elke pagina die wordt geladen.
- We kunnen het bovenstaande frame uniek identificeren met behulp van het onderstaande XPath
// iframe (bevat (@ id, ’frame’))
UPDATE op maart 2020
Hoe de elementen in het frame te vinden
Om in Selenium toegang te krijgen tot de elementen die in het frame aanwezig zijn, moeten we eerst binnen het frame schakelen en vervolgens de elementen identificeren zoals we normaal doen met behulp van verschillende Selenium-locators. Uw Selenium-code kan uw elementen niet vinden zonder over te schakelen naar IFrame.
De onderstaande schermafbeelding laat zien hoe frames zijn ingesloten in een HTML-code:
Verschillende manieren om over te schakelen naar een IFrame met selenium
# 1) Framenaam of id gebruiken
Schakel over naar IFrame met framenaam of frame-id, soms zijn ofwel framenaam of id of beide aanwezig in een code.
Syntaxis:
# 2) Frame-index gebruiken
Zoek het frame met behulp van de frame-index, indien beschikbaar.
Syntaxis:
# 3) Webelement gebruiken
Lokaliseer het frame met behulp van Selenium-locators
Syntaxis:
Andere bewerkingen met Frame
# 1) Terugschakelen naar het ouder- of voorouderframe
Terugschakelen van frame 3 naar frame 2 met de opdracht 'switchTo.parentFrame'
Syntaxis:
# 2) Overschakelen naar een ander frame
Als je wilt overschakelen van frame 3 naar frame 1 of het standaardframe, gebruik dan de opdracht “switchTo.defaultContent”.
Syntaxis:
In de onderstaande code zoeken we een naamtekstvak in een frame.
Wat als we het rechtstreeks proberen te lokaliseren zonder naar het frame te schakelen?
Laten we eens kijken naar het resultaat:
Code mislukt met de reden 'Kan element niet vinden: {' method ':' xpath ',' selector ':' // input (@ name = ’name’) '}
Schakel nu binnen het frame met behulp van Web Element of zeg met Selenium locator en zoek het tekstvakveld.
Hieronder vindt u de volledige code voor schakelen in het frame:
Uitgang:
Dit is hoe we moeten schakelen tussen de frames om de elementen te lokaliseren met behulp van selenium. Als er meerdere frames op uw webpagina staan, moet u meerdere keren schakelen.
Gevolgtrekking
- iFrame is een HTML-document dat is ingesloten in een ander HTML-document. iFrames worden expliciet vermeld in het HTML-document met behulp van de HTML-tag
- switchTo.frame (int frameNumber) -methode stelt de gebruikers in staat om naar een bepaald frame te schakelen met behulp van de frame-ID.
- switchTo.frame (string frameName) -methode stelt de gebruikers in staat om naar een bepaald frame te schakelen met behulp van de door de ontwikkelaar gedefinieerde naam van het frame.
- Met de methode switchTo.frame (WebElement frameElement) kunnen gebruikers overschakelen naar een frame op basis van de locatie van het webelement.
Bekijk hier ALLE Selenium-handleidingen.
Aanbevolen literatuur
- Cucumber Selenium Tutorial: Cucumber Java Selenium WebDriver Integration
- Inleiding tot Selenium WebDriver - Selenium Tutorial # 8
- Implementatie van ons eerste WebDriver-script - Selenium WebDriver-zelfstudie # 10
- Selenium - Veelgestelde vragen
- Omgaan met waarschuwingen / pop-ups in Selenium WebDriver - Selenium Tutorial # 16
- Omgaan met webtabellen, frames en dynamische elementen in Selenium Script - Selenium Tutorial # 18
- Impliciet en expliciet wachten in Selenium WebDriver (soorten Selenium Waits)
- Gids voor het genereren van omvangrapporten in Selenium WebDriver