Tổng hợp các lệnh nền tảng của Playwright Java, kèm ví dụ và so sánh với Selenium WebDriver.
Yêu cầu
Các bạn đã quen với Selenium thì khi chuyển sang Playwright sẽ thấy một điểm khác biệt đầu tiên: Selenium chỉ có một đối tượng WebDriver để làm mọi thứ, còn Playwright chia thành nhiều tầng, mỗi tầng đảm nhiệm một nhiệm vụ riêng.
Mình hiểu rõ cây đối tượng này trước, sau đó học các câu lệnh sẽ dễ hơn nhiều vì biết mỗi thiết lập đang nằm ở tầng nào.
Playwright
└── BrowserType (chromium / firefox / webkit)
└── Browser (1 instance trình duyệt đang chạy)
└── BrowserContext (1 session độc lập: cookie, storage...)
└── Page (1 tab)
Trong bài này mình sẽ tổng hợp các câu lệnh của 4 tầng đầu: Playwright > BrowserType > Browser > BrowserContext. Tầng Page sẽ nằm ở các bài tiếp theo nhé.
Các ví dụ viết bằng Java - ứng dụng demo là OrangeHRM.
Giải pháp
1. Playwright
Đây là đối tượng gốc, đại diện cho driver process của Playwright chạy ngầm bên dưới.
Playwright.create(): khởi tạo Playwright driver process
playwright.chromium(): trả về BrowserType cho Chromium (dùng cho Chrome/ Edge)
playwright.firefox(): trả về BrowserType cho Firefox
playwright.webkit(): trả về BrowserType cho WebKit (engine của Safari)
playwright.close(): đóng driver process
Các bạn nên dùng try-with-resources để Playwright tự động đóng khi chạy xong:
try (Playwright playwright = Playwright.create()) {
BrowserType chromium = playwright.chromium();
Browser browser = chromium.launch();
Page page = browser.newPage();
}
2. BrowserType
Đại diện cho một loại trình duyệt (chromium/ firefox/ webkit), dùng để launch instance.
launch(): khởi chạy browser mới (mặc định headless = true)
launchPersistentContext(userDataDir, options): khởi chạy với profile lưu trong thư mục (giữ session/ extension), trả về BrowserContext
connect(wsEndpoint, options): kết nối tới browser/ Playwright server đang chạy từ xa qua WebSocket (dùng cho các nền tảng cloud hỗ trợ Playwright như BrowserStack...)
connectOverCDP(endpointURL): kết nối qua Chrome DevTools Protocol (chỉ Chromium)
executablePath(): trả về đường dẫn tới binary trình duyệt mà Playwright sẽ dùng
name(): trả về tên engine: “chromium” - “firefox” - “webkit”
Ví dụ 1: chạy có giao diện và chậm lại để dễ debug
Browser browser = playwright.chromium().launch(
new BrowserType.LaunchOptions()
.setHeadless(false) // tương đương ChromeOptions không add "--headless"
.setSlowMo(50) // delay 50ms giữa mỗi action - hữu ích khi debug
.setArgs(List.of("--start-maximized"))
);
Lưu ý: --start-maximized chỉ có tác dụng khi context được tạo với viewport = null: browser.newContext(new Browser.NewContextOptions().setViewportSize(null)). Nếu không thì Playwright vẫn dùng viewport mặc định.
Ví dụ 2: dùng lại profile để giữ session đăng nhập giữa các lần chạy
BrowserContext context = playwright.chromium().launchPersistentContext(
Paths.get("/tmp/orangehrm-profile"),
new BrowserType.LaunchPersistentContextOptions().setHeadless(false)
);
Page page = context.newPage();
Ví dụ 3: kết nối tới browser ở xa
Browser browser = playwright.chromium()
.connect("wss://your-grid-endpoint.com/ws?token=xxx");
3. Browser
Đại diện cho một instance trình duyệt đã khởi chạy. Từ một Browser, chúng ta có thể tạo nhiều BrowserContext độc lập.
newContext() / newContext(options): tạo context mới (như 1 cửa sổ ẩn danh riêng biệt, cookie/ storage độc lập)
newPage(): tạo context + page trong 1 bước (dùng khi không cần custom context)
contexts(): trả về List<BrowserContext> đang mở
isConnected(): kiểm tra browser còn kết nối hay không
version(): trả về version string của browser engine
newBrowserCDPSession(): tạo phiên CDP mới (chỉ Chromium) để gọi API DevTools trực tiếp
startTracing(page, options) / stopTracing(): bắt đầu/ kết thúc ghi trace ở mức browser (chỉ Chromium)
close(): đóng toàn bộ browser process và mọi context/ page bên trong
Ví dụ: 2 user đăng nhập song song trong cùng 1 browser
Browser browser = playwright.chromium().launch();
BrowserContext adminContext = browser.newContext();
BrowserContext essContext = browser.newContext();
Page adminPage = adminContext.newPage();
Page essPage = essContext.newPage();
// 2 page này không dùng chung cookie/ session với nhau
Cách này rất hữu ích khi test các case nhiều role (Admin - ESS) mà không cần mở 2 trình duyệt.
4. BrowserContext
Tương đương một session độc lập, quản lý cookie/ storage/ permission/ network ở cấp toàn context (áp dụng cho mọi page tạo ra từ nó). Mình chia thành 4 nhóm:
4.1. Quản lý Page/ vòng đời
newPage(): mở tab/ page mới trong context này
pages(): trả về List<Page> đang mở trong context
browser(): trả về Browser cha của context này
close(): đóng context và toàn bộ page bên trong
4.2. Cookie - Storage
Tương tự driver.manage().getCookies() của Selenium.
cookies() / cookies(urls): lấy danh sách cookie hiện tại
addCookies(List<Cookie>): inject cookie vào context
clearCookies(): xóa toàn bộ cookie
storageState() / storageState(options): xuất toàn bộ state (cookie + localStorage) ra JSON, dùng để lưu session và tái sử dụng giữa các lần chạy test
Ví dụ: đăng nhập 1 lần, lưu lại, các test sau dùng lại
// Sau khi đăng nhập thành công
context.storageState(
new BrowserContext.StorageStateOptions().setPath(Paths.get("auth/admin.json"))
);
// Ở các test sau: nạp lại session, bỏ qua bước login
BrowserContext loggedIn = browser.newContext(
new Browser.NewContextOptions().setStorageStatePath(Paths.get("auth/admin.json"))
);
4.3. Network Interception
route(url, handler): chặn/ giả lập request
unroute(url): gỡ bỏ route đã đăng ký
setExtraHTTPHeaders(headers): set header mặc định cho mọi request
setOffline(true/false): giả lập mất mạng
setGeolocation(geolocation): giả lập vị trí địa lý
onRequest(handler) / onResponse(handler): log/ theo dõi mọi network traffic trong context
// Chặn toàn bộ hình ảnh để trang load nhanh hơn
context.route("**/*.{png,jpg,jpeg}", route -> route.abort());
// Log mọi request
context.onRequest(request ->
System.out.println(">> " + request.method() + " " + request.url()));
// Giả lập mất mạng rồi bật lại
context.setOffline(true);
// ... kiểm tra thông báo lỗi của ứng dụng
context.setOffline(false);
4.4. Timeout - Permission
setDefaultTimeout(ms): set timeout mặc định cho mọi action trong context (gần giống implicit wait của Selenium ở chỗ set 1 lần dùng cho toàn bộ, nhưng bản chất khác vì Playwright đã có cơ chế auto-wait cho từng action)
setDefaultNavigationTimeout(ms): timeout riêng cho navigate()
grantPermissions(List<String>): cấp quyền browser (camera/ geolocation/ notifications/..)
clearPermissions(): xóa toàn bộ quyền đã cấp
context.setDefaultTimeout(10_000); // 10 giây cho mỗi action
context.setDefaultNavigationTimeout(30_000); // 30 giây cho navigate
context.grantPermissions(List.of("geolocation"));
context.setGeolocation(new Geolocation(16.0544, 108.2022)); // Đà Nẵng
Source demo
Mình gộp các lệnh ở trên thành 1 ví dụ hoàn chỉnh với OrangeHRM, các bạn chạy thử và tùy biến theo nhu cầu nhé:
import com.microsoft.playwright.*;
import java.nio.file.Paths;
public class Topic01Demo {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.chromium().launch(
new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(50));
BrowserContext context = browser.newContext();
context.setDefaultTimeout(10_000);
context.onRequest(r -> System.out.println(">> " + r.method() + " " + r.url()));
Page page = context.newPage();
page.navigate("https://opensource-demo.orangehrmlive.com/");
System.out.println("Title: " + page.title());
context.storageState(
new BrowserContext.StorageStateOptions().setPath(Paths.get("state.json")));
browser.close();
}
}
}
Tóm tắt
Playwright: khởi tạo driver, trả về BrowserType
BrowserType: chọn engine và cách khởi chạy (launch, launchPersistentContext, connect, connectOverCDP)
Browser: 1 trình duyệt đang chạy, tạo được nhiều context độc lập
BrowserContext: 1 session quản lý cookie, storage, network, timeout và permission cho mọi page bên trong
Reference
Các bài viết khác về Testing/ Automation Testing các bạn xem thêm tại blog.automationfc.vn và automationfc.vn nhé.

