Trong Selenium, "Waits" đóng một vai trò quan trọng trong việc thực hiện các bài kiểm tra. Trong hướng dẫn này, bạn sẽ tìm hiểu các khía cạnh khác nhau của cả chờ đợi "Ngầm định" và "Rõ ràng" trong Selenium.
Trong hướng dẫn này, bạn sẽ học:
- Tại sao chúng ta cần chờ đợi trong Selenium?
- Chờ đợi ngầm
- Chờ đợi rõ ràng
- Chờ lưu loát
Tại sao chúng ta cần chờ đợi trong Selenium?
Hầu hết các ứng dụng web được phát triển bằng Ajax và Javascript. Khi một trang được tải bởi trình duyệt, các phần tử mà chúng tôi muốn tương tác có thể tải vào các khoảng thời gian khác nhau.
Nó không chỉ gây khó khăn cho việc xác định phần tử mà còn nếu phần tử không được định vị, nó sẽ tạo ra một ngoại lệ " ElementNotVibleException ". Sử dụng Selenium Waits, chúng tôi có thể giải quyết vấn đề này.
Hãy xem xét một tình huống trong đó chúng ta phải sử dụng cả chờ đợi ngầm và rõ ràng trong thử nghiệm của mình. Giả sử rằng thời gian chờ ngầm định được đặt thành 20 giây và thời gian chờ rõ ràng được đặt thành 10 giây.
Giả sử chúng ta đang cố gắng tìm một phần tử có một số "Điều kiện mong đợi " (Chờ rõ ràng), Nếu phần tử không nằm trong khung thời gian được xác định bởi Chờ rõ ràng (10 Giây), nó sẽ sử dụng khung thời gian được xác định bởi chờ ngầm định ( 20 giây) trước khi ném một " ElementNotVosystemException ".
Selenium Web Driver Waits
- Chờ đợi ngầm
- Chờ đợi rõ ràng
Chờ đợi ngầm trong Selenium
Các Chờ Implicit trong Selenium được sử dụng để báo cho tài xế web để chờ đợi trong một khoảng thời gian nhất định trước khi nó ném một "không có yếu tố ngoại lệ như vậy". Cài đặt mặc định là 0. Sau khi chúng tôi đặt thời gian, trình điều khiển web sẽ đợi phần tử cho thời gian đó trước khi đưa ra một ngoại lệ.
Selenium Web Driver đã mượn ý tưởng chờ đợi ngầm từ Watir.
Trong ví dụ dưới đây, chúng tôi đã khai báo một thời gian chờ ngầm với khung thời gian là 10 giây. Nó có nghĩa là nếu phần tử không nằm trên trang web trong khung thời gian đó, nó sẽ đưa ra một ngoại lệ.
Để tuyên bố chờ đợi ngầm:
Cú pháp :
driver.manage (). timeouts (). implicitWait (TimeOut, TimeUnit.SECONDS);
gói guru.test99;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.chrome.ChromeDriver;nhập org.testng.annotations.Test;AppTest lớp công khai {trình điều khiển WebDriver được bảo vệ;@Kiểm trapublic void guru99tutorials () ném InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);String eTitle = "Trang Demo Guru99";Chuỗi aTitle = "";// khởi chạy Chrome và chuyển hướng nó đến URL cơ sởdriver.get ("http://demo.guru99.com/test/guru99home/");// Phóng to cửa sổ trình duyệtdriver.manage (). window (). Maxim ();// lấy giá trị thực của tiêu đềaTitle = driver.getTitle ();// so sánh tiêu đề thực tế với tiêu đề mong đợiif (aTitle.equals (eTitle)){System.out.println ("Đã vượt qua bài kiểm tra");}khác {System.out.println ("Kiểm tra Không thành công");}// đóng trình duyệttrình điều khiển.close ();}}
Giải thích mã
Trong ví dụ trên,
Xem xét mã sau:
driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);
Chờ ngầm sẽ chấp nhận 2 tham số, tham số đầu tiên sẽ chấp nhận thời gian dưới dạng giá trị số nguyên và tham số thứ hai sẽ chấp nhận phép đo thời gian dưới dạng SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS, v.v.
Chờ đợi rõ ràng trong Selenium
Các Chờ Explicit trong Selenium được sử dụng để nói lên điều khiển Web để chờ điều kiện nhất định (Điều kiện dự kiến) hoặc thời gian tối đa vượt quá trước khi ném "ElementNotVisibleException" ngoại lệ. Đây là một kiểu chờ thông minh, nhưng nó chỉ có thể được áp dụng cho các phần tử được chỉ định. Nó cung cấp các tùy chọn tốt hơn là chờ ngầm vì nó đợi các phần tử Ajax được tải động.
Một khi chúng ta tuyên bố chờ đợi rõ ràng chúng ta phải sử dụng " ExpectedConditions " hoặc chúng ta có thể cấu hình cách thường xuyên, chúng tôi muốn kiểm tra tình trạng sử dụng Chờ thạo . Ngày nay, trong khi triển khai, chúng tôi đang sử dụng Thread.Sleep () nói chung là không nên sử dụng
Trong ví dụ dưới đây, chúng tôi đang tạo tham chiếu đợi cho lớp " WebDriverWait " và khởi tạo bằng cách sử dụng tham chiếu " WebDriver " và chúng tôi đưa ra khung thời gian tối đa là 20 giây.
Cú pháp:
WebDriverWait wait = new WebDriverWait (WebDriverRefrence, TimeOut);
gói guru.test99;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.chrome.ChromeDriver;nhập org.openqa.selenium.support.ui.EosystemConditions;nhập org.openqa.selenium.support.ui.WebDriverWait;nhập org.testng.annotations.Test;lớp công khai AppTest2 {trình điều khiển WebDriver được bảo vệ;@Kiểm trapublic void guru99tutorials () ném InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();WebDriverWait wait = new WebDriverWait (trình điều khiển, 20);String eTitle = "Trang Demo Guru99";Chuỗi aTitle = "";// khởi chạy Chrome và chuyển hướng nó đến URL cơ sởdriver.get ("http://demo.guru99.com/test/guru99home/");// Phóng to cửa sổ trình duyệtdriver.manage (). window (). Maxim ();// lấy giá trị thực của tiêu đềaTitle = driver.getTitle ();// so sánh tiêu đề thực tế với tiêu đề mong đợiif (aTitle.contentEquals (eTitle)){System.out.println ("Đã vượt qua bài kiểm tra");}khác {System.out.println ("Kiểm tra Không thành công");}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (WaitingConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();}}
Giải thích mã
Xem xét mã sau:
WebElement guru99seleniumlink;guru99seleniumlink = wait.until (WaitingConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();
Trong ví dụ chờ WebDriver này, hãy đợi khoảng thời gian được xác định trong lớp " WebDriverWait " hoặc "Điều kiện mong đợi " xảy ra tùy theo điều kiện nào xảy ra trước.
Đoạn mã Java ở trên cho biết rằng chúng ta đang đợi một phần tử trong khung thời gian 20 giây như được định nghĩa trong lớp " WebDriverWait " trên trang web cho đến khi đáp ứng được "Điều kiện mong đợi " và điều kiện là " khả năng hiển thị của nó ".
Sau đây là các Điều kiện mong đợi có thể được sử dụng trong Chờ đợi rõ ràng Selenium
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- presentOfAllElementsLocatedBy ()
- presentOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visionOf ()
- visionOfAllElements ()
- visionOfAllElementsLocatedBy ()
- displayOfElementLocated ()
Chờ trôi chảy trong Selenium
Các Chờ thạo Selenium được sử dụng để xác định thời gian tối đa cho người lái xe web để chờ đợi một điều kiện, cũng như mức độ thường xuyên mà chúng tôi muốn kiểm tra điều kiện trước khi ném một "ElementNotVisibleException" ngoại lệ. Nó kiểm tra phần tử web theo các khoảng thời gian đều đặn cho đến khi đối tượng được tìm thấy hoặc thời gian chờ xảy ra.
Tần suất: Thiết lập chu kỳ lặp lại với khung thời gian để xác minh / kiểm tra tình trạng trong khoảng thời gian đều đặn
Hãy xem xét một tình huống trong đó một phần tử được tải vào các khoảng thời gian khác nhau. Phần tử có thể tải trong vòng 10 giây, 20 giây hoặc thậm chí hơn sau đó nếu chúng tôi khai báo thời gian chờ rõ ràng là 20 giây. Nó sẽ đợi cho đến thời gian quy định trước khi đưa ra một ngoại lệ. Trong các tình huống như vậy, chờ thông thạo là thời gian chờ lý tưởng để sử dụng vì điều này sẽ cố gắng tìm phần tử ở tần số khác nhau cho đến khi tìm thấy nó hoặc hết giờ cuối cùng.
Cú pháp:
Chờ đợi = new FluentWait (tham chiếu WebDriver).withTimeout (thời gian chờ, SECONDS).pollingEvery (thời gian chờ, SECONDS).ignoring (Exception.class);
Mã trên không được chấp nhận trong Selenium v3.11 trở lên. Bạn cần sử dụng
Chờ đợi = new FluentWait (tham chiếu WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Exception.class);
gói guru.test99;nhập org.testng.annotations.Test;nhập java.util.NoSuchElementException;nhập java.util.concurrent.TimeUnit;nhập java.util. Chức năng.Function;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.chrome.ChromeDriver;nhập org.openqa.selenium.support.ui.EosystemConditions;nhập org.openqa.selenium.support.ui.FluentWait;nhập org.openqa.selenium.support.ui.Wait;nhập org.openqa.selenium.support.ui.WebDriverWait;nhập org.testng.annotations.Test;lớp công khai AppTest3 {trình điều khiển WebDriver được bảo vệ;@Kiểm trapublic void guru99tutorials () ném InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Trang Demo Guru99";Chuỗi aTitle = "";driver = new ChromeDriver ();// khởi chạy Chrome và chuyển hướng nó đến URL cơ sởdriver.get ("http://demo.guru99.com/test/guru99home/");// Phóng to cửa sổ trình duyệtdriver.manage (). window (). Maxim ();// lấy giá trị thực của tiêu đềaTitle = driver.getTitle ();// so sánh tiêu đề thực tế với tiêu đề mong đợiif (aTitle.contentEquals (eTitle)){System.out.println ("Đã vượt qua bài kiểm tra");}khác {System.out.println ("Kiểm tra Không thành công");}Waitwait = new FluentWait (trình điều khiển).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickeleniumlink = wait.until (new Function () {áp dụng công khai WebElement (trình điều khiển WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i "));}});// nhấp vào liên kết selenclickeleniumlink.click ();// đóng ~ trình duyệttrình điều khiển.close ();}}
Giải thích mã
Xem xét mã sau:
Waitwait = new FluentWait (trình điều khiển).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);
Trong ví dụ trên, chúng tôi đang khai báo thời gian chờ trôi chảy với thời gian chờ là 30 giây và tần suất được đặt thành 5 giây bằng cách bỏ qua " NoSuchElementException "
Xem xét mã sau:
áp dụng công khai WebElement (trình điều khiển WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i "));
Chúng tôi đã tạo một chức năng mới để xác định Phần tử Web trên trang. (Ví dụ: Ở đây Phần tử Web không là gì ngoài liên kết Selenium trên trang web).
Tần số được đặt thành 5 giây và thời gian tối đa được đặt thành 30 giây. Do đó, điều này có nghĩa là nó sẽ kiểm tra phần tử trên trang web cứ sau 5 giây trong thời gian tối đa là 30 giây. Nếu phần tử được đặt trong khung thời gian này, nó sẽ thực hiện các hoạt động khác, nó sẽ ném ra " ElementNotVbrokenException "
Sự khác biệt giữa Chờ ngầm với Chờ rõ ràng
Chờ đợi ngầm | Chờ đợi rõ ràng |
---|---|
|
|
|
|
|
|
Phần kết luận:
Chờ đợi ngầm, rõ ràng và trôi chảy là các chờ đợi khác nhau được sử dụng trong Selenium. Việc sử dụng các lượt chờ này hoàn toàn dựa trên các phần tử được tải vào các khoảng thời gian khác nhau. Chúng tôi luôn không khuyến khích sử dụng Thread.Sleep () trong khi Kiểm tra ứng dụng của chúng tôi hoặc xây dựng khuôn khổ của chúng tôi.
Bài viết này được đóng góp bởi Chaitanya Pujari