Så här hanterar du iFrames i Selen Webdriver: switchTo ()

Innehållsförteckning:

Anonim

iFrame i Selenium Webdriver

iFrame i Selen Webdriver är en webbsida eller en inbyggd ram som är inbäddad i en annan webbsida eller ett HTML-dokument inbäddat i ett annat HTML-dokument. Iframe används ofta för att lägga till innehåll från andra källor som en annons till en webbsida. Iframe definieras med taggen < iframe >.

I den här handledningen lär du dig -

  1. Hur man identifierar iframe:
  2. Hur byter du över elementen i iframes med Web Driver-kommandon:
  3. Begreppet kapslade ramar (ramar inuti ramar):

Hur man identifierar iframe:

Vi kan inte upptäcka ramarna genom att bara se sidan eller genom att inspektera Firebug.

Observera bilden nedan, Annonsen som visas är en Iframe, vi kan inte hitta eller känna igen det genom att bara inspektera med Firebug. Så frågan är hur kan du identifiera iframe?

Hur man identifierar iframe med Selenium WebDriver

Vi kan identifiera ramarna i Selen med metoderna nedan:

  • Högerklicka på elementet. Om du hittar alternativet "Denna ram" är det en iframe. (Se ovanstående diagram)
  • Högerklicka på sidan och klicka på "Visa sidkälla" och sök med "iframe", om du kan hitta något taggnamn med "iframe" så är det meningen att säga sidan som består av en iframe.

I ovanstående diagram kan du se att alternativet ' Denna ram ' är tillgängligt när du högerklickar, så vi är nu säkra på att det är en iframe.

Vi kan till och med identifiera totalt antal iframes med hjälp av nedanstående kodavsnitt.

Int size = driver.findElements (By.tagName ("iframe")). Size ();

Så här byter du över elementen i iframes med Web Driver-kommandon:

I grund och botten kan vi byta över elementen och hantera ramar i Selen på 3 sätt.

  • Efter index
  • Efter namn eller ID
  • Av Web Element

Byt till ramen efter index:

Index är ett av attributen för ramhantering i Selen genom vilket vi kan byta till det.

Index för iframe börjar med '0'.

Antag att om det finns 100 bilder på sidan kan vi växla till ram i Selen genom att använda index.

  • driver.switchTo (). ram (0);
  • driver.switchTo (). ram (1);

Byt till ramen efter namn eller ID:

Namn och ID är attribut för hantering av ramar i Selen genom vilka vi kan växla till iframe.

  • driver.switchTo (). ram ("iframe1");
  • driver.switchTo (). frame ("elementets element");

Exempel på att byta till iframe via ID:

Låt oss ta ett exempel för att byta ram i Selen som visas i bilden nedan. Vårt krav är att klicka på iframe.

Vi kan komma åt denna iframe via denna URL: http: //demo.guru99.com/test/guru99home/

Det är omöjligt att klicka iframe direkt genom XPath eftersom det är en iframe. Först måste vi växla till ramen och sedan kan vi klicka med xpath.

Steg 1)

WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). fönster (). maximera ();
  • Vi initialiserar Firefox-drivrutinen.
  • Navigera till "guru99" -sidan som består av iframe.
  • Maximerade fönstret.

Steg 2)

driver.switchTo (). ram ("a077aa5e");
  • I det här steget måste vi ta reda på id: n för iframe genom att inspektera genom Firebug.
  • Byt sedan till iframe via ID.

Steg 3)

driver.findElement (By.xpath ("html / body / a / img")). klicka ();
  • Här måste vi ta reda på xpath för elementet som ska klickas.
  • Klicka på elementet med hjälp av kommandot webbdrivrutin som visas ovan.

Här är den fullständiga koden:

offentlig klass SwitchToFrame_ID {public static void main (String [] args) {WebDriver-drivrutin = ny FirefoxDriver (); // navigerar till webbläsarendriver.get ("http://demo.guru99.com/test/guru99home/");// navigerar till sidan som består av en iframedriver.manage (). fönster (). maximera ();driver.switchTo (). ram ("a077aa5e"); // byta ram efter IDSystem.out.println ("******** Vi byter till iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klicka ();// Klickar på iframeSystem.out.println ("********* Vi är färdiga **************");}}

Produktion:

Webbläsaren navigerar till sidan som består av iframe ovan och klickar på iframe.

Byt till ramen med Web Element:

Vi kan även byta till iframe med hjälp av webbelement.

  • driver.switchTo (). ram (WebElement);

Så här byter du tillbaka till huvudramen

Vi måste komma ut iframe.

För att flytta tillbaka till föräldraramen kan du antingen använda switchTo (). ParentFrame () eller om du vill komma tillbaka till huvudramen (eller mest förälder) kan du använda switchTo (). DefaultContent ();

driver.switchTo (). parentFrame ();driver.switchTo (). defaultContent ();

Så här byter du över ramen om vi INTE kan byta med ID eller webbelement:

Antag att om det finns 100 bilder på sidan och det inte finns något ID tillgängligt, i det här fallet vet vi bara inte från vilket iframe-nödvändigt element som laddas (det är fallet när vi inte känner till ramens index också).

Lösningen för ovanstående problem är att vi måste hitta indexet för iframe genom vilket elementet laddas och sedan måste vi växla till iframe genom indexet.

Nedan följer stegen för att hitta indexet för ramen som elementet laddas med hjälp av nedanstående utdrag

Steg 1)

WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). fönster (). maximera ();
  • Initiera Firefox-drivrutinen.
  • Navigera till webbplatsen "Guru99" som består av iframe.
  • Maximerade fönstret.

Steg 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Ovanstående kod hittar det totala antalet iframes som finns på sidan med hjälp av tagnamnet 'iframe'.

