Tech

Xử lý iFrames trong Selenium Webdriver: switchTo ()

iFrame trong Selenium Webdriver

iFrame trong Selenium Webdriver là một trang web hoặc một inline frame được nhúng trong một trang web khác hoặc một tài liệu HTML được nhúng bên trong một tài liệu HTML khác. inline frame thường được sử dụng để thêm nội dung từ các nguồn khác như quảng cáo vào một trang web. inline frame được xác định bằng thẻ < iframe >.

Cách xác định iframe:

Chúng tôi không thể phát hiện các iframe bằng cách chỉ xem trang hoặc bằng cách kiểm tra Firebug.

Quan sát hình ảnh bên dưới, Quảng cáo đang được hiển thị là một iframe, chúng tôi không thể xác định hoặc nhận ra điều đó bằng cách sử dụng Firebug để kiểm tra. Vì vậy, câu hỏi là làm thế nào bạn có thể xác định iframe?

Cách xác định iframe bằng Selenium WebDriver

Chúng tôi có thể xác định các iframe trong Selenium bằng các phương pháp được đưa ra dưới đây:

  • Nhấp chuột phải vào phần tử, Nếu bạn tìm thấy tùy chọn như ‘this frame’ thì đó là inline frame. (Vui lòng tham khảo sơ đồ trên)
  • Nhấp chuột phải vào trang và nhấp vào ‘Xem Nguồn Trang’ và Tìm kiếm bằng ‘iframe’, nếu bạn có thể tìm thấy bất kỳ tên thẻ nào có ‘iframe’ thì có nghĩa là trang có chứa iframe.

Trong sơ đồ trên, bạn có thể thấy tùy chọn ‘ this frame ‘ khả dụng khi nhấp chuột phải, vì vậy chúng tôi chắc chắn rằng đó là inline frame.

Chúng tôi thậm chí có thể xác định tổng số iframe bằng cách sử dụng đoạn code bên dưới.

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

Cách chuyển đổi các phần tử trong iframe bằng lệnh Trình điều khiển Web:

Về cơ bản, chúng ta có thể chuyển đổi các phần tử và xử lý các iframe trong Selenium bằng 3 cách.

  • Theo chỉ mục
  • Theo Tên hoặc Id
  • Theo phần tử web

Chuyển sang iframe theo chỉ mục:

Chỉ mục là một trong những thuộc tính để xử lý iframe trong Selenium code chúng ta có thể chuyển sang nó.

Chỉ mục của iframe bắt đầu bằng ‘0’.

Giả sử nếu có 100 iframe trong trang, chúng ta có thể chuyển sang iframe trong Selenium bằng cách sử dụng chỉ mục.

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

Chuyển sang iframe theo Tên hoặc ID:

Tên và ID là các thuộc tính để xử lý các iframe trong Selenium code qua đó chúng ta có thể chuyển sang iframe.

  • driver.switchTo (). frame (“iframe1”);
  • driver.switchTo (). frame (“id của phần tử”);

Ví dụ về Chuyển sang iframe thông qua ID:

Hãy lấy một ví dụ để chuyển đổi iframe trong Selenium được hiển thị trong hình dưới đây. Yêu cầu của chúng tôi là nhấp vào inline frame.

Chúng tôi có thể truy cập this frame thông qua URL dưới đây: http://demo.guru99.com/test/guru99home/

Không thể nhấp trực tiếp vào iframe thông qua XPath vì nó là iframe. Đầu tiên, chúng ta phải chuyển sang iframe và sau đó chúng ta có thể nhấp vào bằng cách sử dụng xpath.

Bước 1)

WebDriver driver = new FirefoxDriver();

driver.get(“http://demo.guru99.com/test/guru99home/”);

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

  • Chúng tôi khởi tạo trình điều khiển Firefox.
  • Điều hướng đến trang web “guru99” bao gồm iframe.
  • Đã phóng to cửa sổ.

Bước 2)

driver.switchTo().frame(“a077aa5e”);

  • Trong bước này, chúng ta cần tìm ra id của iframe bằng cách kiểm tra thông qua Firebug.
  • Sau đó, chuyển sang iframe thông qua ID.

Bước 3)

driver.findElement(By.xpath(“html/body/a/img”)).click();

  • Ở đây chúng ta cần tìm ra xpath của phần tử sẽ được nhấp vào.
  • Nhấp vào phần tử bằng lệnh trình điều khiển web được hiển thị ở trên.

Đây là code hoàn chỉnh:

public class SwitchToFrame_ID {

public static void main(String[] args) {

WebDriver driver = new FirefoxDriver(); //navigates to the Browser

    driver.get(“http://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***************”);

      }

}

Output:

Trình duyệt điều hướng đến trang có iframe ở trên và nhấp vào iframe.

Chuyển sang iframe bằng Phần tử Web:

Chúng tôi thậm chí có thể chuyển sang iframe bằng cách sử dụng phần tử web.

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

Cách chuyển trở lại iframe chính

Chúng ta phải thoát ra khỏi iframe.

Để quay lại iframe chính, bạn có thể sử dụng switchTo (). ParentFrame () hoặc nếu bạn muốn quay lại iframe chính (hoặc hầu hết), bạn có thể sử dụng switchTo (). DefaultContent ();

    driver.switchTo (). parentFrame ();

