Cum să gestionați iFrames în Selenium Webdriver: switchTo ()

Cuprins:

Anonim

iFrame în Selenium Webdriver

iFrame în Selenium Webdriver este o pagină web sau un cadru inline care este încorporat într-o altă pagină web sau un document HTML încorporat în alt document HTML. Iframe-ul este adesea folosit pentru a adăuga conținut din alte surse, cum ar fi o reclamă într-o pagină web. Iframe-ul este definit cu eticheta < iframe >.

În acest tutorial, veți învăța -

  1. Cum se identifică iframe-ul:
  2. Cum se comută elementele din iframe folosind comenzile Driverului Web:
  3. Conceptul de rame imbricate (rame în rame):

Cum se identifică iframe-ul:

Nu putem detecta cadrele doar prin vizualizarea paginii sau prin inspectarea Firebug.

Observați imaginea de mai jos, reclama afișată este un Iframe, nu putem localiza sau recunoaște acest lucru doar prin inspectarea utilizând Firebug. Deci întrebarea este cum puteți identifica iframe-ul?

Cum se identifică iframe-ul folosind Selenium WebDriver

Putem identifica cadrele din seleniu folosind metodele date mai jos:

  • Faceți clic dreapta pe element, dacă găsiți opțiunea ca „Acest cadru”, atunci este un iframe (consultați diagrama de mai sus)
  • Faceți clic dreapta pe pagină și faceți clic pe „Vizualizați sursa paginii” și căutați cu „iframe”, dacă puteți găsi orice nume de etichetă cu „iframe”, atunci înseamnă să spuneți pagina care conține un iframe.

În diagrama de mai sus, puteți vedea că opțiunea „ Acest cadru ” este disponibilă la clic dreapta, așa că suntem siguri că este un iframe.

Putem chiar identifica numărul total de iframe utilizând fragmentul de mai jos.

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

Cum să comutați elementele din iframe folosind comenzile Driverului Web:

Practic, putem comuta elementele și manipula cadrele în Selenium folosind 3 moduri.

  • După index
  • După nume sau cod
  • Prin elementul web

Treceți la cadru după index:

Indexul este unul dintre atributele pentru gestionarea cadrelor în Selenium prin care putem trece la acesta.

Indexul iframe-ului începe cu „0”.

Să presupunem că dacă există 100 de cadre în pagină, putem trece la cadru în seleniu folosind index.

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

Treceți la cadru după nume sau ID:

Numele și ID-ul sunt atribute pentru gestionarea cadrelor din Selenium prin care putem trece la iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame („id-ul elementului”);

Exemplu de trecere la iframe prin ID:

Să luăm un exemplu pentru a schimba cadrul în seleniu afișat în imaginea de mai jos. Cerința noastră este să faceți clic pe iframe.

Putem accesa acest iframe prin adresa URL de mai jos: http: //demo.guru99.com/test/guru99home/

Este imposibil să faceți clic pe iframe direct prin XPath, deoarece este un iframe. Mai întâi trebuie să trecem la cadru și apoi putem face clic folosind xpath.

Pasul 1)

Driver WebDriver = nou FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
  • Inițializăm driverul Firefox.
  • Navigați la site-ul „guru99” care constă în iframe.
  • Maximizat fereastra.

Pasul 2)

driver.switchTo (). frame ("a077aa5e");
  • În acest pas, trebuie să aflăm ID-ul iframe-ului inspectând prin Firebug.
  • Apoi treceți la iframe prin ID.

Pasul 3)

driver.findElement (By.xpath ("html / body / a / img")). faceți clic pe ();
  • Aici trebuie să aflăm xpath-ul elementului de făcut clic.
  • Faceți clic pe elementul utilizând comanda driverului web prezentată mai sus.

Iată codul complet:

public class SwitchToFrame_ID {public static main main (String [] args) {Driver WebDriver = nou FirefoxDriver (); // navighează la Browserdriver.get ("http://demo.guru99.com/test/guru99home/");// navighează la pagina constând dintr-un iframedriver.manage (). window (). maximize ();driver.switchTo (). frame ("a077aa5e"); // comutarea cadrului după IDSystem.out.println ("******** Trecem la iframe *******");driver.findElement (By.xpath ("html / body / a / img")). faceți clic pe ();// Faceți clic pe iframeSystem.out.println ("********* Am terminat ***************");}}

Ieșire:

Browserul navighează la pagina care conține iframe-ul de mai sus și face clic pe iframe.

Comutați la cadru după elementul web:

Putem chiar să trecem la iframe folosind elementul web.

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

Cum să reveniți la cadrul principal

Trebuie să ieșim din iframe.

Pentru a reveni la cadrul părinte, puteți folosi switchTo (). ParentFrame () sau dacă doriți să reveniți la cadrul principal (sau cel mai părinte), puteți utiliza switchTo (). DefaultContent ();

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

Cum să trecem peste cadru, dacă NU PUTEM comuta folosind ID sau element web:

Să presupunem că există 100 de cadre în pagină și nu există un ID disponibil, în acest caz, nu știm doar din ce element iframe este încărcat (este cazul când nu cunoaștem indexul cadrului de asemenea).

Soluția pentru problema de mai sus este că trebuie să găsim indexul iframe-ului prin care se încarcă elementul și apoi trebuie să trecem la iframe prin index.

Mai jos sunt pașii pentru găsirea indexului cadrului prin care se încarcă elementul folosind fragmentul de mai jos

Pasul 1)

Driver WebDriver = nou FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
  • Inițializați driverul Firefox.
  • Navigați la site-ul „guru99” care constă în iframe.
  • Maximizat fereastra.

Pasul 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Codul de mai sus găsește numărul total de iframe prezente în interiorul paginii folosind numele „iframe”.

Pasul 3)

