Cài đặt Playwright trên VPS & chạy Selenium tự động hóa kiểm thử web

Tác giả: Trần Thảo 30 tháng 05, 2026

Chắc hẳn bất kỳ anh em developer hay kỹ sư QA/QC nào làm Automation Test cũng từng trải qua cảm giác này: Script viết xong chạy mượt mà trên môi trường localhost, các luồng end-to-end (E2E) test pass xanh rờn. Nhưng ngay khi push code lên server staging hoặc production thì gặp lỗi đỏ chót. Nào là crash trình duyệt, nào là error while loading shared libraries, hay kinh hoàng nhất là con máy cá nhân bị treo cứng ngắc, RAM nhảy lên 100% khi phải bung cùng lúc 10 tab Chromium để test tải.

Rõ ràng, việc bắt chiếc laptop cá nhân phải gánh vác hàng chục instance trình duyệt không phải là cách làm tối ưu. Giải pháp triệt để nhất chính là đưa toàn bộ kịch bản kiểm thử này lên máy chủ ảo. Trong bài viết này, chúng ta sẽ mổ xẻ tường tận cách cài đặt Playwright trên VPS cũng như cập nhật những kỹ thuật cấu hình Selenium mới nhất (không cần cài driver thủ công) trên môi trường Linux.

Nhưng làm sao để vượt qua các rào cản kỹ thuật phức tạp như lỗi tràn RAM (OOM) hay server không có giao diện đồ họa (GUI)? Hãy cùng đi sâu vào những kinh nghiệm thực chiến ngay dưới đây.

Tại sao nên chuyển nhà web testing automation lên VPS?

Bạn không thể build một hệ thống phần mềm lớn dựa trên tài nguyên của một chiếc laptop. Việc đưa môi trường kiểm thử tự động lên VPS mang lại những lợi ích mang tính cách mạng cho workflow của team:

  • Giải phóng tài nguyên máy local (chấm dứt tình trạng ngốn RAM): Mỗi một instance của trình duyệt Chromium khi khởi chạy ngốn không dưới vài trăm MB RAM. Nếu bạn chạy song song (parallel) 4-5 luồng test, CPU và RAM của máy cá nhân sẽ nhanh chóng cạn kiệt, gây treo máy và làm sai lệch kết quả test (flaky tests do máy phản hồi chậm). VPS sinh ra để gánh vác những tác vụ nặng nề này 24/7.
  • Môi trường IP tĩnh & whitelist dễ dàng: Rất nhiều môi trường staging của doanh nghiệp được bảo mật cực kỳ nghiêm ngặt, API chỉ cho phép truy cập từ một số IP nhất định. Chạy kịch bản test trên VPS cung cấp cho bạn một IP tĩnh, giúp việc thiết lập và cấu hình tường lửa VPS trở nên đơn giản, không lo bị hệ thống chặn nhầm.
  • Nền tảng bắt buộc để tích hợp CI/CD: Bạn không thể chạy GitHub Actions, GitLab CI hay Jenkins một cách toàn diện nếu không có môi trường server. VPS chính là mảnh ghép để thiết lập pipeline tự động hóa CI/CD: Cứ mỗi khi developer push code, server sẽ tự động trigger kịch bản test, verify luồng, và báo cáo kết quả qua Slack trước khi cho phép deploy.
Sơ đồ luồng hoạt động CI/CD chạy kịch bản tự động hóa kiểm thử web bằng Playwright và Selenium trên VPS Linux.

Luồng hoạt động CI/CD lý tưởng: Tự động kích hoạt kịch bản test trên VPS và báo cáo kết quả mỗi khi Developer đẩy code mới.

Playwright vs Selenium: Đâu là giải pháp tối ưu cho máy chủ Linux?

Trước khi bắt tay vào gõ lệnh, hãy nhìn nhận thực tế về hai framework đình đám nhất hiện nay dưới lăng kính của máy chủ Linux (môi trường mặc định không có GUI). Cả hai đều đã có những bản cập nhật cực kỳ mạnh mẽ trong những năm gần đây.

Tiêu chí Playwright (cập nhật 2026) Selenium (cập nhật Selenium 4)
Kiến trúc giao tiếp Giao tiếp trực tiếp với trình duyệt qua CDP (Chrome DevTools Protocol). Cực nhanh, độ trễ cực thấp. Dùng giao thức WebDriver (W3C Standard) làm trung gian. Ổn định nhưng tốc độ phản hồi chậm hơn đôi chút.
Sức mạnh headless trên Linux Tối ưu với Headless Shell. Từ bản 1.58+, Playwright sử dụng Chromium Headless Shell, một file nhị phân siêu nhẹ bị lược bỏ hoàn toàn X11/Wayland/D-Bus. Điều này giúp tốc độ thực thi trên VPS tăng đột biến. Cải tiến lớn. Không cần cấu hình Xvfb cồng kềnh như xưa nếu dùng chuẩn --headless=new hoặc --headless trên Chrome đời mới.
Quản lý driver & trình duyệt Chỉ cần 1 lệnh duy nhất: npx playwright install-deps tự động tải trình duyệt và cài mọi thư viện Linux còn thiếu. Selenium Manager đã tự động hóa. Từ bản 4.6+, Selenium tự động phát hiện Chrome trên máy và tải ChromeDriver tương ứng xuống ~/.cache/selenium. Không cần tải tay hay dùng thư viện bên thứ 3 nữa.
Độ ổn định (Auto-wait) Tích hợp sẵn cơ chế Auto-wait thông minh (chờ DOM render, network idle mới thao tác). Chống flaky test tuyệt vời. Yêu cầu kỹ năng tốt. Phải tự implement các hàm WebDriverWait (Explicit Wait), nếu thiếu code sẽ rất dễ phát sinh lỗi.

Nhận định thực chiến: Nếu team bạn đang bắt đầu một project mới hoàn toàn, đặc biệt là các ứng dụng web hiện đại (React, Vue, Angular), Playwright là sự lựa chọn số 1. Tuy nhiên, nếu bạn đang maintain một hệ thống legacy có sẵn hàng ngàn test case bằng Java/Python, việc nâng cấp lên Selenium 4 và chạy trên VPS vẫn là một phương án cực kỳ an toàn và mạnh mẽ.

So sánh kiến trúc hoạt động của Playwright qua CDP và Selenium qua WebDriver trên môi trường Linux.

Kiến trúc giao tiếp trực tiếp (CDP) giúp Playwright đạt tốc độ thực thi vượt trội trên môi trường không giao diện so với kiến trúc WebDriver truyền thống.

Hướng dẫn chi tiết cách cài đặt Playwright trên VPS Linux

Để việc cài đặt Playwright trên VPS (cụ thể là Ubuntu 20.04/22.04 LTS hoặc 24.04) diễn ra mượt mà, hạn chế tối đa các lỗi vặt về thư viện hệ thống, bạn cần làm theo đúng trình tự sau. Nếu bạn chưa quen thao tác terminal, bạn có thể tham khảo bài viết tổng hợp 20+ lệnh Linux cơ bản nhất cho người mới dùng VPS trước khi bắt đầu.

Chuẩn bị môi trường Node.js (yêu cầu v20.x, v22.x hoặc v24.x)

Playwright là thành phần mật thiết của hệ sinh thái Node.js. Theo tài liệu chính thức mới nhất, Playwright yêu cầu máy chủ phải cài đặt Node.js phiên bản 20.x, 22.x, hoặc 24.x. Chúng ta sẽ dùng nvm để quản lý version một cách chuẩn xác.

Cài đặt NVM (Node Version Manager):

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

Cài đặt Node.js v22 (LTS hiện hành) và kiểm tra phiên bản:

nvm install 22
nvm use 22
node -v

Khởi tạo project và cấu hình ban đầu

Tạo một thư mục riêng biệt cho dự án test và gọi trình khởi tạo của Playwright.

Tạo và di chuyển vào thư mục dự án:

mkdir automation-playwright
cd automation-playwright

Khởi tạo Playwright:

npm init playwright@latest

Trong quá trình chạy lệnh, hệ thống sẽ đưa ra vài câu hỏi:

  • Do you want to use TypeScript or JavaScript? Chọn TypeScript (Best practice hiện nay).
  • Where to put your end-to-end tests? Để mặc định tests.
  • Add a GitHub Actions workflow? Tùy nhu cầu, nếu bạn dùng CI/CD thì chọn Yes.
  • Install Playwright browsers? Bắt buộc chọn Yes.

Xử lý system dependencies (install-deps)

Đây là bước giá trị nhất. Khác với máy tính cá nhân đã có sẵn môi trường đồ họa, VPS Linux mặc định thiếu vắng rất nhiều thư viện chia sẻ (shared libraries). Khởi chạy trình duyệt lúc này sẽ lập tức báo lỗi libnss3.so: cannot open shared object file.

