iFrame'ler Nasıl Kullanılır? Selenium Web sürücüsü: switchTo()

iFrame girişi Selenium Web sürücüsü

iFrame girişi Selenium Web sürücüsü başka bir web sayfasına gömülü bir web sayfası veya satır içi çerçeve veya başka bir HTML belgesinin içine gömülü bir HTML belgesidir. İframe genellikle reklam gibi diğer kaynaklardan bir web sayfasına içerik eklemek için kullanılır. İframe şununla tanımlanır:iframe> etiketi.

iFrame nasıl tanımlanır?

Sadece sayfayı görerek veya Firebug'u inceleyerek kareleri tespit edemeyiz.

Aşağıdaki resme dikkat edin, Görüntülenen Reklam bir Iframe'dir, bunu yalnızca Firebug kullanarak inceleyerek tespit edemeyiz veya tanıyamayız. Öyleyse soru şu: iframe'i nasıl tanımlayabilirsiniz?

Iframe'i tanımlayın
Kullanarak iframe nasıl tanımlanır? Selenium Web Sürücüsü

Çerçeveleri tanımlayabiliriz Selenium aşağıda verilen yöntemleri kullanarak:

  • Öğeye sağ tıklayın, 'Bu Çerçeve' gibi bir seçenek bulursanız bu bir iframe'dir.(Lütfen yukarıdaki şemaya bakın)
  • Sayfayı sağ tıklayın ve 'Sayfa Kaynağını Görüntüle'yi tıklayın ve 'iframe' ile arayın, 'iframe' ile herhangi bir etiket adı bulabilirseniz bu, sayfanın bir iframe içerdiği anlamına gelir.

Yukarıdaki şemada şunu görebilirsiniz 'Bu çerçeve' seçeneği sağ tıklandığında mevcut olduğundan artık bunun bir iframe olduğundan eminiz.

Aşağıdaki parçayı kullanarak toplam iframe sayısını bile belirleyebiliriz.

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

Çerçeveler Nasıl Kullanılır? Selenium WebDriver Komutlarını kullanma

Temel olarak elemanları değiştirebilir ve çerçeveleri işleyebiliriz. Selenium 3 yol kullanıyor.

  • Dizine göre
  • İsme veya Kimliğe Göre
  • Web Öğesine Göre

Yöntem 1: Dizine göre kareye geçiş

Dizin, çerçeve işlemenin özelliklerinden biridir. Selenium bu sayede ona geçiş yapabiliriz.

iframe'in dizini '0' ile başlar.

Diyelim ki sayfada 100 kare varsa, kareye geçebiliriz. Selenium indeksi kullanarak.

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

Yöntem 2: Ad veya Kimliğe göre çerçeveye geçiş yapın

Ad ve Kimlik, çerçeveleri işlemek için kullanılan niteliklerdir. Selenium bu sayede iframe'e geçebiliriz.

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

ID aracılığıyla iframe'e geçiş örneği:

Web Elementi tarafından çerçeveye

Bu iframe'e aşağıdaki URL aracılığıyla erişebiliriz: https://demo.guru99.com/test/guru99home/

Çerçeveleri Tut Selenium WebDriver Komutlarını Kullanma

Doğrudan iframe'e tıklamak imkansızdır XPath çünkü bu bir iframe'dir. Öncelikle çerçeveye geçmemiz gerekiyor ve ardından xpath kullanarak tıklayabiliriz.

) 1 Adım

WebDriver driver = new FirefoxDriver();

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

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

  • Başlatıyoruz Firefox sürücüsü.
  • İframe'i oluşturan "guru99" sitesine gidin.
  • Pencereyi büyüttük.

) 2 Adım

driver.switchTo().frame("a077aa5e");
  • Bu adımda Firebug üzerinden inceleyerek iframe'in id'sini bulmamız gerekiyor.
  • Ardından kimlik aracılığıyla iframe'e geçin.

) 3 Adım

driver.findElement(By.xpath("html/body/a/img")).click();
  • Burada tıklanacak elemanın xpath'ını bulmamız gerekiyor.
  • Yukarıda gösterilen web sürücüsü komutunu kullanarak öğeye tıklayın.

İşte kodun tamamı:

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***************");
      }
}		

Çıktı:

Tarayıcı yukarıdaki iframe'i içeren sayfaya gider ve iframe'i tıklar.

Yöntem 3: Çerçeveye Web Öğesi ile geçiş yapın

Web elementini kullanarak iframe'e bile geçiş yapabiliriz.

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

Ana Çerçeveye nasıl geri dönülür

İframe'den çıkmamız gerekiyor.

Ana çerçeveye geri dönmek için switchTo().parentFrame() işlevini kullanabilirsiniz veya ana (veya çoğu ana çerçeveye) geri dönmek istiyorsanız switchTo().defaultContent(); öğesini kullanabilirsiniz.

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