    driver.switchTo (). defaultContent ();

Cách chuyển qua iframe, nếu chúng ta KHÔNG THỂ chuyển bằng ID hoặc Phần tử Web:

Giả sử nếu có 100 iframe hình trong trang và không có sẵn ID, trong trường hợp này, chúng tôi không biết phần tử yêu cầu iframe nào đang được tải (Đó là trường hợp chúng tôi không biết chỉ mục của iframe cũng thế).

Giải pháp cho mối quan tâm trên là, chúng ta phải tìm chỉ mục của iframe code phần tử đang được tải và sau đó chúng ta cần chuyển sang iframe thông qua chỉ mục.

Dưới đây là các bước để tìm chỉ mục của iframe code phần tử đang được tải bằng cách sử dụng đoạn code dưới đây

Bước 1)

WebDriver driver = new FirefoxDriver();

driver.get(“http://demo.guru99.com/test/guru99home/”);

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

  • Khởi tạo trình điều khiển Firefox.
  • Điều hướng đến trang web “guru99” bao gồm iframe.
  • Đã phóng to cửa sổ.

Bước 2)

int size = driver.findElements(By.tagName(“iframe”)).size();

  • Đoạn code trên tìm tổng số iframe có bên trong trang bằng cách sử dụng tagname ‘iframe’.

Bước 3)

Mục tiêu của bước này là tìm ra chỉ mục của 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();}

Ở trên “forloop” lặp lại tất cả các iframe trong trang và nó sẽ in ‘1’ nếu iframe được yêu cầu của chúng tôi được tìm thấy khác trả về ‘0’.

Đây là code hoàn chỉnh cho đến bước 3:

public class IndexOfIframe {

public static void main(String[] args) {

    WebDriver driver = new 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();

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

Thực thi chương trình này và Output sẽ như sau:

Output:

1

0

0

0

0

0

Xác minh Output, bạn có thể tìm thấy chuỗi số 0 và số 1.

  • Bất cứ nơi nào bạn tìm thấy ‘1’ trong Output là chỉ mục của iframe code phần tử đang được tải.
  • Vì chỉ mục của iframe bắt đầu bằng ‘0’ nếu bạn tìm thấy chỉ số 1 ở vị trí thứ nhất, thì chỉ mục là 0.
  • Nếu bạn tìm thấy 1 trong 3 vị trí thứ 3 , chỉ số là 2.

Chúng tôi có thể nhận xét vòng lặp for, khi chúng tôi tìm thấy chỉ mục. Bước 4)

driver.switchTo (). frame (0);

  • Khi bạn tìm thấy chỉ mục của phần tử, bạn có thể chuyển qua iframe bằng lệnh trên.
  • iframe driver.switchTo (). (chỉ mục được tìm thấy từ Bước 3);

Bước 5)

driver.findElement (By.xpath (“html / body / a / img”)). click ();

  • Đoạn code trên sẽ nhấp vào iframe hoặc phần tử trong iframe.

Vì vậy, code hoàn chỉnh sẽ như dưới đây:

lớp công khai SwitchToframe {

public class SwitchToframe   {

public static void main(String[] args) throws NoSuchElementException{

    WebDriver driver = new FirefoxDriver();

    driver.get(“http://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***************”);

        }

    }

Output: Trình duyệt điều hướng đến trang bao gồm iframe ở trên và nhấp vào iframe.

Khái niệm về iframe lồng nhau (iframe bên trong iframe):

Giả sử rằng có hai iframe một bên trong khác như thể hiện trong hình dưới đây và yêu cầu của chúng tôi là in văn bản ở iframe bên ngoài và iframe bên trong. Trong trường hợp các iframe lồng nhau,

  • Lúc đầu, chúng ta phải chuyển sang iframe bên ngoài bằng Chỉ mục hoặc ID của inline frame
  • Sau khi chuyển sang iframe bên ngoài, chúng tôi có thể tìm thấy tổng số iframe bên trong iframe bên ngoài và
  • Chúng ta có thể chuyển sang iframe bên trong bằng bất kỳ phương pháp nào đã biết.

Trong khi thoát ra khỏi iframe, chúng ta phải thoát ra theo thứ tự như khi nhập vào từ iframe bên trong trước rồi mới đến iframe bên ngoài.

Các iFrames lồng nhau trong Selenium WebDriver

code Html cho iframe lồng nhau ở trên như hình dưới đây.

code HTML ở trên giải thích rõ ràng thẻ iframe (được đánh dấu bằng codeu xanh lục) trong một thẻ iframe khác, cho biết sự hiện diện của iframe lồng nhau.

Dưới đây là các bước để chuyển sang iframe ngoài và in văn bản trên iframe ngoài: Bước 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());

  • Chuyển sang iframe bên ngoài.
  • In văn bản trên iframe bên ngoài.

Khi chúng ta chuyển sang iframe bên ngoài, chúng ta nên biết liệu có bất kỳ iframe bên trong nào có bên trong iframe bên ngoài hay không

Bước 2)

size = driver.findElements(By.tagName(“iframe”)).size();

    // prints the total number of frames inside outer frame           

    System.out.println(“Total Frames –” + size);

  • Tìm tổng số iframe bên trong iframe bên ngoài.
  • Nếu kích thước được tìm thấy là “0” thì không có iframe bên trong bên trong iframe.

Bước 3)

driver.switchTo().frame(0); // Switching to innerframe

System.out.println(driver.findElement(By.xpath(“xpath of the inner element “)).getText());

  • Chuyển sang iframe bên trong
  • In văn bản trên iframe bên trong.

Đây là code hoàn chỉnh:

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

}

}

Output : Output của đoạn mã trên sẽ in văn bản trong frame bên trong và frame bên ngoài.

Blog Tiền Điện Tử

Blog tiền điện tử công thông tin tổng hợp uy tín nhất tất cả các mảng xã hội, giáo dục , công nghệ số. Với khả năng số hóa mạnh mẽ hy vọng sẽ mang lại cho quý bạn đọc những thông tin chính xác nhất 24/24
Back to top button