Thay vì tìm kiếm và tải từng gói lệnh apt, bạn chỉ cần thực thi lệnh sau để tự động rà soát và cài đặt toàn bộ thư viện hệ thống cần thiết:

npx playwright install-deps

Điểm nhấn công nghệ: Như đã đề cập, từ Playwright 1.58+, khi bạn chạy kịch bản trên VPS ở chế độ mặc định (headless), hệ thống sẽ không gọi bản Chromium nguyên gốc nặng nề nữa. Nó gọi Chromium Headless Shell, một trình duyệt sinh ra chỉ để hoạt động ngầm, lược bỏ sạch sẽ các dependencies đồ họa (như X11, Wayland). Nhờ vậy, kịch bản test trên VPS chạy tốc độ cao và tiết kiệm RAM đáng kể.

Thiết lập & chạy kịch bản Selenium trên VPS an toàn

Nếu công nghệ của công ty bạn dựa trên Python và Selenium, đây là cách thiết lập theo chuẩn mới nhất của năm nay (loại bỏ hoàn toàn sự rườm rà của các phiên bản cũ).

Cài đặt Google Chrome & Selenium 4

Trên VPS, bạn vẫn cần cài đặt trình duyệt Chrome thực tế. Tuy nhiên, sự khác biệt lớn nhất là bạn KHÔNG CẦN tải file chromedriver thủ công hay cài thư viện webdriver-manager nữa.

Thêm khóa và repository của Google Chrome:

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list

Cập nhật hệ thống và cài đặt bản Stable mới nhất:

sudo apt update
sudo apt install -y google-chrome-stable

Tạo môi trường ảo Python và chỉ cài Selenium cùng Pytest:

python3 -m venv test-env
source test-env/bin/activate
pip install selenium pytest

Cấu hình code Selenium (tối ưu bằng Selenium Manager)

Kể từ Selenium 4.6+, công cụ Selenium Manager đã được tích hợp sẵn vào hệ thống. Khi đoạn code được thực thi, Selenium Manager sẽ tự động check phiên bản Chrome hiện tại trên VPS, âm thầm tải ChromeDriver tương ứng và kết nối chúng lại với nhau.

Code của bạn giờ đây cực kỳ thanh thoát nhưng vẫn phải tuân thủ nghiêm ngặt các tham số (flags) quan trọng trên Linux:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
# Bắt buộc để chạy trên VPS không có GUI
options.add_argument("--headless") 

# Bắt buộc khi chạy dưới quyền root hoặc trong Docker container
options.add_argument("--no-sandbox") 

# Ngăn chặn lỗi crash do tràn bộ nhớ chia sẻ (/dev/shm)
options.add_argument("--disable-dev-shm-usage") 
options.add_argument("--disable-gpu")

# Selenium 4 tự động quản lý việc kết nối Driver
driver = webdriver.Chrome(options=options) 

driver.get("https://example-staging.com")
print("Verify Title:", driver.title)
driver.quit()
Cơ chế hoạt động của Selenium Manager tự động tải ChromeDriver tương ứng trên VPS Linux từ bản Selenium 4.6.

Kể từ phiên bản 4.6, Selenium Manager đã giúp các kỹ sư QA tự động hóa việc quản lý phiên bản ChromeDriver.

Troubleshooting: Xử lý dứt điểm các lỗi phát sinh trên server

Mọi lý thuyết đều hoàn hảo cho đến khi bạn đưa luồng test lên chạy thực tế với số lượng lớn. Dưới đây là cách các kỹ sư xử lý sự cố.

Quản lý RAM và xử lý lỗi crash trình duyệt (OOMKilled)

Nếu VPS của bạn có 2GB RAM nhưng bạn cấu hình chạy 4 worker song song, hệ điều hành Linux sẽ lập tức dừng tiến trình của bạn với lỗi Out Of Memory (OOMKilled), hoặc dẫn đến tình trạng VPS 100% CPU.

  • Sử dụng Playwright Contexts: Không nên tạo nhiều browser mới (mỗi instance tốn ~200MB RAM). Hãy tạo 1 browser duy nhất, sau đó dùng browser.new_context(). Context chia sẻ chung nhân Chromium nhưng cô lập hoàn toàn Cookie/Session, giúp tối ưu RAM tối đa.
  • Tạo swap file (giải pháp RAM ảo): Dùng ổ cứng làm bộ nhớ đệm để gánh tải.Tạo file swap 4GB:
    sudo fallocate -l 4G /swapfile

    Phân quyền bảo mật:

    sudo chmod 600 /swapfile

    Thiết lập swap:

    sudo mkswap /swapfile

    Kích hoạt:

    sudo swapon /swapfile
  • Giới hạn Worker trong CI/CD: Trong playwright.config.ts, luôn set workers: process.env.CI ? 1 : undefined để đảm bảo an toàn tuyệt đối về bộ nhớ.
