Selenium là một trong những công cụ đáng tin cậy nhất để thử nghiệm ứng dụng web và chiếm nhiều thị phần nhất trong số các đối tác của nó. Các nhà phát triển của nó luôn quan tâm đến phản hồi của người thử nghiệm [nhờ là nguồn mở] và triển khai các tính năng mới với mỗi bản cập nhật. Một tính năng như vậy xuất hiện dưới dạng Selenium Waits hay còn được gọi là lệnh Selenium Wait. Như tên của nó đã cung cấp một dấu ấn tinh tế, các lệnh Selenium Wait cho phép quá trình thực thi tự động hóa chờ một thời gian trước khi tiếp tục thực thi bình thường. Theo ý kiến của tôi, điều đó làm cho quá trình thực hiện của chúng tôi trông hơi "con người" hoặc tương tự như những gì người dùng cuối sẽ gặp phải trong quá trình duyệt internet của họ
Chương về Selenium Wait trình bày chi tiết các lệnh khác nhau triển khai các kiểu chờ đợi khác nhau. e. làm thế nào chúng ta có thể đạt được việc tạm dừng quá trình cho đến thời điểm được chỉ định. Ví dụ, nếu tôi muốn đợi mọi lúc trên mọi phần tử thì sao? . Do đó, để cung cấp cho bạn một ý tưởng ngắn gọn về nội dung, bài đăng sẽ di chuyển theo thứ tự sau
- Chờ đợi trong Selenium là gì?
- Các loại Selenium chờ đợi
- Chờ đợi ngầm định trong Selenium
- ngầmChờ[]
- pageLoadTimeout[]
- setScriptTimeout[]
- Chờ đợi rõ ràng trong Selenium
- WebDriverĐợi
- Lưu loátChờ đợi
- Chờ đợi ngầm định trong Selenium
Chờ đợi trong Selenium là gì?
Nói một cách đơn giản, Selenium Wait chỉ là một tập hợp các lệnh chờ trong một khoảng thời gian xác định trước khi thực thi các tập lệnh kiểm tra trên các phần tử. Thời điểm chờ đợi và thời gian chờ đợi bao lâu tùy thuộc vào kịch bản được viết và loại chờ đợi được sử dụng. Bạn có thể đang đợi một phần tử tải hoặc hiển thị hoặc bạn có thể muốn đợi cho đến khi tải toàn bộ trang. Do đó, Selenium Wait là một phương pháp được ưa thích khi các tình huống như vậy gặp phải hoặc được mong đợi trên một trang web [điều này khá thường xuyên do sử dụng thuộc tính không đồng bộ]. Nó giúp ngăn chặn ngoại lệ NoSuchElementFound
Về mặt kỹ thuật, các lệnh Selenium Wait ngăn chặn các điều kiện cạnh tranh giữa các thành phần của trang web. Vấn đề cốt lõi sinh ra Selenium Wait là Selenium chỉ đợi tài liệu. readyState của trang trở thành "hoàn thành". Trong quá trình này, do sử dụng nhiều JS, rất nhiều yếu tố cộng lại ngay cả sau khi trạng thái thay đổi thành "hoàn thành". Điều này có thể thực thi tập lệnh trên các phần tử chưa có trên trang web
Các loại Selenium chờ đợi
Lệnh đợi Selenium có hai phần
- chờ đợi ngầm định
- chờ đợi rõ ràng
Cả hai phần này đều có mức độ liên quan và trường hợp sử dụng riêng, theo đó chúng được người thử nghiệm ưa thích hơn trong thử nghiệm tự động hóa. Trong các phần tiếp theo, chúng ta sẽ thảo luận về hai phần này với các lệnh khác nhau mà chúng nắm giữ dưới quyền của mình.
Chờ đợi ngầm định trong Selenium
Chờ ngầm định là lệnh chờ không có điều kiện trong Selenium. Vì nó không có điều kiện nên nó được áp dụng cho tất cả các phần tử web trên trang web
Điều này có nghĩa là chúng ta có thể nói với Selenium rằng chúng ta muốn nó đợi một khoảng thời gian nhất định trước khi đưa ra một ngoại lệ rằng nó không thể tìm thấy phần tử trên trang hoặc trang không được tải hoặc quá trình thực thi javascript chưa kết thúc. Ngoài ra, điều quan trọng cần lưu ý là sau khi được đặt, Chờ ngầm định sẽ giữ nguyên vị trí trong toàn bộ thời gian trình duyệt mở
Chúng ta có thể áp dụng chờ ngầm thông qua ba chức năng
- ngầmChờ[]
- pageLoadTimeout[]
- setScriptTimeout[]
Mặc dù chúng là ba chức năng có thể gọi riêng biệt, nhưng tất cả chúng đều là một phần của thời gian chờ trong Selenium
lệnh ngầm hiểu trong thời gian chờ Selenium
Trong thời gian chờ đợi ngầm định, WebDriver sẽ thăm dò DOM trong một số đơn vị thời gian nhất định trong khi cố gắng tìm bất kỳ phần tử nào. Nếu phần tử được tìm thấy sớm hơn, thì quá trình kiểm tra sẽ thực hiện tại thời điểm đó, nếu không thì WebDriver sẽ đợi trong khoảng thời gian đã chỉ định
Thời gian bỏ phiếu [hoặc khoảng thời gian bỏ phiếu] là khoảng thời gian mà Selenium bắt đầu tìm kiếm lại sau lần thử thất bại cuối cùng. Nó phụ thuộc vào loại trình điều khiển trình duyệt bạn đang làm việc. Một số có thể có 500 mili giây trong khi một số có thể có 1 giây làm thời gian bỏ phiếu. Thời gian bỏ phiếu được tích hợp sẵn trong implicitlyWait và không có cách nào để sửa đổi khoảng thời gian. Nhưng trong Fluent đợi, bạn có thể chỉ định và ghi đè khoảng thời gian bỏ phiếu
Để thêm chờ đợi ngầm định trong tập lệnh thử nghiệm, hãy nhập gói sau
import java.util.concurrent.TimeUnit;
cú pháp
driver.manage[].timeouts[].implicitlyWait[10, TimeUnit.SECONDS];
Lệnh implicitlyWait đợi một phần tử tải trong một khoảng thời gian xác định
WebDriver driver = new FirefoxDriver[];
driver.manage[].timeouts[].implicitlyWait[Duration.ofSeconds[10]];
driver.get["//somedomain/url_that_delays_loading"];
WebElement myDynamicElement = driver.findElement[By.id["myDynamicElement"]]
Ở đây, người kiểm tra đã chỉ định đợi trong 10 giây [thông qua Thời lượng. ofSeconds[10]] trước khi tiếp tục tương tác với phần tử. Tuy nhiên, người kiểm tra cũng có thể áp dụng các đơn vị thời gian khác, chẳng hạn như được hiển thị bằng tùy chọn tự động điền này trong IntelliJ
Giá trị mặc định của chờ ngầm định là 0
Vui lòng làm theo phần còn lại của mã với loạt bài dành cho người mới bắt đầu sử dụng Selenium của chúng tôi để giải thích chi tiết các chức năng
lệnh pageLoadTimeout trong thời gian chờ Selenium
Như tên gợi ý, lệnh pageLoadTimeout đợi trang tải hoàn toàn trong một số giây được chỉ định. Giá trị mặc định là 0 và giá trị âm có nghĩa là thời gian chờ vô hạn
WebDriver driver = new FirefoxDriver[];
driver.manage[].timeouts[].pageLoadTimeout[30, TimeUnit.SECONDS];
driver.get["//www.google.com/"];
Tại đây, người thử nghiệm đã chỉ định đợi trong 30 giây trước khi tiếp tục tương tác với phần tử. Do đó, WebDriver sẽ đợi tối đa là 30 giây. pageLoadTimeout là một tùy chọn tốt khi bạn đang muốn kiểm tra hiệu suất tải trang có nằm trong giới hạn không. Ví dụ: chúng ta có thể sử dụng điều tiết mạng và làm chậm băng thông để kiểm tra thời gian tải trang tại đây. Sử dụng mã trên trong cùng một kịch bản, chúng tôi có thể biết liệu trang của chúng tôi có thể tải trên mạng 3G hay mạng 2G, v.v.
lệnh setScriptTimeout trong thời gian chờ Selenium
Lệnh setScriptTimeout đợi các phần không đồng bộ của trang web tải xong trong một số giây đã chỉ định
driver.manage[].timeouts[].setScriptTimeout[15, TimeUnit.SECONDS];
[[JavascriptExecutor] driver].executeScript["alert['hello world'];"];
[[JavascriptExecutor] driver].executeAsyncScript["window.setTimeout[arguments[arguments.length - 1], 500];"];
Tại đây, người thử nghiệm đã chỉ định đợi trong 15 giây trước khi tiếp tục tương tác với phần tử
Loại lệnh chờ ngầm được sử dụng tùy thuộc vào người kiểm tra và quyết định bị ảnh hưởng bởi tập lệnh kiểm tra và đặc tính của phần tử đích. Với phần giới thiệu về sự chờ đợi ngầm định trong Selenium, điều quan trọng cần lưu ý là nó có một số nhược điểm và một cảnh báo quan trọng
Không nên trộn lẫn chờ đợi ngầm với chờ đợi rõ ràng trong các tập lệnh thử nghiệm. Tập lệnh kiểm tra có cả thời gian chờ có thể tạo ra hành vi không thể đoán trước do thời lượng chờ không đúng
Ngoài cảnh báo trên, bạn chỉ nên sử dụng chờ ngầm khi bạn có toàn quyền kiểm soát tập lệnh và việc sử dụng kiểu chờ này là cực kỳ cần thiết. Vì thời gian chờ ngầm định được áp dụng trong suốt thời gian tồn tại của Webdriver nên nó có thể kéo dài thời gian thực hiện kiểm tra đến một giá trị lớn tùy thuộc vào số lượng phần tử mà nó được gọi. Như đã nói, nếu người thử nghiệm biết kịch bản của họ, thì có thể áp dụng chờ ngầm mà không phải lo lắng
Chờ đợi rõ ràng trong Selenium
Chờ rõ ràng là một chiến lược chờ có điều kiện trong Selenium, nói cách khác, bạn đợi cho đến khi điều kiện bạn chỉ định trở thành đúng hoặc khoảng thời gian đã trôi qua. Vì chức năng chờ rõ ràng hoạt động với một điều kiện, nên chúng giúp đồng bộ hóa trình duyệt, mô hình đối tượng tài liệu và tập lệnh thực thi thử nghiệm. Do đó, kết quả thực hiện tổng thể là thỏa đáng và có thời hạn. Chờ đợi rõ ràng cung cấp các điều kiện sau để sử dụng
- alertIsPresent[]
- phần tửSelectionStateToBe[]
- phần tửToBeClickable[]
- phần tửToBeSelected[]
- frameToBeAvaliableAndSwitchToIt[]
- invisibilityOfTheElementLocate[]
- invisibilityOfElementWithText[]
- hiện diệnOfAllElementsLocateBy[]
- hiện diệnOfElementLocate[]
- textToBePresentInElement[]
- textToBePresentInElementLocate[]
- textToBePresentInElementValue[]
- titleIst[]
- titleContains[]
- khả năng hiển thị của []
- visibilityOfAllElements[]
- khả năng hiển thịOfAllElementsLocateBy[]
- khả năng hiển thịOfElementLocation[]
Các điều kiện trên thuộc hai loại lệnh chờ rõ ràng
- WebDriverĐợi
- Lưu loátChờ đợi
Hãy xem mức độ liên quan của mỗi người trong số họ trong quá trình thực thi thử nghiệm
Lệnh WebDriverWait trong Selenium
WebDriverWait chỉ định điều kiện và thời gian mà WebDriver cần đợi. Trên thực tế, WebDriverWait và chờ rõ ràng đồng nghĩa với nhau vì định nghĩa và cách sử dụng của chúng hoàn toàn khớp với nhau. Vì vậy, nếu ai đó yêu cầu bạn viết một số tập lệnh chờ rõ ràng, thì có thể an toàn khi cho rằng các tập lệnh được yêu cầu yêu cầu WebDriverWait
WebElement firstResult = new WebDriverWait[driver, Duration.ofSeconds[10]]
.until[ExpectedConditions.elementToBeClickable[By.xpath["//a/h3"]]];
Tại đây, thời gian chờ được người kiểm tra chỉ định là 10 giây theo Thời lượng. ofSeconds[10] và điều kiện được sử dụng là elementToBeClickable. Do đó, đoạn mã trên tóm tắt là - "WebDriver sẽ đợi tối đa 10 giây để phần tử được xác định bởi XPath có thể nhấp được. Tất cả các lệnh này sẽ phục vụ như một chủ đề cốt lõi khi chúng ta nói về sự chờ đợi rõ ràng trong chương tiếp theo
Chờ thông thạo trong Selenium
Sự chờ đợi trôi chảy tương tự như sự chờ đợi rõ ràng trong Selenium với một đối số bổ sung về tần suất [còn được gọi là thời gian bỏ phiếu]. Số tần suất báo cho WebDriver tiếp tục kiểm tra phần tử theo định kỳ và đợi cho đến khi tối đa "Thời lượng. giây". Điều này giúp tiết kiệm thời gian thực hiện. Nếu phần tử có sẵn sớm hơn, chúng tôi có thể tiến hành thực hiện và hoàn thành nhanh chóng
Wait wait = new FluentWait[driver]
.withTimeout[Duration.ofSeconds[30]]
.pollingEvery[Duration.ofSeconds[5]]
.ignoring[NoSuchElementException.class];
Trong đoạn mã trên, thời gian chờ tối đa cho phép được chỉ định là 30 giây [Duration. ofSeconds[30]] và thời gian bỏ phiếu là 5 giây [pollingEvery[Duration. ofSeconds[5]]]. Với sự sắp xếp này, WebDriver sẽ tiếp tục kiểm tra phần tử cứ sau 5 giây trong khoảng thời gian tối đa là 30 giây
Ở dòng cuối cùng của mã, hãy chú ý đến một chức năng khác "bỏ qua". Đây là cấu hình tùy chỉnh do người kiểm tra viết và không bắt buộc mỗi lần. Ý nghĩa của việc "bỏ qua" là bỏ qua một số ngoại lệ có thể cản trở quá trình thực hiện kiểm thử. Trong mã này, NoSuchElementException là ngoại lệ bị bỏ qua
FluentWait trong Selenium là một lớp quan trọng khi chúng ta xử lý các phần tử AJAX. Khi người dùng đang khám phá trang web trên mạng chậm hơn, các yếu tố này có thể mất nhiều thời gian hơn để tải so với thời gian họ thực hiện trong thử nghiệm trong phòng thí nghiệm. Để chơi an toàn, FluentWait giúp chúng tôi bắt chước các tình huống như vậy và tạo ra ứng dụng web chất lượng tốt nhất
Chìa khóa rút ra
Sau đây là những điểm chính từ bài đăng của chúng tôi trên Selenium Wait
- Chờ Selenium là một khái niệm yêu cầu Selenium đợi trong một khoảng thời gian nhất định hoặc cho đến khi phần tử hiển thị/đã tải/được bật
- Sự chờ đợi của Selenium chia thành sự chờ đợi ngầm định và rõ ràng
- Thời gian chờ ngầm xác định thời gian chờ trong suốt thời gian tồn tại của WebDriver và được áp dụng cho từng phần tử i. e. thực hiện một lần. Tuy nhiên, chờ đợi rõ ràng phụ thuộc vào các điều kiện
- Thời gian chờ rõ ràng phụ thuộc vào điều kiện đã chỉ định hoặc khoảng thời gian chờ tối đa được phép
câu hỏi thường gặp
Là chờ đợi rõ ràng tốt hơn chờ đợi ngầm định?
Bản chất cốt lõi của chờ đợi rõ ràng giúp tiết kiệm thời gian và không áp dụng cho tất cả các phần tử. Điều này mang lại ấn tượng rằng sự chờ đợi rõ ràng sẽ tốt hơn và được ưu tiên hơn để tạo thử nghiệm. Tuy nhiên, không có bằng chứng nào như vậy và mỗi kiểu chờ đợi đều có mức độ phù hợp riêng
Khi nào thì sử dụng chờ ẩn và khi nào sử dụng chờ rõ ràng?
Chờ ngầm định được áp dụng một lần cho tất cả các phần tử và chu kỳ chờ tiếp theo bắt đầu sau khi chu kỳ chờ trước đó hoàn thành. Nếu tình huống như vậy phù hợp với yêu cầu của bạn, các lệnh chờ ngầm định là tốt nhất trong những trường hợp như vậy. Ví dụ: nếu bạn chỉ muốn thực hiện một tác vụ sau khi tải toàn bộ trang, bạn có thể tiếp tục với pageLoadTimeout. Nhưng sự chờ đợi này dù sao cũng nên được áp dụng
Sự chờ đợi rõ ràng là có điều kiện trong tự nhiên. Nếu bạn chỉ muốn đợi một vài phần tử được chọn dựa trên các điều kiện, thì cách tốt nhất là chờ đợi rõ ràng. Tuy nhiên, chờ đợi ngầm được sử dụng mà không hiểu rõ về tập lệnh có thể dẫn đến thời gian hoàn thành tập lệnh dài không cần thiết
Bỏ phiếu trong chờ đợi ngầm định là gì?
Việc chờ đợi ngầm định được thực hiện cho đến khi phần tử được tìm thấy hoặc thời gian tối đa đã trôi qua. Nhưng đối với dự phòng, sự chờ đợi ngầm định trong Selenium đi kèm với một tính năng được gọi là thăm dò ý kiến. Với bỏ phiếu, chờ đợi ngầm định tiếp tục tìm kiếm phần tử theo các khoảng thời gian đều đặn cho đến khi tìm thấy phần tử hoặc thời gian tối đa đã trôi qua
Loại chờ Selenium nào tốt nhất?
Không có loại chờ Selenium "tốt nhất" khi thử nghiệm một ứng dụng web. Các trường hợp sử dụng khác nhau yêu cầu các loại điều kiện chờ khác nhau và do đó yêu cầu các lệnh thích hợp
bài tập
Bạn có thể tiếp tục với các bài tập sau trên Selenium Wait để làm cho kiến thức cơ bản của bạn vững chắc hơn
- Khởi chạy một trình duyệt mới [chẳng hạn như ChromeDriver]
- Mở URL "https. // demoqa. com/thuộc tính động"
- Phóng to cửa sổ
- Tìm một phần tử có id "visibleAfter". Phần tử này mất 5 giây để tải, nghĩa là phần tử này sẽ xuất hiện sau 5 giây
- Sử dụng implicitlyWait để đợi phần tử đó
package org.example;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ImplicitWait {
protected WebDriver driver;
@Test
public void implicitWaitExcercise[]
{
driver = new ChromeDriver[];
driver.manage[].timeouts[].implicitlyWait[Duration.ofSeconds[10]];
// launch Chrome and redirect it to the URL
driver.get["//demoqa.com/dynamic-properties"];
//This element will appear after 5 secs
driver.findElement[By.id["visibleAfter"]].click[];
//close browser
driver.close[];
}
}
Bạn sẽ nhận thấy rằng mặc dù phần tử mất 5 giây để xuất hiện, tập lệnh Selenium vẫn sẽ vượt qua. Vì đợi ngầm nên nó tự động chờ phần tử xuất hiện