ID veya Web Elementi kullanarak geçiş yapamıyorsak çerçeve nasıl değiştirilir:

Sayfada 100 kare olduğunu ve kimlik bilgisinin bulunmadığını varsayalım; bu durumda, hangi iframe gerekli öğesinin yüklendiğini bilmiyoruz (Bu, çerçevenin indeksini bilmediğimiz durumdur) Ayrıca).

Yukarıdaki sorunun çözümü, öğenin yüklendiği iframe'in indeksini bulmamız ve ardından indeks aracılığıyla iframe'e geçmemiz gerektiğidir.

Aşağıda, aşağıdaki parçayı kullanarak öğenin yüklendiği Çerçevenin dizinini bulma adımları verilmiştir.

) 1 Adım

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Başlat Firefox sürücüsü.
  • İframe'i içeren "guru99" sitesine gidin.
  • Pencereyi büyüttük.

) 2 Adım

int size = driver.findElements(By.tagName("iframe")).size();
  • Yukarıdaki kod, 'iframe' etiket adını kullanarak sayfanın içinde bulunan toplam iframe sayısını bulur.

) 3 Adım

Amaç bu adım iframe dizinini bulmak olacaktır.

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

Yukarıdaki "forloop", sayfadaki tüm iframe'leri yineler ve gerekli iframe'imiz bulunursa '1' yazdırır, aksi halde '0' döndürür.

İşte 3. adıma kadar kodun tamamı:

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

Bu programı çalıştırdığınızda çıktı aşağıdaki gibi olacaktır:

Çıktı:

1
0
0
0	
0
0

Çıktıyı doğrulayın, 0 ve 1 dizisini bulabilirsiniz.

  • Çıktıda '1'i bulduğunuz her yerde bu, öğenin yüklendiği Çerçevenin dizini olur.
  • 0'de 1'i bulursanız iframe'in dizini '1' ile başladığından beristyerdeyse indeks 0'dır.
  • Eğer 1'te 3'i bulursanızrd yerde indeks 2'dir.

Dizini bulduğumuzda for döngüsünü yorumlayabiliriz.

) 4 Adım

driver.switchTo().frame(0);
  • Elemanın indeksini bulduğunuzda yukarıdaki komutu kullanarak çerçeveyi değiştirebilirsiniz.
  • Driver.switchTo().frame(3. Adımda bulunan dizin);

) 5 Adım

driver.findElement(By.xpath("html/body/a/img")).click();
  • Yukarıdaki kod, iframe'deki iframe'i veya öğeyi tıklayacaktır.

Yani kodun tamamı aşağıdaki gibi olacaktır:

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***************");
	        }
	    }

Çıktı:

Tarayıcı yukarıdaki iframe'i içeren sayfaya gider ve iframe'i tıklar.

İç İçe Çerçeveler Kavramı Selenium

Aşağıdaki görseldeki gibi iç içe iki çerçeve olduğunu ve ihtiyacımızın dış çerçeve ve iç çerçevedeki metni yazdırmak olduğunu varsayalım.

İç içe geçmiş çerçeveler durumunda,

  • İlk önce iframe'in Index veya ID'sine göre dış çerçeveye geçmeliyiz
  • Dış çerçeveye geçtiğimizde, dış çerçevenin içindeki toplam iframe sayısını bulabiliriz ve
  • Bilinen yöntemlerden herhangi biri ile iç çerçeveye geçebiliriz.

Çerçevenin dışına çıkarken önce iç çerçeveden, sonra dış çerçeveden girdiğimiz sırayla çıkış yapmalıyız.

Yukarıdaki iç içe çerçevenin Html kodu aşağıda gösterildiği gibidir.

İç İçe Çerçeveler Kavramı Selenium

Yukarıdaki HTML kodu, başka bir iframe etiketi içindeki iframe etiketini (yeşil renkle vurgulanmıştır) açıkça açıklar ve iç içe geçmiş iframe'lerin varlığını belirtir.

Dış çerçeveye geçme ve metni dış çerçevelere yazdırma adımları aşağıda verilmiştir:

) 1 Adım

	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());
  • Dış Çerçeveye geçin.
  • Metni dış çerçeveye yazdırır.

Dış çerçeveye geçtiğimizde, dış çerçevenin içinde herhangi bir iç çerçevenin olup olmadığını bilmeliyiz.

) 2 Adım

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Dış çerçevenin içindeki toplam iframe sayısını bulur.
  • Boyut '0' bulunursa çerçevenin içinde iç çerçeve yoktur.

) 3 Adım

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • İç çerçeveye geç
  • Metni iç çerçeveye yazdırır.

İşte kodun tamamı:

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

Çıktı:

Yukarıdaki kodun çıktısı, metni İç çerçeve ve Dış çerçeveye yazdıracaktır.