# 🎯 CHECKLIST CHỌN TOOL AUTOMATION TESTING
## Playwright vs Selenium — Dành cho Tester Fresher Việt Nam

> **Hướng dẫn sử dụng:** Trả lời 5 câu hỏi bên dưới, tính tổng điểm và xem kết quả ở Phần 2.
> Thời gian hoàn thành: ~5 phút ⏱️

---

# 📋 PHẦN 1: BÀI TRẮC NGHIỆM CHỌN TOOL

## Bảng tính điểm tổng hợp

| Câu | Nội dung | Điểm của bạn |
|-----|----------|:------------:|
| Q1 | Loại công ty bạn nhắm đến | ___/3 |
| Q2 | Background kỹ thuật hiện tại | ___/3 |
| Q3 | Timeline xin việc | ___/3 |
| Q4 | Loại app cần test | ___/3 |
| Q5 | Team và môi trường hiện tại | ___/3 |
| | **TỔNG ĐIỂM** | **___/15** |

> 🔵 **Điểm thấp (5–9):** → Selenium phù hợp hơn
> 🟢 **Điểm cao (10–15):** → Playwright phù hợp hơn
> ⚖️ **Điểm trung bình (đúng 9 hoặc 10):** → Đọc kỹ Phần 2 để quyết định

---

## ❓ Câu 1: Loại công ty bạn đang nhắm đến

*Chọn 1 đáp án phù hợp nhất với mục tiêu xin việc của bạn:*

- [ ] **A. Công ty outsource truyền thống, dự án cho khách Nhật/Hàn** *(1 điểm)*
  > Selenium vẫn chiếm > 70% dự án tại các công ty này
- [ ] **B. Công ty outsource tầm trung, dự án mix Âu-Mỹ-Nhật** *(2 điểm)*
  > Đang trong giai đoạn chuyển dịch, cần biết cả hai
- [ ] **C. Product company, startup tech, công ty Âu-Mỹ** *(3 điểm)*
  > Playwright được adopt nhanh tại các môi trường này

**📝 Ghi chú Q1:** Nếu chưa biết nhắm đến công ty nào, chọn **B (2 điểm)**.

---

## ❓ Câu 2: Background kỹ thuật của bạn hiện tại

*Mô tả đúng nhất tình trạng kỹ năng code của bạn:*

- [ ] **A. Mình gần như không biết code, chỉ biết click và test tay** *(1 điểm)*
  > Selenium có nhiều tài liệu tiếng Việt và cộng đồng hỗ trợ rộng hơn
- [ ] **B. Mình biết HTML/CSS cơ bản, đã học 1 ngôn ngữ lập trình nhưng chưa thành thạo** *(2 điểm)*
  > Playwright có thể học được nhưng cần thêm effort
- [ ] **C. Mình khá thoải mái với JavaScript/TypeScript hoặc Python, đã từng viết script nhỏ** *(3 điểm)*
  > Playwright sẽ phát huy tốt với nền tảng này

**📝 Ghi chú Q2:**

| Ngôn ngữ bạn biết | Tool phù hợp |
|-------------------|-------------|
| Java | Selenium (Java) hoặc Playwright (Java) |
| Python | Cả hai đều được, Selenium có nhiều tài liệu hơn |
| JavaScript/TypeScript | Playwright là lựa chọn tự nhiên |
| C# | Playwright (C#) khá mạnh |

---

## ❓ Câu 3: Timeline bạn muốn tìm được việc

*Bạn đang có bao nhiêu thời gian để học trước khi đi phỏng vấn?*

- [ ] **A. Dưới 2 tháng — Mình cần tìm việc gấp** *(1 điểm)*
  > Selenium có nhiều job hơn, dễ xin hơn với fresher trong thời gian ngắn
- [ ] **B. 2–4 tháng — Mình có thời gian học tương đối** *(2 điểm)*
  > Đủ thời gian để học cơ bản một trong hai tool
- [ ] **C. Trên 4 tháng — Mình sẵn sàng đầu tư học kỹ** *(3 điểm)*
  > Có thể học Playwright bài bản và xây dựng portfolio tốt

**📝 Thống kê thị trường Việt Nam (tham khảo):**

| Tool | Số job tuyển dụng* | Mức lương fresher |
|------|--------------------|-------------------|
| Selenium | ~60–65% | 8–15 triệu/tháng |
| Playwright | ~25–30% | 10–18 triệu/tháng |
| Cypress | ~10–15% | 10–18 triệu/tháng |

