handling iframes using selenium webdriver switchto method
Welches der folgenden Beispiele ist ein Beispiel für Data Mining?
Umgang mit iFrames mit Selenium WebDriver: Praktisches Tutorial mit praktischen Beispielen
iFrame (Inline-Frame) ist ein HTML-Dokument, das in ein anderes HTML-Dokument eingebettet ist.
iFrames werden am häufigsten zum Anzeigen von Werbung auf einer Webseite verwendet. iFrames werden im HTML-Dokument mithilfe des HTML-Tags explizit erwähnt
In diesem Tutorial erfahren Sie alles über den Umgang mit Iframes in Selen sowie die entsprechenden Codebeispiele, damit Sie sie leichter verstehen.
=> Lesen Sie die Easy Selenium Training Series durch.
Was du lernen wirst:
- Umgang mit iFrames mit Selen
- UPDATE am März 2020
- Fazit
Umgang mit iFrames mit Selen
Ein Iframe innerhalb einer Webseite kann im Firefox-Browser identifiziert werden, wenn die Option 'Dieser Frame' in den Rechtsklickoptionen angezeigt wird (siehe unten).
Alternativ können wir auch überprüfen, ob eine Webseite Iframes enthält, indem wir den Quellcode betrachten und nach dem Tag suchen
List iframes = driver.findElements(By.tagName(“iframe”));
Von Selen bereitgestellte Methoden zur Handhabung von iFrames
Selen bietet die folgenden integrierten Methoden zum Hin- und Herwechseln von Iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (Zeichenfolge frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Mit dieser Methode können Benutzer mithilfe der Frame-ID zu einem bestimmten Frame wechseln.
- Die Frame-Nummer ist ein auf Null basierender Indexwert. Dies bedeutet, dass der erste Frame der Webseite den Index 0, der zweite Frame den Index 1 und der dritte Frame den Index 3 usw. hat.
- Die Rahmennummer kann auch anhand der Rahmen-ID des Elements identifiziert werden. Dies kann durch erfolgen Klicken Sie mit der rechten Maustaste -> Element überprüfen und suchen Sie nach dem iFrame. Überprüfen Sie, ob einer der iFrames ein ID-Attribut hat.
Ein Beispiel für ein iframe-Element im Quellcode würde wie unten erwähnt aussehen.
Sobald die ID des iFrame identifiziert ist, können wir dieselbe verwenden, um zum folgenden Frame zu wechseln.
Beispiele:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Diese Methode löst eine NoSuchFrameException aus, wenn der erforderliche Frame auf der aktuellen Webseite nicht gefunden wird.
# 2) switchTo.frame (string frameName)
- Mit dieser Methode können Benutzer unter Verwendung des vom Entwickler definierten Namens des Frames zu einem bestimmten Frame wechseln.
- Der Frame-Name muss in doppelte Anführungszeichen gesetzt werden, damit er als String-Parameter betrachtet werden kann.
- Diese Methode löst eine NoSuchFrameException aus, wenn der erforderliche Frame auf der aktuellen Webseite nicht gefunden wird.
Beispiel:
In dem oben erwähnten Code haben sowohl die Rahmen-ID als auch der Rahmenname den gleichen Wert. Der Wechsel zum Frame kann unter Verwendung des folgenden Frame-Namens erfolgen:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Mit dieser Methode können Benutzer basierend auf dem Speicherort des Webelements zu einem Frame wechseln.
- Diese Methode löst NoSuchFrameException aus, wenn der erforderliche Frame nicht auf der Webseite vorhanden ist, und StaleElementReferenceException, wenn der auf der Webseite angezeigte Frame nicht aktiv ist.
Beispiel:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Das Hin- und Herwechseln zwischen iframes und übergeordneter Seite kann mit der Methode driver.switchTo (). DefaultContent () erfolgen.
- Bitte beachten Sie, dass es in Selenium eine ähnliche Methode gibt, um zwischen Frames mit dem Namen driver.switchTo (). ParentFrame () zu wechseln.
- Der Unterschied zwischen driver.switchTo (). DefaultContent () und driver.switchTo (). ParentFrame () besteht darin, dass die erste Methode das Steuerelement unabhängig von der Anzahl der Frames auf der Webseite auf die Hauptwebseite umschaltet, während die zweite Methode schaltet das Steuerelement auf den übergeordneten Frame des aktuellen Frames um.
Beispiel:
Angenommen, auf der übergeordneten Webseite p1 befinden sich drei Frames mit den Namen i1, i2 und i3. Die Frames i1, i2 und i3 sind voneinander abhängig, was bedeutet, dass ein Frame das übergeordnete Frame eines anderen Frames ist.
Mit der Methode driver.switchTo (). DefaultContent () in Frame i3 wird die Web-Treibersteuerung auf die übergeordnete Seite p1 verschoben. Während die Methode driver.switchTo (). ParentFrame () in Frame i3 die Steuerung wieder auf Frame i2 umschaltet und so weiter.
Quellcodebeispiel:
Nachfolgend finden Sie das Testszenario, das mithilfe von Iframes in Selen automatisiert werden soll:
- Öffnen Sie die Website SoftwareTestingHelp.com.
- Suchen Sie alle HTML-Elemente mit dem Tag iframe, zählen Sie die Anzahl der Vorkommen des iFrame und drucken Sie ihn auf einer Konsole aus.
- Wechseln Sie mit der Frame-ID zu einem gültigen Frame auf der Webseite und drucken Sie den Quellcode des Frames.
- Schließen Sie das aktuelle Browserfenster.
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(); } }
Code-Ausgabe:
Öffnen Sie die Website: https://www.softwaretestinghelp.com
Wechseln Sie zu dem Frame mit dem Namen aswift_0.
Drucken Sie die Anzahl der Iframes auf der Webseite im Eclipse-Konsolenfenster.
Drucken Sie den Quellcode des Frames auf der Eclipse-Konsole, nachdem Sie zum Frame gewechselt haben.
Code Erläuterung:
- Wir initialisieren ein Objekt des Geckotreibers mit der System.setProperty-Methode, um auf den Dateipfad geckodriver.exe auf dem lokalen Computer zu verweisen.
- Wir instanziieren dann ein Objekt des FireFox-Treibers über die WebDriver-Oberfläche.
- Unter Verwendung des Firefox-Treiberobjekts wird die folgende Webseite geöffnet: https://www.softwaretestinghelp.com.
- Im nächsten Schritt identifizieren wir die Anzahl der auf der Webseite angezeigten Iframe-Elemente, zählen sie und zeigen die Iframe-Anzahl auf der Eclipse-Konsole an.
- Mit der Frame-ID wechseln wir zum Frame auf der Webseite. Im obigen Fall lautet die Frame-ID 'aswift_0'.
- Sobald wir erfolgreich zum Frame gewechselt haben, drucken wir den Quellcode des Frames auf der Eclipse-Konsole.
- Wir wechseln dann mit der Anweisung driver.switchTo (). DefaultContent () zur übergeordneten Webseite zurück und schließen schließlich die Webtreiberinstanz mit der Methode driver.quit.
Unterschied zwischen Frame und iFrame in Selen
- Ein Rahmen wird verwendet, um eine Seite in mehrere Abschnitte mit neuem Inhalt in jedem Abschnitt zu unterteilen.
- Ein iFrame wird verwendet, um den Inhalt der externen Websites in die Webseite einzubetten, um Probleme mit der Cross-Site-Skripterstellung zu vermeiden.
- Ein iFrame gilt als weniger sicher als ein Frame, da Entwickler mit iFrame Inhalte von Websites Dritter einbetten können. Ein Iframe erfordert daher, dass ein Entwickler dem Inhalt vertraut, den er in den Iframe eingebettet hat.
- Die meisten Webanwendungen, die heute entwickelt werden, verwenden keine Frames zum Teilen der Seite, sondern iframes zum Einbetten externer Inhalte wie Werbung in die Webseite.
Umgang mit dynamischen Frames in Selen
- Auf einigen Webseiten können sich Frame-Eigenschaften wie Frame-ID und Frame-Name auf einer Webseite dynamisch ändern. Die Frame-Position bleibt jedoch gleich. In einem solchen Fall können wir uns nicht auf die Frame-ID oder den Frame-Namen verlassen, um einen Frame eindeutig zu identifizieren.
- Wir können die verwenden Rahmenindex in einem solchen Fall, um den Rahmen anhand der Rahmenposition eindeutig zu identifizieren.
- In einigen Fällen ändert sich der Frame-ID-Wert jedes Mal, wenn die Seite geladen wird, jedoch mit einem statischen Text, der sich nicht ändert. Zum Beispiel Beachten Sie den folgenden Code für Iframes.
Im obigen Beispiel bleibt der Text 'frame_' konstant, während sich der numerische Wert mit jedem Laden der Seite ändert.
- Wir können den obigen Rahmen anhand des folgenden eindeutig identifizieren XPath
// iframe (enthält (@ id, ’frame’))
UPDATE am März 2020
So lokalisieren Sie die Elemente im Rahmen
In Selen müssen wir zuerst innerhalb des Rahmens wechseln und dann die Elemente identifizieren, wie wir es normalerweise mit verschiedenen Selenium-Locatoren tun, um auf die im Rahmen vorhandenen Elemente zugreifen zu können. Ihr Selenium-Code kann Ihre Elemente nicht finden, ohne in IFrame zu wechseln.
Der folgende Screenshot zeigt, wie Frames in einen HTML-Code eingebettet sind:
Verschiedene Möglichkeiten, mit Selen zu einem IFrame zu wechseln
# 1) Verwenden des Frame-Namens oder der ID
Wechseln Sie mit Frame-Name oder Frame-ID zu IFrame. Manchmal ist entweder Frame-Name oder ID oder beides in einem Code vorhanden.
Syntax:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Verwenden des Rahmenindex
Suchen Sie den Frame mithilfe des Frame-Index, falls verfügbar.
Syntax:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Verwenden von Web Element
Suchen Sie den Rahmen mithilfe von Selenium-Locators .
Syntax:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Andere Operationen mit Frame
# 1) Zurückschalten zum Eltern- oder Ahnenrahmen
Zurückschalten von Frame 3 zu Frame 2 mit dem Befehl „switchTo.parentFrame“ .
Syntax:
driver.switchTo().parentFrame();
# 2) Wechseln zu einem anderen Frame
Wenn Sie von Frame 3 zu Frame 1 oder zum Standardframe wechseln möchten, verwenden Sie den Befehl „switchTo.defaultContent“.
Syntax:
driver.switchTo().defaultContent();
Im folgenden Code suchen wir ein Namenstextfeld in einem Frame.
Was ist, wenn wir versuchen, es direkt zu lokalisieren, ohne in den Rahmen zu wechseln?
Sehen wir uns das Ergebnis an:
Code fehlgeschlagen mit Grund 'Element kann nicht gefunden werden: {' Methode ':' xpath ',' Selektor ':' // Eingabe (@ name = ’name’) '}
Wechseln Sie nun mit Web Element in den Rahmen oder sagen Sie mit Selenium Locator und suchen Sie das Textfeld.
Im Folgenden finden Sie den vollständigen Code für das Umschalten innerhalb des Frames:
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'); } }
Ausgabe:
Auf diese Weise müssen wir zwischen den Frames wechseln, um die Elemente mithilfe von Selen zu lokalisieren. Wenn Ihre Webseite mehrere Frames enthält, müssen Sie mehrmals wechseln.
Fazit
- iFrame ist ein HTML-Dokument, das in ein anderes HTML-Dokument eingebettet ist. iFrames werden im HTML-Dokument mithilfe des HTML-Tags explizit erwähnt
- Mit der Methode switchTo.frame (int frameNumber) können Benutzer mithilfe der Frame-ID zu einem bestimmten Frame wechseln.
- Mit der Methode switchTo.frame (string frameName) können Benutzer unter Verwendung des vom Entwickler definierten Namens des Frames zu einem bestimmten Frame wechseln.
- Mit der Methode switchTo.frame (WebElement frameElement) können Benutzer basierend auf dem Speicherort des Webelements zu einem Frame wechseln.
=> Überprüfen Sie ALLE Selen-Tutorials hier.
Literatur-Empfehlungen
- Cucumber Selenium Tutorial: Integration von Cucumber Java Selenium WebDriver
- Einführung in Selenium WebDriver - Selenium Tutorial # 8
- Implementierung unseres ersten WebDriver-Skripts - Selenium WebDriver Tutorial # 10
- FAQs zu Selen
- Umgang mit Warnungen / Popups in Selenium WebDriver - Selenium Tutorial # 16
- Umgang mit Webtabellen, Frames und dynamischen Elementen in Selenium Script - Selenium Tutorial # 18
- Implizites und explizites Warten in Selenium WebDriver (Arten von Selen-Wartezeiten)
- Handbuch zum Generieren von Extent-Berichten in Selenium WebDriver