Cách xử lý iFrames trong Selenium Webdriver: switchTo ()

Mục lục:

Anonim

iFrame trong Selenium Webdriver

iFrame trong Selenium Webdriver là một trang web hoặc một khung nội tuyến đượ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. Khung nội tuyến 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. Khung nội tuyến được xác định bằng thẻ < iframe >.

Trong hướng dẫn này, bạn sẽ học -

  1. Cách xác định iframe:
  2. Làm cách nào để chuyển đổi các phần tử trong iframe bằng lệnh Trình điều khiển Web:
  3. Khái niệm về Khung lồng nhau (Khung bên trong Khung):

Cách xác định iframe:

Chúng tôi không thể phát hiện các khung 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 khung 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ư 'Khung này' thì đó là khung nội tuyến. (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 ' Khung này ' khả dụng khi nhấp chuột phải, vì vậy chúng tôi chắc chắn rằng đó là khung nội tuyến.

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 mã 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ý khung 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 khung theo chỉ mục:

Chỉ mục là một trong những thuộc tính để xử lý khung trong Selenium mà 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 khung trong trang, chúng ta có thể chuyển sang khung trong Selenium bằng cách sử dụng chỉ mục.

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

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

Tên và ID là các thuộc tính để xử lý các khung trong Selenium mà 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 khung 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 khung nội tuyến.

Chúng tôi có thể truy cập iframe này 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 khung và sau đó chúng ta có thể nhấp vào bằng cách sử dụng xpath.

Bước 1)

Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). Maxim ();
  • 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à mã hoàn chỉnh:

lớp công khai SwitchToFrame_ID {public static void main (String [] args) {Trình điều khiển WebDriver = mới FirefoxDriver (); // điều hướng đến Trình duyệtdriver.get ("http://demo.guru99.com/test/guru99home/");// điều hướng đến trang có iframedriver.manage (). window (). Maxim ();driver.switchTo (). frame ("a077aa5e"); // chuyển khung theo IDSystem.out.println ("******** Chúng tôi đang chuyển sang iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Nhấp vào khung nội tuyếnSystem.out.println ("********* Chúng tôi đã hoàn thành ***************");}}

Đầu ra:

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

Chuyển sang khung 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 Khung chính

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

Để quay lại khung chính, bạn có thể sử dụng switchTo (). ParentFrame () hoặc nếu bạn muốn quay lại khung 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 khung, 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 khung 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 khung 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 mà 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 Khung mà phần tử đang được tải bằng cách sử dụng đoạn mã dưới đây

Bước 1)

Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). Maxim ();
  • 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 mã 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 (tổng số);driver.switchTo (). defaultContent ();}

Ở trên "forloop" lặp lại tất cả các iframe trong trang và nó in '1' nếu iframe bắt buộc của chúng tôi được tìm thấy khác trả về '0'.

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

lớp công khai IndexOfIframe {public static void main (String [] args) {Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). Maxim ();//driver.manage().timeouts().implicitWait(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 (tổng số);driver.switchTo (). defaultContent ();}}}

Thực thi chương trình này và đầu ra sẽ như sau:

Đầu ra:

100000
Xác minh kết quả đầu ra, 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 đầu ra là chỉ mục của Khung mà 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 khung bằng lệnh trên.
  • khung 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 mã trên sẽ nhấp vào iframe hoặc phần tử trong iframe.
Vì vậy, mã hoàn chỉnh sẽ như dưới đây:
lớp công khai SwitchToframe {public static void main (String [] args) ném NoSuchElementException {Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). Maxim ();// 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 (tổng số);driver.switchTo (). defaultContent (); // chuyển trở lại từ iframe} * /// Đã nhận xét mã để tìm chỉ mục của phần tửdriver.switchTo (). frame (0); // Chuyển sang khungSystem.out.println ("******** Chúng tôi được chuyển sang iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Nhấp vào phần tử phù hợp với Quảng cáoSystem.out.println ("********* Chúng tôi đã hoàn thành ***************");}}
Đầu ra: 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ề Khung lồng nhau (Khung bên trong Khung):

Giả sử rằng có hai khung 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 ở khung bên ngoài và khung bên trong. Trong trường hợp các khung lồng nhau,
  • Lúc đầu, chúng ta phải chuyển sang khung bên ngoài bằng Chỉ mục hoặc ID của khung nội tuyến
  • Sau khi chuyển sang khung bên ngoài, chúng tôi có thể tìm thấy tổng số iframe bên trong khung bên ngoài và
  • Chúng ta có thể chuyển sang khung bên trong bằng bất kỳ phương pháp nào đã biết.
Trong khi thoát ra khỏi khung, chúng ta phải thoát ra theo thứ tự như khi nhập vào từ khung bên trong trước rồi mới đến khung bên ngoài.
Các iFrames lồng nhau trong Selenium WebDriver

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

Mã HTML ở trên giải thích rõ ràng thẻ iframe (được đánh dấu bằng màu 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 khung ngoài và in văn bản trên khung ngoài: Bước 1)

Trình điều khiển WebDriver = new FirefoxDriver ();driver.get ("Url");driver.manage (). window (). Maxim ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Tổng số khung -" + kích thước);// in ra tổng số khung hìnhdriver.switchTo (). frame (0); // Chuyển khung ngoàiSystem.out.println (driver.findElement (By.xpath ("xpath của phần tử bên ngoài")). GetText ()); 
  • Chuyển sang Khung bên ngoài.
  • In văn bản trên khung bên ngoài.

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

Bước 2)

size = driver.findElements (By.tagName ("iframe")). size ();// in tổng số khung bên trong khung bên ngoàiSystem.out.println ("Tổng số khung -" + kích thước);
  • Tìm tổng số iframe bên trong khung bên ngoài.
  • Nếu kích thước được tìm thấy là "0" thì không có khung bên trong bên trong khung.
Bước 3)
driver.switchTo (). frame (0); // Chuyển sang khung bên trongSystem.out.println (driver.findElement (By.xpath ("xpath của phần tử bên trong")). GetText ());
  • Chuyển sang khung bên trong
  • In văn bản trên khung bên trong.
Đây là mã hoàn chỉnh:
public class FramesInsideFrames {public static void main (String [] args) {Trình điều khiển WebDriver = new FirefoxDriver ();driver.get ("Url");driver.manage (). window (). Maxim ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Tổng số khung -" + kích thước);// in ra tổng số khung hìnhdriver.switchTo (). frame (0); // Chuyển khung ngoàiSystem.out.println (driver.findElement (By.xpath ("xpath của phần tử bên ngoài")). GetText ());// In văn bản trong khung bên ngoàisize = driver.findElements (By.tagName ("iframe")). size ();// in tổng số khung bên trong khung bên ngoàiSystem.out.println ("Tổng số khung -" + kích thước);driver.switchTo (). frame (0); // Chuyển sang khung bên trongSystem.out.println (driver.findElement (By.xpath ("xpath của phần tử bên trong")). GetText ());// In văn bản trong khung bên trongdriver.switchTo (). defaultContent ();}}
Đầu ra : Đầu ra của đoạn mã trên sẽ in văn bản trong khung bên trong và khung bên ngoài.