*Ước tính dựa trên LinkedIn, TopDev, ITviec — tỷ lệ thay đổi theo thời gian*

---

## ❓ Câu 4: Loại ứng dụng bạn thường test (hoặc dự định test)

*Chọn đáp án mô tả đúng nhất loại app trong dự án bạn nhắm đến:*

- [ ] **A. Web app cũ (legacy), desktop app, hoặc dự án có cả mobile native** *(1 điểm)*
  > Selenium + Appium là combo truyền thống, hệ sinh thái rộng hơn
- [ ] **B. Web app thông thường, chủ yếu CRUD, form nhập liệu** *(2 điểm)*
  > Cả hai tool đều làm được tốt
- [ ] **C. Modern web app (React/Vue/Angular), SPA, app có nhiều async và animation** *(3 điểm)*
  > Playwright xử lý tốt hơn với auto-wait và modern web features

**📝 So sánh kỹ thuật nhanh:**

| Tính năng | Selenium | Playwright |
|-----------|----------|------------|
| Xử lý iframe | Phức tạp | Đơn giản hơn |
| Auto-wait | ❌ Phải tự thêm | ✅ Built-in |
| Shadow DOM | Khó | Dễ hơn |
| Multiple tabs | Khó | Dễ |
| API Testing | ❌ Không | ✅ Có sẵn |
| Screenshot/Video | Cần setup | ✅ Built-in |
| Mobile emulation | Cần Appium | ✅ Built-in cơ bản |

---

## ❓ Câu 5: Team và môi trường làm việc hiện tại

*Mô tả đúng nhất tình trạng của bạn:*

- [ ] **A. Mình đang tự học một mình, không có mentor, chủ yếu học YouTube tiếng Việt** *(1 điểm)*
  > Selenium có community tiếng Việt rộng hơn, dễ tìm hỗ trợ
- [ ] **B. Mình đang học tại trung tâm hoặc có nhóm học cùng** *(2 điểm)*
  > Tùy chương trình trung tâm đang dạy gì
- [ ] **C. Mình có anh/chị senior hướng dẫn, hoặc đang trong công ty có framework sẵn** *(3 điểm)*
  > Có thể học nhanh hơn, Playwright là lựa chọn hướng tới tương lai

---

# 📊 PHẦN 2: KẾT QUẢ VÀ GIẢI THÍCH

## 🔵 Tổng điểm 5–9: BẠN NÊN HỌC SELENIUM TRƯỚC

```
╔════════════════════════════════════════════╗
║   🏆 KẾT LUẬN: HỌC SELENIUM               ║
║   WebDriver + Java/Python                  ║
║   Phù hợp với profile của bạn             ║
╚════════════════════════════════════════════╝
```

### ✅ Tại sao Selenium phù hợp với bạn lúc này?

- [ ] **Thị trường job rộng hơn** — Nhiều công ty outsource Việt Nam vẫn dùng Selenium, cơ hội tìm việc cao hơn khi bạn còn fresher
- [ ] **Cộng đồng tiếng Việt lớn** — Hàng ngàn video YouTube, bài viết tiếng Việt, group Facebook hỗ trợ
- [ ] **Nền tảng tư duy tốt** — Selenium buộc bạn hiểu rõ WebDriver, locator strategy, wait mechanism — kiến thức này áp dụng được cho mọi tool
- [ ] **Phù hợp với background** — Không cần quá giỏi JavaScript/TypeScript ngay từ đầu
- [ ] **Timeline ngắn vẫn xin được việc** — Với 2–3 tháng học cơ bản, bạn có thể apply được nhiều vị trí

### ⚠️ Lưu ý quan trọng khi học Selenium:

> Đừng dừng lại ở Selenium mãi. Sau khi có job và ổn định 6–12 tháng, hãy bắt đầu học thêm Playwright. Thị trường đang chuyển dịch dần.

### 👤 Profile điển hình phù hợp Selenium:

```
• Fresher chưa có kinh nghiệm code nhiều
• Nhắm đến công ty outsource dự án Nhật/Hàn/Việt
• Cần tìm việc trong 1–3 tháng tới
• Đang tự học một mình không có mentor
• Dự án chủ yếu là web app truyền thống
```

---

## 🟢 Tổng điểm 10–15: BẠN NÊN HỌC PLAYWRIGHT

