Kako ravnati z iFrames v Selenium Webdriver: switchTo ()

Kazalo:

Anonim

iFrame v programu Selenium Webdriver

iFrame v programu Selenium Webdriver je spletna stran ali vstavljeni okvir, ki je vdelan v drugo spletno stran ali dokument HTML, vdelan v drug dokument HTML. Iframe se pogosto uporablja za dodajanje vsebine iz drugih virov, kot je oglas, na spletno stran. Iframe je definiran z oznako < iframe >.

V tej vadnici boste izvedeli -

  1. Kako prepoznati okvir iframe:
  2. Kako z ukazi spletnega gonilnika preklapljam med elementi v okvirjih:
  3. Koncept ugnezdenih okvirjev (okvirji znotraj okvirjev):

Kako prepoznati okvir iframe:

Okvirov ne moremo zaznati tako, da samo vidimo stran ali pregledamo Firebug.

Upoštevajte spodnjo sliko. Prikazani oglas je iframe, tega ne moremo najti ali prepoznati s pregledom s pomočjo Firebuga. Vprašanje je torej, kako lahko prepoznate iframe?

Kako prepoznati iframe s pomočjo programa Selenium WebDriver

Okvire v selenu lahko prepoznamo s spodnjimi metodami:

  • Z desno miškino tipko kliknite element. Če najdete možnost, kot je »Ta okvir«, je to okvir iframe (glejte zgornji diagram)
  • Z desno miškino tipko kliknite stran in kliknite "Ogled vira strani" in poiščite z "iframe", če lahko z "iframe" poiščete katero koli ime oznake, potem pomeni, da izgovorite stran, ki vsebuje iframe.

V zgornjem diagramu lahko vidite, da je možnost " Ta okvir " na voljo z desnim klikom, tako da smo zdaj prepričani, da gre za iframe.

S spodnjim delčkom kode lahko celo ugotovimo skupno število iframov.

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

Kako z ukazi spletnega gonilnika preklopiti elemente v iframejih:

V bistvu lahko elemente in rokovanje z okvirji v selenu preklopimo na tri načine.

  • Po indeksu
  • Po imenu ali ID
  • S spletnim elementom

Preklopi na okvir po indeksu:

Indeks je eden od atributov za obdelavo okvirjev v seleniju, prek katerega lahko preklopimo nanj.

Kazalo iframeja se začne z '0'.

Recimo, če je na strani 100 sličic, lahko s pomočjo indeksa preklopimo na okvir v seleniju.

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

Preklopite na okvir po imenu ali ID-ju:

Ime in ID sta atributa za obdelavo okvirjev v programu Selenium, prek katerih lahko preklopimo na iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame ("id elementa");

Primer prehoda na iframe skozi ID:

Vzemimo primer za preklop okvirja v seleniju, ki je prikazan na spodnji sliki. Naša zahteva je, da kliknemo okvir iframe.

Do tega iframeja lahko pridemo prek spodnjega URL-ja: http: //demo.guru99.com/test/guru99home/

Nemogoče je klikniti iframe neposredno prek XPath, ker je iframe. Najprej moramo preklopiti na okvir, nato pa lahko kliknemo s pomočjo xpath.

Korak 1)

Gonilnik WebDriver = novi FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
  • Inicializiramo gonilnik za Firefox.
  • Pojdite na spletno mesto "guru99", ki vsebuje okvir iframe.
  • Maksimalno okno.

2. korak)

driver.switchTo (). frame ("a077aa5e");
  • V tem koraku moramo ugotoviti ID iframeja s pregledom prek Firebuga.
  • Nato preklopite na iframe prek ID-ja.

3. korak)

driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Tu moramo ugotoviti pot poti do elementa, ki ga želimo klikniti.
  • Kliknite element z zgoraj prikazanim ukazom spletnega gonilnika.

Tu je celotna koda:

javni razred SwitchToFrame_ID {public static void main (String [] args) {Gonilnik WebDriver = novi FirefoxDriver (); // se pomakne do brskalnikadriver.get ("http://demo.guru99.com/test/guru99home/");// se pomakne na stran, ki vsebuje okvir iframedriver.manage (). window (). maximize ();driver.switchTo (). frame ("a077aa5e"); // preklop okvira po ID-juSystem.out.println ("******** Preklopili smo na iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Klikne iframeSystem.out.println ("********* Končali smo ***************");}}

Izhod:

Brskalnik se pomakne na stran, ki vsebuje zgornji okvir, in klikne na okvir.

Preklopi na okvir s spletnim elementom:

Lahko celo preklopimo na iframe z uporabo spletnega elementa.

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

Kako preklopiti nazaj na glavni okvir

Moramo priti iz okvirja.

Če se želite vrniti v nadrejeni okvir, lahko uporabite switchTo (). ParentFrame () ali če se želite vrniti v glavni (ali najbolj nadrejeni) okvir, lahko uporabite switchTo (). DefaultContent ();

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

Kako preklopiti preko okvira, če NE moremo preklopiti z ID-jem ali spletnim elementom:

Recimo, če je na strani 100 okvirjev in ni na voljo ID-ja, v tem primeru preprosto ne vemo, iz katerega iframe se nalaga zahtevani element (primer je, ko indeksa okvira ne poznamo tudi).

Rešitev za zgornjo skrb je, da moramo poiskati indeks iframeja, skozi katerega se element nalaga, nato pa moramo skozi indeks preklopiti na iframe.

Spodaj so koraki za iskanje indeksa okvira, s katerim se element nalaga z uporabo spodnjega delčka

Korak 1)

Gonilnik WebDriver = novi FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();
  • Inicializirajte gonilnik Firefox.
  • Pojdite na spletno mesto "guru99", ki vsebuje okvir iframe.
  • Maksimalno okno.

2. korak)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Zgornja koda poišče skupno število vstavljenih okvirjev znotraj strani z imenom oznake 'iframe'.