Obiectivul acestui pas ar fi aflarea indexului iframe.

for (int i = 0; i <= size; i ++) {driver.switchTo (). cadru (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}

Deasupra „forloop” iterează toate iframe-urile din pagină și tipărește „1” dacă iframe-ul nostru necesar a fost găsit altfel returnează „0”.

Iată codul complet până la pasul 3:

clasă publică IndexOfIframe {public static main main (String [] args) {Driver WebDriver = nou FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();for (int i = 0; i <= size; i ++) {driver.switchTo (). cadru (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}}}

Executați acest program și ieșirea va fi ca mai jos:

Ieșire:

100000
Verificați ieșirea, puteți găsi seria de 0 și 1.
  • Oriunde găsiți „1” în ieșire, care este indicele cadrului prin care se încarcă elementul.
  • Deoarece indexul iframe-ului începe cu „0” dacă găsiți 1 pe primul loc, atunci indexul este 0.
  • Dacă găsiți 1 în 3 - lea loc, indicele este 2.
Putem comenta bucla for, odată ce am găsit indexul. Pasul 4)
driver.switchTo (). cadru (0); 
  • Odată ce ați găsit indexul elementului, puteți comuta peste cadru folosind comanda de mai sus.
  • driver.switchTo (). cadru (index găsit din Pasul 3);
Pasul 5)
driver.findElement (By.xpath ("html / body / a / img")). faceți clic pe ();
  • Codul de mai sus va face clic pe iframe sau pe elementul din iframe.
Deci, codul complet ar fi ca mai jos:
clasă publică SwitchToframe {public static main principal (String [] args) aruncă NoSuchElementException {Driver WebDriver = nou FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * pentru (int i = 0; i <= dimensiune; i ++) {driver.switchTo (). cadru (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent (); // comutarea înapoi de la iframe} * /// A comentat codul pentru găsirea indexului elementuluidriver.switchTo (). cadru (0); // Trecerea la cadruSystem.out.println ("******** Suntem comutați la iframe *******");driver.findElement (By.xpath ("html / body / a / img")). faceți clic pe ();// Dând clic pe element în linie cu PublicitateSystem.out.println ("********* Am terminat ***************");}}
Ieșire: browserul navighează la pagina care conține iframe de mai sus și face clic pe iframe.

Conceptul de rame imbricate (rame în rame):

Să presupunem că există două cadre una în alta, așa cum se arată în imaginea de mai jos, iar cerința noastră este imprimarea textului în cadrul exterior și interior. În cazul cadrelor imbricate,
  • La început trebuie să trecem la cadrul exterior fie prin Index, fie prin ID-ul iframe-ului
  • Odată ce trecem la cadrul exterior putem găsi numărul total de iframe în interiorul cadrului exterior și
  • Putem trece la cadrul interior prin oricare dintre metodele cunoscute.
În timp ce ieșim din cadru, trebuie să ieșim în aceeași ordine în care am intrat în el din cadru interior mai întâi și apoi cadru exterior.
IFrames imbricate în Selenium WebDriver

Codul HTML pentru cadrul imbricat de mai sus este așa cum se arată mai jos.

Codul HTML de mai sus explică în mod clar eticheta iframe (evidențiată în verde) într-o altă etichetă iframe, indicând prezența iframe-urilor imbricate.

Mai jos sunt pașii pentru trecerea la cadrul exterior și imprimarea textului pe cadrele exterioare: Pasul 1)

Driver WebDriver = nou FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicit Așteptați (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total cadre -" + dimensiune);// imprimă numărul total de cadredriver.switchTo (). cadru (0); // Comutarea cadrului exteriorSystem.out.println (driver.findElement (By.xpath ("xpath al elementului exterior")). GetText ()); 
  • Treceți la cadrul exterior.
  • Tipărește textul pe cadrul exterior.

Odată ce trecem la cadrul exterior, ar trebui să știm dacă există un cadru interior prezent în interiorul cadrului exterior

Pasul 2)

size = driver.findElements (By.tagName ("iframe")). size ();// tipărește numărul total de cadre din cadrul exteriorSystem.out.println ("Total cadre -" + dimensiune);
  • Găsește numărul total de iframe din cadrul exterior.
  • Dacă dimensiunea a fost găsită „0”, atunci nu există cadru interior în interiorul cadrului.
Pasul 3)
driver.switchTo (). cadru (0); // Trecerea la interiorul cadruluiSystem.out.println (driver.findElement (By.xpath ("xpath al elementului interior")). GetText ());
  • Treceți la cadrul interior
  • Tipărește textul pe cadrul interior.
Iată codul complet:
public class FramesInsideFrames {public static main main (String [] args) {Driver WebDriver = nou FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicit Așteptați (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total cadre -" + dimensiune);// imprimă numărul total de cadredriver.switchTo (). cadru (0); // Comutarea cadrului exteriorSystem.out.println (driver.findElement (By.xpath ("xpath al elementului exterior")). GetText ());// Imprimarea textului în cadru exteriorsize = driver.findElements (By.tagName ("iframe")). size ();// tipărește numărul total de cadre din cadrul exteriorSystem.out.println ("Total cadre -" + dimensiune);driver.switchTo (). cadru (0); // Trecerea la interiorul cadruluiSystem.out.println (driver.findElement (By.xpath ("xpath al elementului interior")). GetText ());// Imprimarea textului în cadru interiordriver.switchTo (). defaultContent ();}}
Ieșire : ieșirea codului de mai sus ar imprima textul în cadrul interior și cadrul exterior.