```
╔════════════════════════════════════════════╗
║   🏆 KẾT LUẬN: HỌC PLAYWRIGHT             ║
║   TypeScript/JavaScript hoặc Python        ║
║   Đây là lựa chọn hướng tới tương lai     ║
╚════════════════════════════════════════════╝
```

### ✅ Tại sao Playwright phù hợp với bạn?

- [ ] **Modern và đang được adopt nhanh** — Microsoft phát triển và maintain tích cực, release update liên tục
- [ ] **All-in-one tool** — Web testing + API testing + Mobile emulation trong một package
- [ ] **Developer experience tốt hơn** — Auto-wait, codegen (tự generate code), trace viewer, built-in reports
- [ ] **Lương cao hơn trung bình** — Công ty product, startup, công ty nước ngoài thường trả tốt hơn
- [ ] **Phù hợp với modern tech stack** — React, Vue, Angular, Next.js... Playwright xử lý tốt hơn

### ⚠️ Lưu ý quan trọng khi học Playwright:

> Số lượng job Playwright tại Việt Nam ít hơn Selenium. Bạn cần **portfolio mạnh hơn** và **kỹ năng coding tốt hơn** để cạnh tranh. Đổi lại, khi có việc thì thường tốt hơn.

### 👤 Profile điển hình phù hợp Playwright:

```
• Có nền tảng JavaScript/TypeScript hoặc Python
• Nhắm đến product company, startup, công ty Âu-Mỹ
• Có 3–6 tháng để học và build portfolio
• Có mentor hoặc đang trong môi trường tech tốt
• Test modern web app (React/Vue/Angular SPA)
```

---

## ⚖️ Điểm 9–10: TRƯỜNG HỢP ĐẶC BIỆT

Nếu bạn ở điểm 9 hoặc 10, hãy trả lời thêm 2 câu hỏi này:

**Câu hỏi tiebreaker:**

- [ ] Bạn có thể commit học **ít nhất 2–3 tiếng/ngày** trong 4 tháng không?
  - Có → Playwright
  - Không → Selenium

- [ ] Bạn có biết JavaScript ở mức **hiểu được callback, promise, async/await** không?
  - Có → Playwright
  - Không → Selenium

---

# 🗺️ PHẦN 3: LỘ TRÌNH HỌC TIẾP THEO

## 🔵 LỘ TRÌNH SELENIUM — 12 TUẦN

### Giai đoạn 1: Nền tảng (Tuần 1–3)

```
Tuần 1: Java/Python cơ bản cho tester
Tuần 2: HTML, CSS, XPath, CSS Selector
Tuần 3: Selenium WebDriver setup và các lệnh cơ bản
```

**Checklist Tuần 1–3:**
- [ ] Cài đặt JDK + IntelliJ IDEA (hoặc Python + PyCharm)
- [ ] Hiểu được OOP cơ bản (class, object, method)
- [ ] Biết inspect element, tìm locator trên browser
- [ ] Chạy được test case đầu tiên mở Google và tìm kiếm
- [ ] Hiểu được `findElement`, `click()`, `sendKeys()`, `getText()`

### Giai đoạn 2: Core Skills (Tuần 4–7)

```
Tuần 4: Selenium WebDriver nâng cao (waits, actions, alerts)
Tuần 5: TestNG/JUnit framework
Tuần 6: Page Object Model (POM) design pattern
Tuần 7: Data-driven testing với Excel/CSV
```

**Checklist Tuần 4–7:**
- [ ] Hiểu và dùng được `ImplicitWait`, `ExplicitWait`, `FluentWait`
- [ ] Xử lý được dropdown, checkbox, radio button, alert
- [ ] Implement được Page Object Model cho 1 website
- [ ] Chạy được test song song với TestNG
- [ ] Đọc được file Excel làm test data

### Giai đoạn 3: Advanced (Tuần 8–10)

```
Tuần 8: Maven/Gradle, quản lý dependency
Tuần 9: Selenium Grid, cross-browser testing
Tuần 10: Extent Reports, Allure Reports
```

**Checklist Tuần 8–10:**
- [ ] Setup được dự án với Maven
- [ ] Chạy test trên Chrome, Firefox, Edge
- [ ] Generate được báo cáo HTML đẹp
- [ ] Upload project lên GitHub

### Giai đoạn 4: Portfolio (Tuần 11–12)

```
Tuần 11-12: Build automation framework cho 1 website thực tế
```