Cách tối ưu RAM trên VPS bằng việc sử dụng Browser Context thay cho Browser Instance để tránh lỗi OOMKilled.

Tái sử dụng Browser Context (tách biệt Session) là giải pháp cốt lõi giúp VPS dung lượng RAM khiêm tốn vẫn xử lý được nhiều luồng test song song.

Xử lý tiến trình bị treo trong Docker

Nếu deploy hệ thống test bằng Docker, bạn có thể đối mặt với những tiến trình Chrome chạy xong bị treo cứng, không chịu thoát và làm cạn kiệt CPU. Nếu bạn chưa biết cách thao tác, có thể tham khảo bài viết hướng dẫn cài đặt Docker trên VPS Ubuntu của chúng tôi.

Giải pháp chuẩn chỉ:

  1. Luôn sử dụng cờ --init khi chạy container (hoặc dùng dumb-init trong Dockerfile). Nó sẽ đóng vai trò như một bộ quản lý tiến trình, tự động dọn dẹp các process PID=1 bị kẹt.
  2. Dù dùng Selenium hay Playwright, luôn đảm bảo kịch bản test của bạn có khối lệnh try...finally để gọi lệnh browser.close() hoặc driver.quit(), kể cả khi test gặp lỗi.

Xử lý yêu cầu hiển thị đồ họa bằng màn hình ảo Xvfb

Một số hệ thống kiểm thử đặc thù có thể yêu cầu môi trường chạy không được để chế độ headless. Tuy nhiên, VPS mặc định không có màn hình hiển thị đồ họa.
Giải pháp là sử dụng Xvfb (X Virtual Framebuffer) để mô phỏng một màn hình ảo lưu trong RAM, sau đó set headless: false.

Cài đặt Xvfb:

sudo apt install xvfb -y

Giả lập hiển thị để khởi chạy Playwright:

xvfb-run -a npx playwright test

Giả lập hiển thị để khởi chạy Python script:

xvfb-run -a python test_script.py

Tuân thủ quy định hệ thống khi tự động hóa kiểm thử

Với tư cách là những kỹ sư hệ thống, chúng ta cần đảm bảo việc áp dụng tự động hóa kiểm thử (Testing) hoạt động đúng mục đích và không gây ảnh hưởng tiêu cực đến hiệu suất của hạ tầng mạng.

  • Mục đích cốt lõi: Kịch bản Auto Test được thiết kế để rà soát luồng nghiệp vụ của ứng dụng nội bộ, hoặc website thuộc quyền sở hữu của doanh nghiệp. Việc tự động hóa phải luôn đi kèm với các tiêu chuẩn an toàn dữ liệu và tuân thủ chặt chẽ các chính sách bảo mật.
  • Hoạt động trên môi trường tiêu chuẩn: Bot kiểm thử nội bộ nên hoạt động trong môi trường Sandbox/Staging. Nếu phải chạy E2E trên Production, quá trình test phải tuân thủ tuyệt đối tệp robots.txt, không gây quá tải hoặc can thiệp vào các hệ thống phòng thủ của máy chủ.
  • Giới hạn lưu lượng (Rate Limit): Một script test chuyên nghiệp luôn được cấu hình giới hạn tốc độ request hợp lý. Việc tạo ra quá nhiều request cùng lúc có thể gây nghẽn mạng, làm ảnh hưởng đến trải nghiệm của người dùng thực và khiến máy chủ từ chối phục vụ (tương tự như tấn công DoS).

Tích hợp vào quy trình CI/CD & Cron Job

Khi mọi thứ trên VPS đã hoạt động ổn định, bước cuối cùng là tự động hóa lịch trình thực thi.

Sử dụng GitHub Actions (kết nối trực tiếp VPS):

Bạn có thể cài đặt GitHub Runner ngay trên VPS để mỗi khi có Push Request, VPS sẽ tự động pull code về và chạy kiểm thử.

# Trích đoạn .github/workflows/e2e.yml
name: Playwright E2E
on: [push, pull_request]
jobs:
  test:
    runs-on: self-hosted # Chạy thẳng trên VPS của bạn
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npx playwright test

