Cara Menangani iFrame di Selenium Pengemudi web: switchTo()

iFrame masuk Selenium Driver web

iFrame masuk Selenium Driver web adalah halaman web atau bingkai sebaris yang tertanam di halaman web lain atau dokumen HTML yang tertanam di dalam dokumen HTML lain. Iframe sering digunakan untuk menambahkan konten dari sumber lain seperti iklan ke halaman web. Iframe didefinisikan denganiframe> tag.

Cara mengidentifikasi iFrame

Kami tidak dapat mendeteksi frame hanya dengan melihat halaman atau memeriksa Firebug.

Perhatikan gambar di bawah ini, Iklan yang ditampilkan adalah Iframe, kami tidak dapat menemukan atau mengenalinya hanya dengan memeriksa menggunakan Firebug. Jadi pertanyaannya adalah bagaimana Anda bisa mengidentifikasi iframe?

Identifikasi Iframe
Cara mengidentifikasi iframe menggunakan Selenium webdriver

Kita dapat mengidentifikasi frame di dalamnya Selenium menggunakan metode yang diberikan di bawah ini:

  • Klik kanan pada elemen tersebut, Jika Anda menemukan opsi seperti 'Bingkai Ini' maka itu adalah iframe. (Silakan lihat diagram di atas)
  • Klik kanan pada halaman tersebut dan klik 'Lihat Sumber Halaman' dan Cari dengan 'iframe', jika Anda dapat menemukan nama tag apa pun dengan 'iframe' maka artinya halaman tersebut terdiri dari iframe.

Dalam diagram di atas, Anda dapat melihat bahwa 'Bingkai iniOpsi ' tersedia saat diklik kanan, jadi kami sekarang yakin bahwa itu adalah iframe.

Kami bahkan dapat mengidentifikasi jumlah total iframe dengan menggunakan cuplikan di bawah ini.

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

Cara Menangani Bingkai di Selenium menggunakan Perintah WebDriver

Pada dasarnya, kita dapat mengganti elemen dan menangani frame Selenium menggunakan 3 cara.

  • Dengan Indeks
  • Berdasarkan Nama atau Id
  • Berdasarkan Elemen Web

Metode 1: Beralih ke bingkai demi indeks

Indeks adalah salah satu atribut untuk penanganan frame di Selenium melalui mana kita dapat beralih ke sana.

Indeks iframe dimulai dengan '0'.

Misalkan jika ada 100 frame dalam satu halaman, kita dapat beralih ke frame dalam Selenium dengan menggunakan indeks.

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

Metode 2: Beralih ke bingkai berdasarkan Nama atau ID

Nama dan ID adalah atribut untuk menangani frame di Selenium melaluinya kita dapat beralih ke iframe.

  • driver.switchTo().frame("iframe1");
  • driver.switchTo().frame("id of the element");

Contoh Beralih ke iframe melalui ID:

ke bingkai dengan Elemen Web

Kita dapat mengakses iframe ini melalui URL di bawah ini: https://demo.guru99.com/test/guru99home/

Tangani Bingkai Masuk Selenium Menggunakan Perintah WebDriver

Tidak mungkin untuk mengklik iframe secara langsung XPath karena ini adalah iframe. Pertama kita harus beralih ke frame dan kemudian kita bisa klik menggunakan xpath.

Langkah 1)

WebDriver driver = new FirefoxDriver();

driver.get("https://demo.guru99.com/test/guru99home/");

driver.manage().window().maximize();

  • Kami menginisialisasi Firefox sopir.
  • Arahkan ke situs “guru99” yang berisi iframe.
  • Memaksimalkan jendela.

Langkah 2)

driver.switchTo().frame("a077aa5e");
  • Pada 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 dari elemen yang akan diklik.
  • Klik elemen menggunakan perintah driver web yang ditunjukkan di atas.

Berikut kode lengkapnya:

public class SwitchToFrame_ID {
public static void main(String[] args) {

		WebDriver driver = new FirefoxDriver(); //navigates to the Browser
	    driver.get("https://demo.guru99.com/test/guru99home/"); 
	       // 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***************");
      }
}		

Keluaran:

Browser menavigasi ke halaman yang berisi iframe di atas dan mengklik iframe.

Metode 3: Beralih ke bingkai dengan Elemen Web

Kita bahkan dapat beralih ke iframe menggunakan elemen web.

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

Cara beralih kembali ke Main Frame

Kita harus keluar dari iframe.