**Checklist Tuần 11–12:**
- [ ] Chọn website để test (ví dụ: saucedemo.com, demoblaze.com)
- [ ] Viết ít nhất 20 test cases thực tế
- [ ] Có README rõ ràng, hướng dẫn cài đặt
- [ ] Push lên GitHub với commit history đẹp
- [ ] Quay video demo (2–3 phút) để đính kèm vào CV

---

### 📚 Tài nguyên học Selenium MIỄN PHÍ

**Tiếng Việt:**

| Nguồn | Link | Nội dung |
|-------|------|----------|
| YouTube - Thanh Nguyen | [youtube.com/@thainguyen.dev](https://www.youtube.com/@thainguyen.dev) | Selenium Java từ cơ bản |
| YouTube - Anh Tester | [youtube.com/@AnhTester](https://www.youtube.com/@AnhTester) | Automation testing VN |
| Testerviet | [testerviet.com](https://testerviet.com) | Bài viết tiếng Việt |
| Group FB: Tester Việt Nam | Facebook | Hỏi đáp cộng đồng |

**Tiếng Anh (miễn phí):**

| Nguồn | Link | Nội dung |
|-------|------|----------|
| Selenium Official Docs | [selenium.dev/documentation](https://selenium.dev/documentation) | Tài liệu chính thức |
| YouTube - Naveen AutomationLabs | YouTube | Selenium Java chuyên sâu |
| YouTube - Mukesh otwani | YouTube | Selenium + TestNG + Maven |
| LambdaTest Blog | [lambdatest.com/blog](https://lambdatest.com/blog) | Bài viết kỹ thuật |
| Udemy Free: "Selenium WebDriver" | Udemy (tìm filter free) | Nhiều khóa học miễn phí |

**Websites để luyện tập:**

| Website | Mục đích |
|---------|----------|
| [saucedemo.com](https://www.saucedemo.com) | E-commerce demo, login, cart |
| [demoblaze.com](https://www.demoblaze.com) | E-commerce, đăng ký, mua hàng |
| [the-internet.herokuapp.com](https://the-internet.herokuapp.com) | Tổng hợp các case khó |
| [automationpractice.pl](http://www.automationpractice.pl) | Shopping site phức tạp |
| [demoqa.com](https://demoqa.com) | Form, widget, interaction |

---

## 🟢 LỘ TRÌNH PLAYWRIGHT — 12 TUẦN

### Giai đoạn 1: Nền tảng (Tuần 1–3)

```
Tuần 1: JavaScript/TypeScript cơ bản cho tester
Tuần 2: Node.js, NPM, VS Code setup
Tuần 3: Playwright cơ bản và cấu trúc project
```

**Checklist Tuần 1–3:**
- [ ] Cài Node.js, VS Code, npm
- [ ] Hiểu async/await, Promise trong JavaScript
- [ ] Cài Playwright và chạy được `npx playwright test`
- [ ] Dùng `playwright codegen` để record test đơn giản
- [ ] Hiểu cấu trúc file `playwright.config.ts`

### Giai đoạn 2: Core Skills (Tuần 4–7)

```
Tuần 4: Locators trong Playwright (getByRole, getByText, getByLabel...)
Tuần 5: Assertions, expect, soft assertions
Tuần 6: Page Object Model với Playwright
Tuần 7: API Testing với Playwright
```

**Checklist Tuần 4–7:**
- [ ] Ưu tiên dùng được semantic locators: `getByRole`, `getByLabel`, `getByPlaceholder`
- [ ] Viết được assertions cơ bản và nâng cao
- [ ] Implement Page Object Model cho 1 dự án
- [ ] Gọi được API và verify response trong Playwright
- [ ] Biết setup `baseURL`, `storageState` trong config

### Giai đoạn 3: Advanced (Tuần 8–10)

```
Tuần 8: Fixtures, Hooks, Test configuration
Tuần 9: Parallel testing, Sharding
Tuần 10: Trace Viewer, HTML Reporter, CI/CD cơ bản
```

**Checklist Tuần 8–10:**
- [ ] Tạo được custom fixtures
- [ ] Chạy test parallel trên multiple browsers (Chrome, Firefox, Safari)
- [ ] Đọc được Trace Viewer để debug
- [ ] Setup được GitHub Actions chạy Playwright tự động
- [ ] Biết dùng `--shard` để chia test

### Giai đoạn 4: Portfolio (Tuần 11–12)

```
Tuần 11-12: Build full automation framework + CI/CD pipeline
```

**Checklist Tuần 11–12:**
- [ ] Framework có cấu trúc rõ ràng: tests, pages, fixtures, utils
- [ ] Tích hợp CI/CD (GitHub Actions)
- [ ] Có báo cáo HTML tự động sau mỗi lần chạy
- [ ] Test cả UI và API trong cùng project
- [ ] README chi tiết, có badge CI/CD
- [ ] Video demo hoặc GIF chạy test

---

### 📚 Tài nguyên học Playwright MIỄN PHÍ

**Tài liệu chính thức (rất tốt):**

| Nguồn | Link | Nội dung |
|-------|------|----------|
| Playwright Docs | [playwright.dev](https://playwright.dev) | Tài liệu chính thức, rất chi tiết |
| Playwright GitHub | [github.com/microsoft/playwright](https://github.com/microsoft/playwright) | Source code, examples |
| Playwright YouTube Channel | YouTube: "Playwright" | Video tutorial chính thức |

**Tiếng Việt:**

| Nguồn | Link | Nội dung |
|-------|------|----------|
| Anh Tester Blog | [anhtester.com](https://anhtester.com) | Có bài Playwright tiếng Việt |
| YouTube - Playwright VN | YouTube | Tìm "playwright tiếng việt" |
| Viblo.asia | [viblo.asia](https://viblo.asia) | Bài viết kỹ thuật Playwright |

**Tiếng Anh (miễn phí):**

| Nguồn | Link | Nội dung |
|-------|------|----------|
| YouTube - Playwright channel | YouTube | Tutorial chính thức |
| YouTube - Arjun Mahajan | YouTube | Playwright TypeScript |
| YouTube - Bondar Academy | YouTube | Playwright từ cơ bản đến nâng cao |
| Testing with Renata | YouTube | Playwright best practices |
| GitHub - awesome-playwright | GitHub | Danh sách tài nguyên tổng hợp |

**Websites để luyện tập với Playwright:**

| Website | Điểm thú vị |
|---------|-------------|
| [playwright.dev/docs/intro](https://playwright.dev/docs/intro) | Demo app đi kèm docs |
| [saucedemo.com](https://www.saucedemo.com) | Classic e-commerce |
| [todomvc.com](https://todomvc.com) | Todo app - các framework khác nhau |
| [automationexercise.com](https://automationexercise.com) | Có sẵn 26 test case để thực hành |
| [httpbin.org](https://httpbin.org) | Luyện API testing |

---

# 🎤 PHẦN 4: CÂU HỎI PHỎNG VẤN THƯỜNG GẶP

## 🔵 CÂU HỎI PHỎNG VẤN SELENIUM

### Nhóm 1: Câu hỏi Khái niệm Cơ bản

**Q1. Selenium là gì? Tại sao bạn chọn Selenium?**

> 💡 **Gợi ý trả lời:**
> "Selenium là open-source framework để automation testing web application. Mình chọn Selenium vì nó hỗ trợ đa ngôn ngữ (Java, Python, C#...), đa trình duyệt, và có cộng đồng rất lớn. Selenium WebDriver giao tiếp trực tiếp với browser thông qua browser driver, không cần plugin."

---

**Q2. Sự khác nhau giữa `findElement` và `findElements` là gì?**

> 💡 **Gợi ý trả lời:**
> - `findElement`: Trả về 1 WebElement đầu tiên tìm thấy. Nếu không tìm thấy → `NoSuchElementException`
> - `findElements`: Trả về List\<WebElement>. Nếu không tìm thấy → List rỗng (không throw exception)

---

**Q3. Các loại locator trong Selenium? Cái nào bạn ưu tiên dùng?**

> 💡 **Gợi ý trả lời:**
> "Có 8 loại: id, name, className, tagName, linkText, partialLinkText, cssSelector, xpath. Mình ưu tiên theo thứ tự: **id > name > cssSelector > xpath**. Id và name nhanh và ổn định nhất. XPath chỉ dùng khi không có cách khác vì chậm hơn và dễ bị break khi UI thay đổi."

---

**Q4. Implicit Wait, Explicit Wait, Fluent Wait khác nhau thế nào?**

> 💡 **Gợi ý trả lời:**

| Loại Wait | Phạm vi | Cách hoạt động |
|-----------|---------|----------------|
| Implicit Wait | Toàn bộ driver | Chờ element xuất hiện trong X giây |
| Explicit Wait | Từng element cụ thể | Chờ condition cụ thể (clickable, visible...) |
| Fluent Wait | Từng element | Như Explicit + polling interval + ignore exceptions |

> "Trong thực tế mình dùng **Explicit Wait** nhiều nhất vì kiểm soát được từng element, tránh chờ không cần thiết."

---

**Q5. Page Object Model (POM) là gì? Tại sao cần dùng?**

> 💡 **Gợi ý trả lời:**
> "POM là design pattern tách biệt **test logic** và **page logic**. Mỗi trang web có 1 class riêng chứa locator và method tương tác. Lợi ích: khi UI thay đổi chỉ cần sửa ở 1 chỗ (page class), không cần sửa tất cả test case. Code dễ maintain và reuse hơn."

---

### Nhóm 2: Câu hỏi Xử lý tình huống

**Q6. Làm sao để handle popup/alert trong Selenium?**

> 💡 **Gợi ý trả lời:**
> ```java
> // Switch sang alert
> Alert alert = driver.switchTo().alert();
> alert.getText();   // Lấy text
> alert.accept();    // Click OK
> alert.dismiss();   // Click Cancel
> alert.sendKeys("text"); // Nhập text vào prompt
> ```

---

**Q7. Làm sao test trên nhiều browser cùng lúc?**

> 💡 **Gợi ý trả lời:**
> "Dùng **TestNG với DataProvider** hoặc **Selenium Grid**. TestNG cho phép parameterize browser name và chạy parallel. Selenium Grid cho phép phân phối test lên nhiều máy khác nhau đồng thời."

---

**Q8. Khi test fail liên tục do element not found, bạn debug thế nào?**

> 💡 **Gợi ý trả lời:**
> 1. Kiểm tra locator còn đúng không (inspect lại)
> 2. Kiểm tra element có trong iframe không → cần `switchTo().frame()`
> 3. Kiểm tra element có bị ẩn/disable không
> 4. Thêm wait phù hợp
> 5. Chụp screenshot khi fail để xem UI thực tế lúc test chạy

---

**Q9. Sự khác nhau giữa `driver.close()` và `driver.quit()`?**

> 💡 **Gợi ý trả lời:**
> - `close()`: Đóng tab/cửa sổ hiện tại đang focus
> - `quit()`: Đóng toàn bộ browser và kết thúc WebDriver session
>
> "Luôn dùng `quit()` trong teardown để tránh memory leak."

---

**Q10. XPath là gì? Viết XPath cho element có id='login-btn'?**

> 💡 **Gợi ý trả lời:**
> "XPath là ngôn ngữ tìm kiếm element trong XML/HTML document."
> ```
> Absolute XPath: /html/body/div/button    (không nên dùng)
> Relative XPath: //button[@id='login-btn']  (nên dùng)
> XPath phức tạp: //button[contains(@class,'btn') and text()='Login']
> ```

---

### Nhóm 3: Câu hỏi thực tế / Situational

**Q11. Bạn sẽ làm gì nếu team đang dùng Selenium 3 và muốn upgrade lên Selenium 4?**

> 💡 **Gợi ý trả lời:**
> Nêu các thay đổi chính: ChromeDriver tự động quản lý (không cần download thủ công), relative locators mới, BiDi protocol, `driver.navigate().newWindow()`... Đề xuất test trên branch riêng trước khi merge.

---

**Q12. Framework automation của bạn trong project demo gồm những gì?**

> 💡 **Gợi ý trả lời mẫu:**
> "Framework của mình gồm: Maven để quản lý dependency, TestNG làm test runner, Page Object Model cho cấu trúc, Selenium WebDriver, Apache POI đọc test data từ Excel, ExtentReports để generate báo cáo HTML, và upload lên GitHub. Mình đã test trên website [tên website] với [số lượng] test cases cover các luồng đăng nhập, mua hàng, checkout."

---

## 🟢 CÂU HỎI PHỎNG VẤN PLAYWRIGHT

### Nhóm 1: Câu hỏi Khái niệm Cơ bản

**Q1. Playwright khác Selenium ở điểm gì? Tại sao bạn chọn Playwright?**

> 💡 **Gợi ý trả lời:**

| Tiêu chí | Playwright | Selenium |
|----------|------------|---------|
| Kiến trúc | CDP (Chrome DevTools Protocol) | WebDriver Protocol |
| Auto-wait | ✅ Built-in | ❌ Phải tự thêm |
| Browsers | Chromium, Firefox, WebKit | Chrome, Firefox, Edge, Safari |
| Network intercept | ✅ Native | ❌ Cần third-party |
| Multiple contexts | ✅ Dễ | Phức tạp |

> "Mình chọn Playwright vì auto-wait giảm flaky test, codegen giúp generate code nhanh, và all-in-one (UI + API testing) trong 1 tool."

---

**Q2. `page.locator()` vs `page.getByRole()` — Khi nào dùng cái nào?**

> 💡 **Gợi ý trả lời:**
> "Playwright khuyến khích dùng **semantic locators** theo thứ tự ưu tiên:
> 1. `getByRole()` — theo ARIA role, tốt nhất vì gần với user perspective
> 2. `getByLabel()` — cho form fields
> 3. `getByPlaceholder()` — cho input
> 4. `getByText()` — theo text content
> 5. `getByTestId()` — dùng data-testid attribute
> 6. `locator('css selector')` — khi không có cách nào khác
>
> Tránh dùng XPath và CSS phức tạp vì dễ break."

---

**Q3. Auto-wait trong Playwright hoạt động thế nào?**

> 💡 **Gợi ý trả lời:**
> "Khi bạn gọi `page.click()`, Playwright tự động chờ element:
> 1. **Attached** — có trong DOM
> 2. **Visible** — không bị ẩn
> 3. **Stable** — không đang animate
> 4. **Enabled** — không bị disable
> 5. **Editable** — với input fields
>
> Đây là lý do Playwright ít bị flaky test hơn Selenium. Default timeout là 30 giây, có thể config."

---

**Q4. Playwright fixture là gì? Tại sao quan trọng?**

> 💡 **Gợi ý trả lời:**
> "Fixture là cơ chế setup/teardown trong Playwright, tương tự như `@BeforeEach/@AfterEach` trong TestNG nhưng mạnh hơn. Playwright có built-in fixtures như `page`, `browser`, `context`. Mình có thể tạo custom fixture để reuse login state, setup test data, tránh lặp code. Ví dụ: tạo fixture `loggedInPage` để mọi test đều bắt đầu với trạng thái đã đăng nhập."

---

**Q5. Trace Viewer trong Playwright dùng để làm gì?**

> 💡 **Gợi ý trả lời:**
> "Trace Viewer là tool debug mạnh nhất của Playwright. Khi enable trace, nó record lại toàn bộ quá trình test: **screenshot từng step, network request/response, console log, DOM snapshot**. Khi test fail, mình có thể mở `npx playwright show-trace trace.zip` để xem lại chính xác chuyện gì xảy ra mà không cần chạy lại test."

---

### Nhóm 2: Câu hỏi Kỹ thuật Nâng cao

**Q6. Làm sao handle authentication trong Playwright? Giải thích `storageState`?**

> 💡 **Gợi ý trả lời:**
> "Thay vì login lại ở mỗi test (chậm, tốn resource), mình có thể dùng `storageState`:
> 1. Chạy 1 lần: login và save state ra file JSON (`auth.json`)
> 2. Các test sau load state đó từ file → bỏ qua bước login
>
> Config trong `playwright.config.ts`:
> ```typescript
> use: { storageState: 'auth.json' }
> ```
> Giúp test nhanh hơn đáng kể."

---

**Q7. Playwright xử lý Multiple tabs/windows thế nào?**

> 💡 **Gợi ý trả lời:**
> ```typescript
> // Cách 1: Đợi page mới mở
> const [newPage] = await Promise.all([
>   context.waitForEvent('page'),
>   page.click('a[target="_blank"]')
> ]);
> await newPage.waitForLoadState();
>
> // Cách 2: Dùng context.pages()
> const pages = context.pages(); // Array các pages đang mở
> ```

---

**Q8. Soft Assertions trong Playwright là gì?**

> 💡 **Gợi ý trả lời:**
> "Hard assertion (`expect`) khi fail sẽ dừng test ngay. Soft assertion (`expect.soft`) cho phép test tiếp tục chạy dù có assertion fail, và report tất cả lỗi ở cuối.
> ```typescript
> await expect.soft(page.locator('#name')).toBeVisible();
> await expect.soft(page.locator('#email')).toHaveText('test@gmail.com');
> // Test vẫn tiếp tục dù dòng trên fail
> ```
> Hữu ích khi muốn verify nhiều field trong 1 test mà không bị dừng giữa chừng."

---

**Q9. Giải thích `page.route()` — bạn đã dùng bao giờ chưa?**

> 💡 **Gợi ý trả lời:**
> "`page.route()` cho phép intercept và modify network request/response. Dùng để:
> - Mock API response (test offline, test error case)
> - Block request không cần thiết (ảnh, ads → test nhanh hơn)
> - Verify API được gọi đúng
>
> ```typescript
> await page.route('**/api/users', route => {
>   route.fulfill({ json: { users: mockData } });
> });
> ```
> Rất hữu ích khi API chưa sẵn sàng nhưng cần test UI."

---

**Q10. Bạn sẽ cấu hình Playwright chạy test parallel thế nào?**

> 💡 **Gợi ý trả lời:**
> ```typescript
> // playwright.config.ts
> export default defineConfig({
>   workers: process.env.CI ? 2 : 4,    // số workers
>   fullyParallel: true,                 // parallel trong file
>   projects: [
>     { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
>     { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
>     { name: 'webkit', use: { ...devices['Desktop Safari'] } },
>   ],
> });
> ```
> "Quan trọng là mỗi test phải **độc lập**, không share state để tránh conflict khi chạy parallel."

---

### Nhóm 3: Câu hỏi Thực tế / Behavioral

**Q11. Bạn xử lý flaky test (test khi pass khi fail) trong Playwright thế nào?**

> 💡 **Gợi ý trả lời:**
> 1. Dùng **Trace Viewer** để xem lại khi fail
> 2. Kiểm tra locator có đủ specific không
> 3. Tránh `waitForTimeout` (hardcoded wait) → thay bằng `waitForSelector` hoặc assertion
> 4. Dùng `test.retries(2)` trong config để retry test fail
> 5. Check xem có **race condition** không (dùng `Promise.all` khi cần)

---

**Q12. Trong project demo của bạn, bạn đã test những gì với Playwright?**

> 💡 **Gợi ý trả lời mẫu:**
> "Mình build framework test cho [website]. Cấu trúc gồm: `tests/` chứa test files, `pages/` chứa Page Objects, `fixtures/` chứa custom fixtures, `utils/` chứa helper functions.
>
> Mình cover các scenarios: authentication (login/logout), [tính năng chính của app], error handling, responsive trên mobile devices.
>
> CI/CD: GitHub Actions chạy test tự động khi push code. Report HTML được upload làm artifact.
>
> Interesting challenge: Mình gặp vấn đề [nêu 1 vấn đề thực tế] và giải quyết bằng cách [giải pháp]. Điều này giúp mình hiểu sâu hơn về [concept]."

---

# 🏁 TỔNG KẾT NHANH

## So sánh cuối cùng

| Tiêu chí | Selenium | Playwright |
|----------|:--------:|:----------:|
| Độ khó học ban đầu | ⭐⭐⭐ Trung bình | ⭐⭐⭐⭐ Hơi khó hơn |
| Số lượng job VN hiện tại | 🔵🔵🔵🔵🔵 Nhiều | 🟢🟢🟢 Ít hơn |
| Lương tiềm năng | 💰💰💰 | 💰💰💰💰 |
| Tài liệu tiếng Việt | 📚📚📚📚 Nhiều | 📚📚 Ít hơn |
| Xu hướng tương lai | ↗️ Ổn định | 🚀 Đang tăng mạnh |
| Phù hợp người mới code | ✅ Tốt hơn | ⚠️ Cần nền JS/TS |
| All-in-one (UI+API) | ❌ | ✅ |
| Community global | 🌍🌍🌍🌍🌍 | 🌍🌍🌍🌍 |

## Lời khuyên cuối

> 💬 **"Đừng bị liệt sĩ phân tích. Chọn 1 tool và HỌC ĐẾN CÙNG."**
>
> Tool tốt nhất là tool bạn **thành thạo**. Một framework Selenium được viết tốt sẽ luôn tốt hơn một đống code Playwright viết ẩu. Ngược lại, Playwright với portfolio bài bản sẽ nổi bật hơn Selenium setup qua loa.
>
> **Khi có 6–12 tháng kinh nghiệm:** Học thêm tool còn lại. Biết cả hai sẽ là lợi thế cạnh tranh rất lớn.

---

*📅 Checklist này được viết dựa trên thị trường tuyển dụng Việt Nam. Thị trường thay đổi liên tục — hãy verify lại bằng cách xem job description trên ITviec, TopDev, LinkedIn định kỳ.*

*⭐ Nếu bạn thấy checklist này hữu ích, hãy chia sẻ cho bạn bè tester khác nhé!*