Steg 3)

Målet för detta steg är att ta reda på indexet för iframe.

för (int i = 0; i <= storlek; i ++) {driver.switchTo (). ram (i);int total = driver.findElements (By.xpath ("html / body / a / img")). storlek ();System.out.println (totalt);driver.switchTo (). defaultContent ();}

Ovanför "forloop" upprepas alla iframes på sidan och den skriver ut "1" om den önskade iframe hittades annars returnerar "0".

Här är den fullständiga koden till steg 3:

offentlig klass IndexOfIframe {public static void main (String [] args) {WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). fönster (). maximera ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();för (int i = 0; i <= storlek; i ++) {driver.switchTo (). ram (i);int total = driver.findElements (By.xpath ("html / body / a / img")). storlek ();System.out.println (totalt);driver.switchTo (). defaultContent ();}}}

Kör detta program och utdata skulle vara som nedan:

Produktion:

100000
Verifiera utdata, du kan hitta serien 0 och 1.
  • Oavsett var du hittar '1' i utdata som är indexet för Frame genom vilket elementet laddas.
  • Eftersom indexet för iframe börjar med '0' om du hittar 1 på 1: a plats, så är index 0.
  • Om du hittar 1 på tredje plats är indexet 2.
Vi kan kommentera för loop när vi hittat indexet. Steg 4)
driver.switchTo (). ram (0); 
  • När du väl har hittat elementets index kan du växla över ramen med kommandot ovan.
  • driver.switchTo (). ram (index hittades från steg 3);
Steg 5)
driver.findElement (By.xpath ("html / body / a / img")). klicka ();
  • Ovanstående kod klickar på iframe eller element i iframe.
Så den fullständiga koden skulle vara som nedan:
offentlig klass SwitchToframe {public static void main (String [] args) kastar NoSuchElementException {WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). fönster (). maximera ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * för (int i = 0; i <= storlek; i ++) {driver.switchTo (). ram (i);int total = driver.findElements (By.xpath ("html / body / a / img")). storlek ();System.out.println (totalt);driver.switchTo (). defaultContent (); // byter tillbaka från iframe} * /// Kommenterade koden för att hitta elementets indexdriver.switchTo (). ram (0); // Växlar till ramenSystem.out.println ("******** Vi byter till iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klicka ();// Klicka på elementet i linje med AnnonsSystem.out.println ("********* Vi är färdiga **************");}}
Utdata: Webbläsaren navigerar till sidan som består av iframe ovan och klickar på iframe.

Begreppet kapslade ramar (ramar inuti ramar):

Låt oss anta att det finns två ramar inuti andra som visas i bilden nedan och vårt krav är att skriva ut texten i den yttre ramen och inre ramen. När det gäller kapslade ramar,
  • Först måste vi byta till den yttre ramen med antingen Index eller ID för iframe
  • När vi väl bytt till den yttre ramen kan vi hitta det totala antalet iframes inuti den yttre ramen, och
  • Vi kan växla till den inre ramen med någon av de kända metoderna.
När vi går ut ur ramen måste vi gå ut i samma ordning som vi gick in i den från den inre ramen först och sedan den yttre ramen.
Kapslade iFrames i Selen WebDriver

Html-koden för den ovan kapslade ramen är som visas nedan.

Ovanstående HTML-kod förklarar tydligt iframe-taggen (markerad i grönt) i en annan iframe-tagg, vilket indikerar närvaron av kapslade iframes.

Nedan följer stegen för att växla till yttre ram och skriva ut texten på yttre ramar: Steg 1)

WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("Url");driver.manage (). fönster (). maximera ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Totala ramar -" + storlek);// skriver ut det totala antalet bilderdriver.switchTo (). ram (0); // Växla den yttre ramenSystem.out.println (driver.findElement (By.xpath ("det yttre elementets xpath")). GetText ()); 
  • Byt till den yttre ramen.
  • Skriver ut texten på ytterramen.

När vi väl bytt till den yttre ramen bör vi veta om någon inre ram finns inne i den yttre ramen

Steg 2)

storlek = driver.findElements (By.tagName ("iframe")). storlek ();// skriver ut det totala antalet ramar inuti ytterramenSystem.out.println ("Totala ramar -" + storlek);
  • Hitta det totala antalet iframes inuti den yttre ramen.
  • Om storleken hittades '0' finns det ingen inre ram inuti ramen.
Steg 3)
driver.switchTo (). ram (0); // Byt till innerramSystem.out.println (driver.findElement (By.xpath ("xpath of the inner element")). GetText ());
  • Byt till den inre ramen
  • Skriver ut texten på den inre ramen.
Här är den fullständiga koden:
offentliga klass FramesInsideFrames {public static void main (String [] args) {WebDriver-drivrutin = ny FirefoxDriver ();driver.get ("Url");driver.manage (). fönster (). maximera ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Totala ramar -" + storlek);// skriver ut det totala antalet bilderdriver.switchTo (). ram (0); // Växla den yttre ramenSystem.out.println (driver.findElement (By.xpath ("det yttre elementets xpath")). GetText ());// Skriva ut texten i ytterramenstorlek = driver.findElements (By.tagName ("iframe")). storlek ();// skriver ut det totala antalet ramar inuti ytterramenSystem.out.println ("Totala ramar -" + storlek);driver.switchTo (). ram (0); // Byt till innerramSystem.out.println (driver.findElement (By.xpath ("xpath of the inner element")). GetText ());// Skriva ut texten i den inre ramendriver.switchTo (). defaultContent ();}}
Output : Utmatningen från ovanstående kod skulle skriva ut texten i den inre ramen och den yttre ramen.