Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
Automation_selenium
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Trình Nguyễn
Automation_selenium
Commits
588d6ee8
Commit
588d6ee8
authored
May 11, 2026
by
Đỗ Gia Hưng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Thêm hiệu ứng Highlight và Log chi tiết các bước chạy Test
parent
b85cb4d0
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
36 additions
and
25 deletions
+36
-25
HandleJavascriptExecutorTest.java
...om/automation/testcases/HandleJavascriptExecutorTest.java
+14
-12
HandleWaitTest.java
src/test/java/com/automation/testcases/HandleWaitTest.java
+22
-13
No files found.
src/test/java/com/automation/testcases/HandleJavascriptExecutorTest.java
View file @
588d6ee8
...
...
@@ -17,13 +17,15 @@ public class HandleJavascriptExecutorTest extends BaseSetup {
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
(
">>> [Thực chiến] Gán giá trị bằng Javascript để bypass giao diện..."
);
System
.
out
.
println
(
"\n[Bước 1]: Đã tìm thấy ô Email. Đang tô viền đỏ (Highlight)..."
);
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
);
// Kiểm tra lại xem đã gán thành công chưa
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"
);
Thread
.
sleep
(
2000
);
...
...
@@ -40,13 +42,16 @@ public class HandleJavascriptExecutorTest extends BaseSetup {
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
(
">>> [Thực chiến] Dùng lệnh click của DOM để xuyên thủng vật cản..."
);
System
.
out
.
println
(
"\n[Bước 1]: Đã tìm thấy nút Login. Đang tô viền đỏ (Highlight)..."
);
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
);
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
();
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 {
driver
.
get
(
"https://anhtester.com/"
);
JavascriptExecutor
js
=
(
JavascriptExecutor
)
driver
;
// Cuộn xuống tận cùng 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..."
);
System
.
out
.
println
(
"\n[Bước 1]: Đang cuộn mạnh xuống cuối cùng của trang web..."
);
js
.
executeScript
(
"window.scrollTo(0, document.body.scrollHeight)"
);
Thread
.
sleep
(
2000
);
// Cuộn ngược lên bằng tọa độ (scrollBy)
System
.
out
.
println
(
">>> Cuộn ngược lên trên một chút..."
);
System
.
out
.
println
(
"[Bước 2]: Đang cuộn ngược lên một chút (bằng tọa độ)..."
);
js
.
executeScript
(
"window.scrollBy(0, -1500)"
);
Thread
.
sleep
(
2000
);
}
}
...
...
src/test/java/com/automation/testcases/HandleWaitTest.java
View file @
588d6ee8
...
...
@@ -16,31 +16,36 @@ import java.time.Duration;
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"
)
public
void
testWaitSpinnerDisappear
()
{
public
void
testWaitSpinnerDisappear
()
throws
InterruptedException
{
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)
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
);
// Tạm dừng để user thấy viền đỏ
startBtn
.
click
();
WebDriverWait
wait
=
new
WebDriverWait
(
driver
,
Duration
.
ofSeconds
(
15
));
// NẾU DÙNG IMPLICIT WAIT HOẶC THREAD.SLEEP Ở ĐÂY SẼ RẤT DỞ.
// 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..."
);
System
.
out
.
println
(
"[Bước 2]: Web đang xử lý (hiện Loading Spinner). Đang dùng Explicit Wait để canh gác..."
);
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"
));
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!"
);
}
@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
.
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
FluentWait
<
WebDriver
>
wait
=
new
FluentWait
<>(
driver
)
...
...
@@ -48,13 +53,17 @@ public class HandleWaitTest extends BaseSetup {
.
pollingEvery
(
Duration
.
ofSeconds
(
1
))
.
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.
// 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"
)));
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!"
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment