Cara Mengendalikan iFrames di Selenium Webdriver: switchTo ()

iFrame di Selenium Webdriver

iFrame di Selenium Webdriver adalah laman web atau bingkai sebaris yang disematkan di laman web lain atau dokumen HTML yang disematkan di dalam dokumen HTML yang lain. Iframe sering digunakan untuk menambahkan kandungan dari sumber lain seperti iklan ke laman web. Iframe ditakrifkan dengan< iframe > teg.

Dalam tutorial ini, anda akan belajar -

  1. Cara mengenal pasti iframe:
  2. Bagaimana menukar elemen dalam iframe menggunakan arahan Pemandu Web:
  3. Konsep Bingkai Bersarang (Bingkai di dalam Bingkai):

Cara mengenal pasti iframe:

Kami tidak dapat mengesan bingkai dengan hanya melihat halaman atau dengan memeriksa Firebug.

Perhatikan gambar di bawah ini, Iklan yang dipaparkan adalah Iframe, kita tidak dapat mencari atau mengenalinya dengan hanya memeriksa menggunakan Firebug. Jadi persoalannya ialah bagaimana anda dapat mengenal pasti iframe?

Cara mengenal pasti iframe menggunakan Selenium WebDriver



Kami dapat mengenal pasti bingkai di Selenium menggunakan kaedah yang diberikan di bawah:

  • Klik kanan pada elemen, Sekiranya anda menjumpai pilihan seperti 'This Frame' maka itu adalah iframe. (Sila rujuk gambarajah di atas)
  • Klik kanan pada halaman dan klik 'Lihat Sumber Halaman' dan Cari dengan 'iframe', jika anda dapat mencari nama tag dengan 'iframe' maka itu berarti mengatakan halaman yang terdiri dari iframe.

Dalam rajah di atas, anda dapat melihat bahawa ' Rangka Ini Pilihan tersedia apabila mengklik kanan, jadi kami sekarang yakin bahawa itu adalah iframe.

Kami bahkan dapat mengenal pasti jumlah iframe dengan menggunakan coretan di bawah.

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

Cara menukar elemen dalam iframe menggunakan arahan Pemandu Web:

Pada dasarnya, kita boleh menukar elemen dan mengendalikan bingkai di Selenium menggunakan 3 cara.

  • Mengikut Indeks
  • Mengikut Nama atau Id
  • Oleh Elemen Web

Tukar ke bingkai mengikut indeks:

Indeks adalah salah satu atribut untuk pengendalian bingkai di Selenium di mana kita dapat beralih kepadanya.

Indeks iframe bermula dengan '0'.

Andaikan jika ada 100 bingkai di halaman, kita dapat beralih ke bingkai di Selenium dengan menggunakan indeks.

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

Tukar ke bingkai dengan Nama atau ID:

Nama dan ID adalah atribut untuk menangani bingkai di Selenium di mana kita dapat beralih ke iframe.

  • driver.switchTo (). bingkai ('iframe1');
  • driver.switchTo (). bingkai ('id elemen');

Contoh Beralih ke iframe melalui ID:

Mari kita ambil contoh untuk menukar bingkai di Selenium yang dipaparkan pada gambar di bawah. Keperluan kami adalah mengklik iframe.

Kami boleh mengakses iframe ini melalui URL di bawah ini: https://demo.on2vhf.be/test/on2vhfhome/

Mustahil untuk mengklik iframe secara langsung XPath kerana ia adalah iframe. Mula-mula kita harus beralih ke bingkai dan kemudian kita boleh mengklik menggunakan xpath.

Langkah 1)

 WebDriver driver = new FirefoxDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); driver.manage().window().maximize(); 
  • Kami memulakan pemacu Firefox.
  • Navigasi ke laman 'on2vhf' yang terdiri daripada iframe.
  • Memaksimumkan tingkap.

Langkah 2)

driver.switchTo().frame('a077aa5e');
  • Dalam langkah ini, kita perlu mengetahui id iframe dengan memeriksa melalui Firebug.
  • Kemudian beralih ke iframe melalui ID.

Langkah 3)

driver.findElement(By.xpath('html/body/a/img')).click();
  • Di sini kita perlu mengetahui xpath elemen yang akan diklik.
  • Klik elemen menggunakan arahan pemacu web yang ditunjukkan di atas.

Berikut adalah kod lengkap:

 public class SwitchToFrame_ID { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); //navigates to the Browser driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); // navigates to the page consisting an iframe driver.manage().window().maximize(); driver.switchTo().frame('a077aa5e'); //switching the frame by ID System.out.println('********We are switch to the iframe*******'); driver.findElement(By.xpath('html/body/a/img')).click(); //Clicks the iframe System.out.println('*********We are done***************'); } } 

Pengeluaran:

Penyemak imbas menavigasi ke halaman yang terdiri daripada iframe di atas dan mengklik iframe.

Tukar ke bingkai dengan Elemen Web:

Kita bahkan boleh beralih ke iframe menggunakan elemen web.

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

Cara menukar kembali ke Rangka Utama

Kita mesti keluar dari iframe.

Untuk kembali ke bingkai induk, anda boleh menggunakan switchTo (). ParentFrame () atau jika anda ingin kembali ke bingkai utama (atau kebanyakan ibu bapa), anda boleh menggunakan switchTo (). DefaultContent ();

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

Cara menukar bingkai, jika kita TIDAK BOLEH beralih menggunakan ID atau Elemen Web:

Anggaplah jika terdapat 100 bingkai di halaman, dan tidak ada ID yang tersedia, dalam hal ini, kita tidak tahu dari mana elemen iframe diperlukan dimuat (Ini berlaku apabila kita tidak mengetahui indeks bingkai juga).

Penyelesaian untuk masalah di atas adalah, kita mesti mencari indeks iframe di mana elemen dimuat dan kemudian kita perlu beralih ke iframe melalui indeks.

Berikut adalah langkah-langkah untuk mencari indeks Bingkai di mana elemen dimuat dengan menggunakan potongan di bawah

Langkah 1)

 WebDriver driver = new FirefoxDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); driver.manage().window().maximize(); 
  • Permulaan pemacu Firefox.
  • Navigasi ke laman 'on2vhf' yang terdiri daripada iframe.
  • Memaksimumkan tingkap.

Langkah 2)

int size = driver.findElements(By.tagName('iframe')).size();
  • Kod di atas mendapati jumlah iframe yang terdapat di dalam halaman menggunakan nama tag 'iframe'.

Langkah 3)

Objektif untuk langkah ini adalah mencari indeks iframe.

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

Di atas 'forloop' mengulangi semua iframe di halaman dan ia mencetak '1' jika iframe kami yang diperlukan dijumpai yang lain mengembalikan '0'.

Berikut adalah kod lengkap sehingga langkah 3:

 public class IndexOfIframe { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); 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().frame(i); int total=driver.findElements(By.xpath('html/body/a/img')).size(); System.out.println(total); driver.switchTo().defaultContent();}}} 

Jalankan program ini dan output seperti di bawah:

Pengeluaran:

1 0 0 0 0 0
Sahkan keluaran, anda boleh menemui siri 0 dan 1.
  • Di mana sahaja anda menjumpai output '1' yang merupakan indeks Frame dengan elemen dimuat.
  • Oleh kerana indeks iframe bermula dengan '0' jika anda menjumpai 1 dalam 1sttempat, maka indeks adalah 0.
  • Sekiranya anda menjumpai 1 dalam 3rdtempat, indeks adalah 2.
Kami dapat memberi komen untuk loop, setelah kami menjumpai indeks. Langkah 4)
driver.switchTo().frame(0); 
  • Setelah anda menjumpai indeks elemen, anda boleh menukar bingkai menggunakan perintah di atas.
  • driver.switchTo (). frame (indeks dijumpai dari Langkah 3);
Langkah 5)
driver.findElement(By.xpath('html/body/a/img')).click();
  • Kod di atas akan mengklik iframe atau elemen dalam iframe.