Đặt lịch Cron Job tự động:

Nếu bạn cần một kịch bản kiểm tra sức khỏe hệ thống chạy giám sát mỗi đêm, crontab của Linux là công cụ phù hợp nhất.

Mở trình cấu hình crontab:

crontab -e

Lên lịch chạy kịch bản kiểm tra chức năng lúc 2h sáng mỗi ngày:

0 2 * * * cd /var/www/automation-playwright && npx playwright test >> /var/log/daily-test.log 2>&1

Câu hỏi thường gặp (FAQ)

1. Tại sao trình duyệt liên tục bị Crash (OOMKilled) khi chạy trên VPS hoặc Docker?

Do giới hạn vùng nhớ chia sẻ /dev/shm mặc định trên Linux/Docker thường chỉ có 64MB, khiến trình duyệt tràn RAM khi xử lý đồ họa web. Cách xử lý: Cần thêm cờ --disable-dev-shm-usage để yêu cầu trình duyệt ghi tạm vào thư mục /tmp.

2. Lỗi error while loading shared libraries: libnss3.so khi khởi chạy Playwright là gì?

VPS Linux mặc định là môi trường tối giản, không cài sẵn các thư viện hỗ trợ đồ họa như máy tính cá nhân. Cách xử lý: Mở terminal và thực thi lệnh dưới đây với quyền root:

npx playwright install-deps

3. Làm sao để khởi chạy kịch bản kiểm thử trên VPS khi hệ thống yêu cầu môi trường hiển thị đầy đủ?

Bạn cần cấu hình headless: false và cài đặt tiện ích Xvfb (X Virtual Framebuffer). Xvfb sẽ tạo ra một màn hình giả lập ngay trong bộ nhớ RAM để đáp ứng yêu cầu render UI của trình duyệt.

4. Code Selenium bằng Python báo lỗi DevToolsActivePort file doesn’t exist, xử lý thế nào?

Vấn đề này thường do Chrome bị hệ điều hành giới hạn quyền thực thi dưới tài khoản root. Cách xử lý: Chèn thêm tham số --no-sandbox vào ChromeOptions để hệ thống cấp quyền hoạt động.

5. Nên sử dụng VPS cấu hình bao nhiêu RAM là đủ để duy trì Auto Test?

Không nên dùng gói 1GB RAM. Mức tối thiểu là 2GB, và mức lý tưởng là 4GB RAM. Mẹo tối ưu: Hãy sử dụng Browser Contexts thay vì mở liên tục Browser Instances mới để tiết kiệm tới 60% RAM cho máy chủ.

6. Tại sao cần tuân thủ cấu hình giới hạn lưu lượng (Rate Limit) khi chạy Auto Test?

Việc không kiểm soát tốc độ request có thể biến quá trình kiểm thử thành một nguyên nhân gây nghẽn cổ chai mạng hoặc làm gián đoạn dịch vụ của hệ thống. Bạn cần cấu hình thời gian chờ giữa các bước xử lý và tuân thủ giới hạn kết nối đồng thời để duy trì tính ổn định chung.

Kết luận

Đưa tự động hóa kiểm thử web lên môi trường máy chủ ảo là một bước tiến quan trọng để tối ưu hóa luồng CI/CD của mọi team phát triển phần mềm. Cho dù bạn chọn cài đặt Playwright trên VPS để tận dụng sức mạnh xử lý của Chromium Headless Shell, hay ứng dụng kiến trúc ổn định của Selenium 4 (đã được tự động hóa tốt hơn nhờ Selenium Manager), các nguyên tắc quản trị hệ thống vẫn không thay đổi.

Kinh nghiệm thực chiến: Hãy luôn nắm vững cách quản trị RAM (Worker, Contexts, Swap), cấu hình chính xác các cờ --no-sandbox & --disable-dev-shm-usage, và thiết lập script tự động một cách có trách nhiệm để không gây ra tình trạng quá tải cho hạ tầng mạng.

Đừng để phần cứng cản bước phần mềm! Các trình duyệt là những tiến trình yêu cầu khá nhiều tài nguyên. Để hệ thống Automation Test vận hành mượt mà, hạn chế tình trạng flaky test do độ trễ xử lý, bạn nên trang bị một hạ tầng VPS Linux có dung lượng RAM từ 2GB đến 4GB trở lên (khuyến nghị dùng Ubuntu 22.04 hoặc 24.04).

Tài liệu tham khảo