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?
Ç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/
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.
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.