Commit 588d6ee8 authored by Đỗ Gia Hưng's avatar Đỗ Gia Hưng

Thêm hiệu ứng Highlight và Log chi tiết các bước chạy Test

parent b85cb4d0
...@@ -17,13 +17,15 @@ public class HandleJavascriptExecutorTest extends BaseSetup { ...@@ -17,13 +17,15 @@ public class HandleJavascriptExecutorTest extends BaseSetup {
WebElement emailInput = driver.findElement(By.id("email")); WebElement emailInput = driver.findElement(By.id("email"));
// Gán giá trị bằng JS. Cực kỳ hiệu quả nếu ô input bị thuộc tính readonly chặn. System.out.println("\n[Bước 1]: Đã tìm thấy ô Email. Đang tô viền đỏ (Highlight)...");
System.out.println(">>> [Thực chiến] Gán giá trị bằng Javascript để bypass giao diện..."); highlightElement(emailInput);
Thread.sleep(1500); // Tạm dừng 1.5s để user kịp nhìn viền đỏ
System.out.println("[Bước 2]: Gán giá trị 'admin@example.com' bằng Javascript...");
js.executeScript("arguments[0].value = 'admin@example.com';", emailInput); js.executeScript("arguments[0].value = 'admin@example.com';", emailInput);
// Kiểm tra lại xem đã gán thành công chưa
String actualValue = (String) js.executeScript("return arguments[0].value;", emailInput); String actualValue = (String) js.executeScript("return arguments[0].value;", emailInput);
System.out.println(">>> Giá trị ô email sau khi dùng JS: " + actualValue); System.out.println("[Bước 3]: Kiểm tra lại kết quả. Giá trị hiện tại: " + actualValue);
Assert.assertEquals(actualValue, "admin@example.com"); Assert.assertEquals(actualValue, "admin@example.com");
Thread.sleep(2000); Thread.sleep(2000);
...@@ -40,13 +42,16 @@ public class HandleJavascriptExecutorTest extends BaseSetup { ...@@ -40,13 +42,16 @@ public class HandleJavascriptExecutorTest extends BaseSetup {
WebElement loginBtn = driver.findElement(By.xpath("//button[normalize-space()='Login']")); WebElement loginBtn = driver.findElement(By.xpath("//button[normalize-space()='Login']"));
// Giả sử nút Login bị popup chặn, click() thường sẽ lỗi. Ta dùng JS. System.out.println("\n[Bước 1]: Đã tìm thấy nút Login. Đang tô viền đỏ (Highlight)...");
System.out.println(">>> [Thực chiến] Dùng lệnh click của DOM để xuyên thủng vật cản..."); highlightElement(loginBtn);
Thread.sleep(1500);
System.out.println("[Bước 2]: Dùng JS kích hoạt sự kiện Click xuyên qua mọi vật cản UI...");
js.executeScript("arguments[0].click();", loginBtn); js.executeScript("arguments[0].click();", loginBtn);
Thread.sleep(2000); Thread.sleep(2000);
// Vì chưa nhập thông tin nên không thể login thành công, URL vẫn giữ nguyên System.out.println("[Bước 3]: Kiểm tra URL sau khi click...");
String currentUrl = driver.getCurrentUrl(); String currentUrl = driver.getCurrentUrl();
Assert.assertTrue(currentUrl.contains("login"), "Đáng lẽ không thể login nhưng lại thành công!"); Assert.assertTrue(currentUrl.contains("login"), "Đáng lẽ không thể login nhưng lại thành công!");
} }
...@@ -56,15 +61,12 @@ public class HandleJavascriptExecutorTest extends BaseSetup { ...@@ -56,15 +61,12 @@ public class HandleJavascriptExecutorTest extends BaseSetup {
driver.get("https://anhtester.com/"); driver.get("https://anhtester.com/");
JavascriptExecutor js = (JavascriptExecutor) driver; JavascriptExecutor js = (JavascriptExecutor) driver;
// Cuộn xuống tận cùng trang web System.out.println("\n[Bước 1]: Đang cuộn mạnh xuống cuối cùng của trang web...");
System.out.println(">>> [Thực chiến] Cuộn cật lực xuống cuối trang để ép web load thêm dữ liệu...");
js.executeScript("window.scrollTo(0, document.body.scrollHeight)"); js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
Thread.sleep(2000); Thread.sleep(2000);
// Cuộn ngược lên bằng tọa độ (scrollBy) System.out.println("[Bước 2]: Đang cuộn ngược lên một chút (bằng tọa độ)...");
System.out.println(">>> Cuộn ngược lên trên một chút...");
js.executeScript("window.scrollBy(0, -1500)"); js.executeScript("window.scrollBy(0, -1500)");
Thread.sleep(2000); Thread.sleep(2000);
} }
} }
......
...@@ -16,31 +16,36 @@ import java.time.Duration; ...@@ -16,31 +16,36 @@ import java.time.Duration;
public class HandleWaitTest extends BaseSetup { public class HandleWaitTest extends BaseSetup {
@Test(priority = 1, description = "Bài 15 - Kịch bản 1: Explicit Wait chờ Loading Spinner biến mất") @Test(priority = 1, description = "Bài 15 - Kịch bản 1: Explicit Wait chờ Loading Spinner biến mất")
public void testWaitSpinnerDisappear() { public void testWaitSpinnerDisappear() throws InterruptedException {
driver.get("https://the-internet.herokuapp.com/dynamic_loading/1"); driver.get("https://the-internet.herokuapp.com/dynamic_loading/1");
// Click nút Start để hệ thống bắt đầu xử lý (hiện spinner) WebElement startBtn = driver.findElement(By.xpath("//button[text()='Start']"));
driver.findElement(By.xpath("//button[text()='Start']")).click(); System.out.println("\n[Bước 1]: Đã thấy nút Start. Đang tô viền đỏ...");
highlightElement(startBtn);
Thread.sleep(1500); // Tạm dừng để user thấy viền đỏ
startBtn.click();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15)); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
// NẾU DÙNG IMPLICIT WAIT HOẶC THREAD.SLEEP Ở ĐÂY SẼ RẤT DỞ. System.out.println("[Bước 2]: Web đang xử lý (hiện Loading Spinner). Đang dùng Explicit Wait để canh gác...");
// Ta BẮT BUỘC dùng Explicit Wait để chờ cái spinner <div id='loading'> mất đi hoàn toàn.
// Đây là tình huống cực kỳ phổ biến khi làm dự án thực tế.
System.out.println(">>> [Thực chiến] Đang chờ Loading Spinner biến mất hoàn toàn...");
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading"))); wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading")));
// Sau khi spinner biến mất thì chữ Hello World mới thực sự hiển thị System.out.println("[Bước 3]: Loading Spinner đã biến mất hoàn toàn! Bắt đầu lấy kết quả...");
WebElement finishText = driver.findElement(By.id("finish")); WebElement finishText = driver.findElement(By.id("finish"));
System.out.println(">>> Kết quả: " + finishText.getText()); highlightElement(finishText);
System.out.println("[Bước 4]: Kết quả là: " + finishText.getText());
Assert.assertTrue(finishText.isDisplayed(), "Dữ liệu chưa load xong!"); Assert.assertTrue(finishText.isDisplayed(), "Dữ liệu chưa load xong!");
} }
@Test(priority = 2, description = "Bài 15 - Kịch bản 2: Fluent Wait chờ Element ngẫu nhiên") @Test(priority = 2, description = "Bài 15 - Kịch bản 2: Fluent Wait chờ Element ngẫu nhiên")
public void testFluentWait() { public void testFluentWait() throws InterruptedException {
driver.get("https://the-internet.herokuapp.com/dynamic_loading/2"); driver.get("https://the-internet.herokuapp.com/dynamic_loading/2");
driver.findElement(By.xpath("//button[text()='Start']")).click(); WebElement startBtn = driver.findElement(By.xpath("//button[text()='Start']"));
System.out.println("\n[Bước 1]: Đã thấy nút Start. Đang tô viền đỏ...");
highlightElement(startBtn);
Thread.sleep(1500);
startBtn.click();
// Khởi tạo Fluent Wait: Chờ tối đa 15s, cứ 1s tìm 1 lần, bỏ qua lỗi NoSuchElementException // Khởi tạo Fluent Wait: Chờ tối đa 15s, cứ 1s tìm 1 lần, bỏ qua lỗi NoSuchElementException
FluentWait<WebDriver> wait = new FluentWait<>(driver) FluentWait<WebDriver> wait = new FluentWait<>(driver)
...@@ -48,13 +53,17 @@ public class HandleWaitTest extends BaseSetup { ...@@ -48,13 +53,17 @@ public class HandleWaitTest extends BaseSetup {
.pollingEvery(Duration.ofSeconds(1)) .pollingEvery(Duration.ofSeconds(1))
.ignoring(NoSuchElementException.class); .ignoring(NoSuchElementException.class);
System.out.println(">>> [Thực chiến] Đang dùng Fluent Wait để thăm dò sự xuất hiện của phần tử..."); System.out.println("[Bước 2]: Đang dùng Fluent Wait (tìm 1 lần / giây) để rình rập Element...");
// Element ở trang số 2 này ban đầu hoàn toàn KHÔNG CÓ TRONG DOM. // Element ở trang số 2 này ban đầu hoàn toàn KHÔNG CÓ TRONG DOM.
// Phải dùng FluentWait để nó lặp lại việc tìm kiếm mà không văng lỗi sảng. // Phải dùng FluentWait để nó lặp lại việc tìm kiếm mà không văng lỗi sảng.
WebElement finishText = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='finish']/h4"))); WebElement finishText = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='finish']/h4")));
System.out.println(">>> Đã tìm thấy! Kết quả: " + finishText.getText()); System.out.println("[Bước 3]: Đã bắt được Element lúc nó vừa xuất hiện! Đang tô viền đỏ...");
highlightElement(finishText);
Thread.sleep(1500); // Nhìn viền đỏ 1.5s
System.out.println("[Bước 4]: Kết quả: " + finishText.getText());
Assert.assertEquals(finishText.getText(), "Hello World!"); Assert.assertEquals(finishText.getText(), "Hello World!");
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment