Làm mới trang bằng cách sử dụng Selenium webdriver
⚡ Tóm tắt thông minh
Làm mới trang trong Selenium WebDriver tải lại phiên bản hiện tại. URL để mọi phần tử được hiển thị trước khi các câu lệnh kiểm tra được thực thi, và khung phần mềm cung cấp năm lệnh khác nhau thực hiện cùng một thao tác tải lại theo những cách khác nhau.
Trong quá trình tự động hóa kiểm thử ứng dụng web, đôi khi cần phải làm mới trang nhiều lần để tất cả các thành phần web được tải hoàn toàn. Khi tải trang lần đầu, một số thành phần web có thể được tải, nhưng cần phải làm mới trang lần thứ hai để tất cả chúng xuất hiện. Điều này có thể được thực hiện bằng cách sử dụng lệnh làm mới được cung cấp bởi Selenium WebDriver.
Cách làm mới trang trong Selenium
Hoạt động làm mới trình duyệt có thể được thực hiện bằng những cách sau đây Selenium. Chúng tôi sẽ thảo luận chi tiết về các cách được đề cập dưới đây trong suốt bài viết.
- lệnh driver.navigate().refresh()
- Lấy phương thức
- Lệnh gửi chìa khóa
- Phương pháp điều hướng
- lệnh driver.navigate().to()
1) Lệnh driver.navigate().refresh()
Đây là phương pháp tích hợp sẵn để thực hiện thao tác làm mới trang do cung cấp. Selenium WebDriver. Lệnh này là lệnh được sử dụng phổ biến nhất trong tự động hóa kiểm thử để thực hiện thao tác làm mới trang. Lệnh làm mới có thể được sử dụng một cách đơn giản như được đề cập bên dưới.
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();
Giao diện điều hướng (Navigation) được sử dụng để thực hiện nhiều thao tác khác nhau trên trình duyệt, chẳng hạn như quay lại trang trước, chuyển đến trang tiếp theo, làm mới trang và đóng trình duyệt. Các phương thức của giao diện điều hướng có thể được truy cập bằng lệnh `driver.navigate()`. Phương thức `refresh` của giao diện điều hướng không nhận bất kỳ đối số nào và không trả về bất kỳ giá trị nào.
Ví dụ:
Kịch bản thử nghiệm:
- Mở trình duyệt Chrome với trang web đó. https://demo.guru99.com/selenium/guru99home/
- Sau khi trang được tải thành công, hãy làm mới trang web bằng phương thức driver.navigate().refresh().
- Đóng trình duyệt bằng phương thức driver.close()
Code
package Guru99Demo; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class RefreshDemo { public static void main(String args[]) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://demo.guru99.com/selenium/guru99home/"); driver.manage().window().maximize(); driver.navigate().refresh(); driver.close(); } }
⚠️ Ghi chú phiên bản: Selenium Quản lý được vận chuyển kèm theo Selenium 4.6 và tự động tải xuống trình điều khiển trình duyệt phù hợp, do đó dòng System.setProperty ở trên không còn cần thiết trên phiên bản hiện tại — new ChromeDriver() Như vậy là đủ. Dòng ban đầu được giữ nguyên vì nó vẫn chính xác. Selenium 3 kiểu thiết lập mà ví dụ được viết dựa trên đó.
Code Đầu ra:
Khi trang chủ demo được tải lần đầu, nó sẽ hiển thị như hình bên dưới.
Sau khi làm mới trang, video trên trang đã thay đổi, điều này xác nhận rằng quá trình tải lại đã thực sự diễn ra.
Nhiều cách khác để làm mới trang
Phương pháp làm mới trang không phải là cách duy nhất để tải lại nội dung. Bốn kỹ thuật dưới đây đều cho kết quả tương tự và rất đáng để bạn biết, bởi vì một ứng dụng bị khóa hoặc một trình duyệt cứng đầu đôi khi sẽ chặn một trong số chúng.
2) Phương thức Get
Phương thức `get` có thể được sử dụng theo cách đệ quy để làm mới trang. Để thực hiện điều này, chúng ta cần truyền một phương thức khác làm đối số cho phương thức `get`.
Ví dụ:
driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());
3) Phương pháp điều hướng
Phương pháp này sử dụng cùng khái niệm đệ quy như đã đề cập ở trên. Phương thức getCurrentUrl() được truyền làm đối số cho phương thức driver.navigate().to().
Ví dụ:
driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());
4) Phương pháp gửi phím bằng phím F5
Đây là phương pháp được sử dụng phổ biến thứ hai để làm mới một trang trong SeleniumNó nhận phím làm mới (F5) làm đối số cho phương thức sendKeys. Vì sendKeys chỉ hoạt động trên các phần tử web chứ không phải trên trình duyệt, nên trước tiên chúng ta phải xác định một phần tử web hợp lệ trên trang web và sau đó sử dụng phương thức sendKeys. Điều này có thể được thực hiện như được hiển thị bên dưới.
Ví dụ:
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys(Keys.F5);
Vì thao tác nhấn phím được thực hiện trên một phần tử chứ không phải trên giao diện trình duyệt, nên phương thức này phụ thuộc vào phần tử đó có đang được chọn hay không. Nếu định vị Nếu giá trị khớp với một trường không thể nhận tiêu điểm, khóa sẽ bị bỏ qua và trang sẽ không bao giờ tải lại.
5) Phương pháp gửi phím sử dụng ASCII Code
Phương pháp này sử dụng cùng một khái niệm như trên, nhưng thay vì truyền phím F5 làm đối số, chúng ta truyền mã điểm của phím làm mới làm đối số. Điều này có thể được thực hiện như hình bên dưới.
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys("\uE035");
Giá trị \uE035 là mã Unicode của WebDriver mà giao thức ánh xạ tới phím F5, vì vậy đoạn mã này và đoạn mã trước đó là tương đương nhau.
Cách làm mới trang bằng cách sử dụng JavaScriptExecutor
Mỗi trình duyệt đều cung cấp chức năng tải lại trang cho các tập lệnh trang, và Selenium có thể gọi nó thông qua JavascriptGiao diện thực thi. Đây là phương án dự phòng thông thường khi lệnh làm mới của WebDriver bị ứng dụng hoặc tiện ích mở rộng của trình duyệt chặn lại.
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");
Có hai biến thể đáng nhớ:
- location.reload() Thực hiện tải lại bình thường và có thể hiển thị trang từ bộ nhớ đệm.
- lịch sử.go(0) Đây là một phiên bản cũ hơn, tương đương với phiên bản mà một số bộ phần mềm cũ vẫn đang sử dụng.
Tuyến thực thi chạy bên trong trang, vì vậy nó không tự chờ tài liệu mới. Hãy theo sau nó bằng một lệnh chờ rõ ràng giống như bạn vẫn làm sau khi gọi `driver.navigate().refresh()`, và nhớ rằng việc tải lại trang bằng script sẽ không xóa hộp thoại ở cấp độ trình duyệt. Nếu ứng dụng đang được kiểm thử tải nội dung không đồng bộ, hãy cẩn thận như khi... xử lý các cuộc gọi AJAX trong Selenium webdriver.
Cách tránh lỗi StaleElementReferenceException sau khi làm mới
Thao tác làm mới trang sẽ phá hủy DOM hiện tại và xây dựng một DOM mới. Mỗi WebElement được lưu lại trước khi tải lại trang giờ đây trỏ đến một nút không còn tồn tại, vì vậy lần gọi tiếp theo đến nút đó sẽ gây ra lỗi StaleElementReferenceException. Đây là lỗi phổ biến nhất xảy ra sau khi làm mới trang.
Ba thói quen này giúp loại bỏ gần như tất cả những thất bại đó:
- Tìm kiếm sau, không phải trước. Hãy lưu trữ bộ định vị By thay vì WebElement, và gọi lại phương thức findElement sau khi quá trình tải lại hoàn tất.
- Hãy chờ tín hiệu thực sự. Việc chờ đợi rõ ràng sự xuất hiện của một phần tử chỉ tồn tại sau khi tải lại trang sẽ đáng tin cậy hơn nhiều so với việc sử dụng một khoảng thời gian chờ cố định.
- Làm mới trang, rồi đọc lại. Không bao giờ được sử dụng giá trị văn bản hoặc thuộc tính được ghi lại trước khi tải lại để đưa vào câu lệnh xác nhận được thực hiện sau đó.
Mẫu dưới đây áp dụng cho cả ba trường hợp:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.navigate().refresh(); WebElement search = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("username"))); search.sendKeys("guru99");
WebDriverWait nhận một tham số Duration. Selenium 4, đây là một thay đổi so với hàm tạo số nguyên giây được sử dụng trong Selenium 3. Các kỹ thuật xử lý rộng hơn cho những lỗi này được đề cập trong hướng dẫn của chúng tôi về... xử lý ngoại lệ trong Selenium.
So sánh Selenium Phương pháp làm mới trang
Cả sáu lệnh đều tải lại trang, nhưng chúng khác nhau về thành phần phụ thuộc và cách thức xảy ra lỗi.
| Phương pháp | Phụ thuộc | Tải lại thông qua | Khi đó là sự lựa chọn đúng đắn |
|---|---|---|---|
| driver.navigate().refresh() | Không có gì thêm | Lệnh tải lại trình duyệt | Hầu như luôn luôn — mặc định |
| trình điều khiển.lấy(trình điều khiển.getCurrentUrl()) | Dòng điện dễ đọc URL | Một cách điều hướng mới | Khi bạn cũng muốn xóa mục lịch sử |
| driver.navigate().to(driver.getCurrentUrl()) | Dòng điện dễ đọc URL | Một cách điều hướng mới | Tương tự như trên, được viết thông qua giao diện Điều hướng. |
| sendKeys(Keys.F5) | Một phần tử có thể lấy tiêu điểm | Một lần nhấn phím | Khi bạn cố tình kiểm tra đường dẫn bàn phím |
| sendKeys(“\uE035”) | Một phần tử có thể lấy tiêu điểm | Một lần nhấn phím | Giống hệt F5, được viết dưới dạng mã điểm. |
| JavascriptVị trí thực thi.reload() | Đã bật tính năng lập trình kịch bản. | Một kịch bản trang | Khi lệnh WebDriver bị chặn |
Hãy bắt đầu với lệnh làm mới, và chỉ chuyển sang hàng khác khi thao tác đó thất bại vì lý do bạn hiểu rõ. Thứ tự ưu tiên tương tự cũng áp dụng khi bạn... Phóng to hoặc thu nhỏ cửa sổ trình duyệtƯu tiên sử dụng lệnh gọi WebDriver gốc và coi đường dẫn script là phương án dự phòng.