3. korak)

Cilj tega koraka bi bil ugotoviti indeks iframe.

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

Nad "forloop" se ponovijo vsi vstavljeni okviri na strani in se natisne '1', če je bil naš zahtevani iframe drugačen, vrne '0'.

Tu je celotna koda do 3. koraka:

javni razred IndexOfIframe {public static void main (String [] args) {Gonilnik WebDriver = novi 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 ();za (int i = 0; i <= velikost; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (skupaj);driver.switchTo (). defaultContent ();}}}

Izvedite ta program in rezultat bi bil kot spodaj:

Izhod:

1.00000
Preverite izhod, lahko najdete serije 0 in 1.
  • Kjerkoli v izhodu najdete '1', to je indeks Frame, s katerim se element nalaga.
  • Ker je indeks iframe začne z "0", če se vam zdi, da 1 na 1 st mestu, potem je indeks 0.
  • Če ugotovite, 1 na 3 rd mesto, indeks je 2.
Ko najdemo indeks, lahko komentiramo zanko for. 4. korak)
driver.switchTo (). frame (0); 
  • Ko najdete indeks elementa, lahko z zgornjim ukazom preklopite okvir.
  • driver.switchTo (). frame (indeks najden v 3. koraku);
5. korak)
driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Zgornja koda bo kliknila okvir iframe ali element v okvirju iframe.
Celotna koda bi bila torej spodaj:
javni razred SwitchToframe {public static void main (String [] args) vrže NoSuchElementException {Gonilnik WebDriver = novi FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximize ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * za (int i = 0; i <= velikost; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (skupaj);driver.switchTo (). defaultContent (); // preklop nazaj iz okvira iframe} * /// Komentiral kodo za iskanje indeksa elementadriver.switchTo (). frame (0); // Preklop na okvirSystem.out.println ("******** Preklopljeni smo na iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Klik na element v skladu z AdvertisementSystem.out.println ("********* Končali smo ***************");}}
Izhod: brskalnik se pomakne na stran, ki vsebuje zgornji okvir iframe, in klikne iframe.

Koncept ugnezdenih okvirjev (okvirji znotraj okvirjev):

Predpostavimo, da sta dva okvira drug v drugem, kot je prikazano na spodnji sliki, in naša zahteva je tiskanje besedila v zunanji okvir in notranji okvir. V primeru ugnezdenih okvirjev
  • Sprva moramo preklopiti na zunanji okvir z indeksom ali ID-jem okvirja
  • Ko preklopimo na zunanji okvir, lahko najdemo skupno število okvirjev znotraj zunanjega okvira in
  • Na notranji okvir lahko preklopimo s katero koli od znanih metod.
Med izhodom iz okvira moramo izstopiti v enakem vrstnem redu, kot smo vanj najprej vstopili iz notranjega in nato zunanjega okvira.
Vgnezdeni okviri iFrames v programu Selenium WebDriver

Koda Html za zgornji ugnezdeni okvir je prikazana spodaj.

Zgornja koda HTML jasno razlaga oznako iframe (označeno z zeleno) znotraj druge oznake iframe, kar kaže na prisotnost ugnezdenih okvirjev.

Spodaj so navedeni koraki za preklop na zunanji okvir in tiskanje besedila na zunanje okvirje: 1. korak)

Gonilnik WebDriver = novi FirefoxDriver ();driver.get ("URL");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Skupno število okvirjev -" + velikost);// natisne skupno število okvirjevdriver.switchTo (). frame (0); // Preklop zunanjega okviraSystem.out.println (driver.findElement (By.xpath ("xpath zunanjega elementa")). GetText ()); 
  • Preklopite na zunanji okvir.
  • Natisne besedilo na zunanji okvir.

Ko preklopimo na zunanji okvir, bi morali vedeti, ali je v zunanjem okvirju prisoten kakšen notranji okvir

2. korak)

size = driver.findElements (By.tagName ("iframe")). size ();// natisne skupno število okvirjev znotraj zunanjega okviraSystem.out.println ("Skupno število okvirjev -" + velikost);
  • Poišče skupno število vstavkov v zunanjem okviru.
  • Če je bila ugotovljena velikost '0', znotraj okvira ni notranjega okvirja.
3. korak)
driver.switchTo (). frame (0); // Preklop na notranji okvirSystem.out.println (driver.findElement (By.xpath ("xpath notranjega elementa")). GetText ());
  • Preklopite na notranji okvir
  • Natisne besedilo na notranji okvir.
Tu je celotna koda:
javni razred FramesInsideFrames {public static void main (String [] args) {Gonilnik WebDriver = novi FirefoxDriver ();driver.get ("URL");driver.manage (). window (). maximize ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Skupno število okvirjev -" + velikost);// natisne skupno število okvirjevdriver.switchTo (). frame (0); // Preklop zunanjega okviraSystem.out.println (driver.findElement (By.xpath ("xpath zunanjega elementa")). GetText ());// Tiskanje besedila v zunanji okvirsize = driver.findElements (By.tagName ("iframe")). size ();// natisne skupno število okvirjev znotraj zunanjega okviraSystem.out.println ("Skupno število okvirjev -" + velikost);driver.switchTo (). frame (0); // Preklop na notranji okvirSystem.out.println (driver.findElement (By.xpath ("xpath notranjega elementa")). GetText ());// Tiskanje besedila v notranji okvirdriver.switchTo (). defaultContent ();}}
Izhod : Izhod zgornje kode bi natisnil besedilo v notranjem in zunanjem okvirju.