Untuk kembali ke bingkai induk, Anda dapat menggunakan switchTo().parentFrame() atau jika ingin kembali ke bingkai utama (atau sebagian besar bingkai induk), Anda dapat menggunakan switchTo().defaultContent();

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

Cara beralih frame, jika kita TIDAK BISA beralih menggunakan ID atau Elemen Web:

Misalkan jika ada 100 frame di halaman, dan tidak ada ID yang tersedia, dalam hal ini, kita tidak tahu elemen iframe mana yang diperlukan sedang dimuat (Ini adalah kasus ketika kita tidak mengetahui indeks frame Juga).

Solusi untuk masalah di atas adalah, kita harus menemukan indeks iframe yang digunakan untuk memuat elemen dan kemudian kita perlu beralih ke iframe melalui indeks.

Di bawah ini adalah langkah-langkah untuk menemukan indeks Bingkai tempat elemen dimuat dengan menggunakan cuplikan di bawah ini

Langkah 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Inisialisasi Firefox sopir.
  • Arahkan ke situs “guru99” yang berisi iframe.
  • Memaksimalkan jendela.

Langkah 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Kode di atas menemukan jumlah total iframe yang ada di dalam halaman menggunakan tagname 'iframe'.

Langkah 3)

Tujuan untuk langkah ini adalah mencari tahu 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 mencetak '1' jika iframe yang diperlukan ditemukan, jika tidak maka akan menghasilkan '0'.

Berikut kode lengkap hingga langkah 3:

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

Jalankan program ini dan hasilnya akan seperti di bawah ini:

Keluaran:

1
0
0
0	
0
0

Verifikasi hasilnya, Anda dapat menemukan rangkaian 0 dan 1.

  • Di mana pun Anda menemukan '1' dalam keluaran, itulah indeks Bingkai tempat elemen dimuat.
  • Karena indeks iframe dimulai dengan '0' jika Anda menemukan 1 di 1sttempat, maka indeksnya adalah 0.
  • Jika Anda menemukan 1 dari 3rd tempat, indeksnya adalah 2.

Kita dapat mengomentari perulangan for, setelah kita menemukan indeksnya.

Langkah 4)

driver.switchTo().frame(0);
  • Setelah Anda menemukan indeks elemen, Anda dapat mengganti frame menggunakan perintah di atas.
  • driver.switchTo().frame(indeks ditemukan dari Langkah 3);

Langkah 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Kode di atas akan mengklik iframe atau elemen di iframe.

Jadi kode lengkapnya akan seperti di bawah ini:

public class SwitchToframe   {
public static void main(String[] args) throws NoSuchElementException{
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    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***************");
	        }
	    }

Keluaran:

Browser menavigasi ke halaman yang berisi iframe di atas dan mengklik iframe.

Konsep Bingkai Bersarang di Selenium

Mari kita asumsikan ada dua bingkai yang satu di dalam yang lain seperti yang ditunjukkan pada gambar di bawah dan persyaratan kita adalah mencetak teks di bingkai luar dan bingkai dalam.

Dalam kasus frame bertumpuk,

  • Pertama-tama kita harus beralih ke bingkai luar dengan Indeks atau ID iframe
  • Setelah kita beralih ke bingkai luar, kita dapat menemukan jumlah total iframe di dalam bingkai luar, dan
  • Kita dapat beralih ke rangka bagian dalam dengan salah satu metode yang diketahui.

Saat keluar dari frame, kita harus keluar dengan urutan yang sama seperti kita masuk ke dalamnya dari frame dalam terlebih dahulu dan kemudian frame luar.

Kode Html untuk frame bersarang di atas adalah seperti gambar di bawah ini.

Konsep Bingkai Bersarang di Selenium

Kode HTML di atas dengan jelas menjelaskan tag iframe (disorot dengan warna hijau) di dalam tag iframe lain, yang menunjukkan adanya iframe bertingkat.

Berikut 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());
  • Beralih ke Bingkai luar.
  • Mencetak teks pada bingkai luar.

Setelah kita beralih ke bingkai luar, kita harus mengetahui apakah ada bingkai dalam yang ada 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);
  • Menemukan jumlah total iframe di dalam bingkai luar.
  • Jika ditemukan ukuran '0' maka tidak ada bingkai bagian dalam 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());
  • Beralih ke bingkai bagian dalam
  • Mencetak teks pada bingkai bagian dalam.

Berikut kode lengkapnya:

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();
	}
}

Keluaran:

Output dari kode di atas akan mencetak teks pada frame dalam dan frame luar.