Jadi kod lengkapnya seperti di bawah:
 public class SwitchToframe { public static void main(String[] args) throws NoSuchElementException{ WebDriver driver = new FirefoxDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); driver.manage().window().maximize(); //int size = driver.findElements(By.tagName('iframe')).size(); /*for(int i=0; i<=size; i++){ driver.switchTo().frame(i); int total=driver.findElements(By.xpath('html/body/a/img')).size(); System.out.println(total); driver.switchTo().defaultContent(); //switching back from the iframe }*/ //Commented the code for finding the index of the element driver.switchTo().frame(0); //Switching to the frame System.out.println('********We are switched to the iframe*******'); driver.findElement(By.xpath('html/body/a/img')).click(); //Clicking the element in line with Advertisement System.out.println('*********We are done***************'); } } 
Pengeluaran: Penyemak imbas menavigasi ke halaman yang terdiri daripada iframe di atas dan mengklik iframe.

Konsep Bingkai Bersarang (Bingkai di dalam Bingkai):

Mari kita anggap bahawa ada dua bingkai satu di dalam yang lain seperti yang ditunjukkan dalam gambar di bawah dan keperluan kita adalah mencetak teks di bingkai luar dan bingkai dalam. Sekiranya bingkai bersarang,
  • Pada mulanya kita mesti beralih ke bingkai luar dengan Indeks atau ID iframe
  • Sebaik sahaja kita beralih ke bingkai luar, kita dapat mencari jumlah iframe di dalam bingkai luar, dan
  • Kita boleh beralih ke kerangka dalam dengan kaedah yang diketahui.
Semasa keluar dari bingkai, kita mesti keluar dengan urutan yang sama seperti yang kita masukkan dari bingkai dalam terlebih dahulu dan kemudian bingkai luar.

IFrames bersarang di Selenium WebDriver

Kod Html untuk bingkai bersarang di atas adalah seperti gambar di bawah.

Kod HTML di atas menerangkan dengan jelas tag iframe (diserlahkan dengan warna hijau) di dalam tag iframe yang lain, yang menunjukkan kehadiran iframe bersarang.

Berikut adalah langkah-langkah untuk beralih ke bingkai luar dan mencetak teks pada bingkai luar: Langkah 1)

 WebDriver driver=new 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('Total Frames --' + size); // prints the total number of frames driver.switchTo().frame(0); // Switching the Outer Frame System.out.println (driver.findElement(By.xpath('xpath of the outer element ')).getText()); 
  • Tukar ke Bingkai luar.
  • Mencetak teks pada bingkai luar.

Sebaik sahaja kita beralih ke bingkai luar, kita harus mengetahui apakah ada bingkai dalam yang terdapat di dalam bingkai luar

Langkah 2)

 size = driver.findElements(By.tagName('iframe')).size(); // prints the total number of frames inside outer frame System.out.println('Total Frames --' + size); 
  • Mencari jumlah iframe di dalam bingkai luar.
  • Sekiranya ukuran dijumpai '0' maka tidak ada bingkai dalaman di dalam bingkai.
Langkah 3)
 driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath('xpath of the inner element ')).getText()); 
  • Tukar ke bingkai dalaman
  • Mencetak teks pada bingkai dalam.
Berikut adalah kod lengkap:
 public class FramesInsideFrames { public static void main(String[] args) { WebDriver driver=new 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('Total Frames --' + size); // prints the total number of frames driver.switchTo().frame(0); // Switching the Outer Frame System.out.println (driver.findElement(By.xpath('xpath of the outer element ')).getText()); //Printing the text in outer frame size = driver.findElements(By.tagName('iframe')).size(); // prints the total number of frames inside outer frame System.out.println('Total Frames --' + size); driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath('xpath of the inner element ')).getText()); //Printing the text in inner frame driver.switchTo().defaultContent(); } }
Pengeluaran : Keluaran dari kod di atas akan mencetak teks dalam bingkai Dalam dan bingkai Luar.