Selenium WebDriver hoạt động như thế nào?

Saturday, January 04, 2025
Edit this post


Hiểu rõ kiến trúc của Selenium WebDriver sẽ giúp chúng ta có một cái nhìn tổng quan hơn về cách mà framework này hoạt động. Đây cũng là một trong những câu hỏi phỏng vấn automation engineer mà tôi đã từng gặp, tiếc là lúc đó tôi lại chưa nắm được kiến thức này. Hình vẽ bên trên cho thấy WebDriver hoạt động theo mô hình Client - Server, thông qua một thành phần trung gian là JSON Wire Protocol, trong đó REST APIs đóng một vai trò rất quan trọng. Diễn giải chi tiết mời các bạn đọc bên dưới.

Chức năng của Selenium Client Library (SCL)

SCL nằm ở phía client, hỗ trợ các ngôn ngữ lập trình khác nhau như Java, Python, .NET, Ruby, Javascript v.v... Ví dụ để sử dụng được SCL cho Java, bạn có thể download các thư viện dưới dạng file jar tương ứng ở đây: https://www.selenium.dev/downloads/, sau đó nhúng các file này vào project của mình, hoặc đơn giản hơn là sử dụng Maven https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/4.27.0 để tải và quản lý các thư viện này một cách tự động. Những câu lệnh mà bạn thường dùng để tương tác với các element, chẳng hạn như: driver.get("https://www.giaphi.com"), driver.findElement(), .click() v.v... chính là từ các thư viện này mà ra.

Vai trò của JSON Wire Protocol (JWP)

JWP đóng vai trò trung gian giữa SCL (client) và driver + browser (server). Nó có nhiệm vụ gửi đi các request từ phía SCL tới browser driver HTTP server thông qua các REST APIs. Request từ client sẽ được serialize (chuyển từ object data thành dạng JSON), sau đó mới được gửi tới server và ngược lại, khi server trả về response gì đó dưới dạng JSON, JWP sẽ deserialize kết quả này trước khi giao lại cho client.

Ví dụ, khi bạn viết câu lệnh driver.get("https://www.giaphi.com/") để navigate tới trang "https://www.giaphi.com/" chẳng hạn.
    1) Câu lệnh này sẽ được gửi tới JWP để serialize data thành JSON payload, cụ thể là URL của trang web cần navigate tới.
    2) JWP sau đó chuyển tiếp câu lệnh tới ChromeDriver thông qua một REST API có URL là https://localhost:{{DEBUGGING_PORT}}/session/:sessionId/url với method là POST. Cách để lấy được thông tin DEBUGGING_PORT và sessionId tôi sẽ trình bày ở phần sau của bài viết. cURL của câu lệnh sẽ trông giống như bên dưới.

curl --location 'http://localhost:18633/session/c826aa2828884e046f5de30cf624694a/url' \
--header 'Content-Type: application/json' \
--data '{
    "url": "https://www.giaphi.com"
}'
    3) Cuối cùng, request sẽ được Chrome driver gửi tới trình duyệt Chrome và thực thi việc chuyển hướng tới đường dẫn mới. Đồng thời kết quả của việc chuyển hướng cũng sẽ được trả về theo chiều ngược lại: từ trình duyệt về driver, từ driver về JWP, và từ JWP về phía client.

👉Thông tin về API trên được tôi lấy ở đây: https://www.selenium.dev/documentation/legacy/json_wire_protocol/#sessionsessionidurl.
👉Mọi câu lệnh trong Selenium đều có một REST API tương ứng, bạn có thể tra cứu chi tiết cách sử dụng từng API thông qua đường link sau: https://www.selenium.dev/documentation/legacy/json_wire_protocol/

WebDriver là gì?

Trong Selenium, WebDriver là tên gọi của một public interface. Bất kỳ object nào được gán cho driver này, phải là instance của một class, mà class đó có implement interface này. Ví dụ:

WebDriver driver = new ChromeDriver();

Ở ví dụ trên thì "driver" chính là object (instance), ChromeDriver là một class có implements WebDriver. Chính xác hơn, ChromeDriver kế thừa ChromiumDriver, ChromiumDriver lại kế thừa RemoteWebDriver, và RemoteWebDriver implements WebDriver. Các bạn có thể xem thêm ở đây: https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html

Vì trong ví dụ này, chúng ta làm việc với trình duyệt Chrome, nên chúng ta sử dụng Chrome driver. Ngoài ra chúng ta còn có FirefoxDriver, InternetExplorerDriver, SafariDriver để làm việc với các trình duyệt tương ứng như Firefox, InternetExplorer, Safari.

Kiểm nghiệm bằng thực chứng

Đến đây, chúng ta đã hiểu được cách một câu lệnh Selenium chạy như thế nào. Tuy nhiên, làm sao để chứng minh tất cả những gì tôi trình bày là đúng? Tôi đã tạo video dưới đây để các bạn có thể hình dung một cách rõ ràng hơn. Về cơ bản, cách thức mà tôi làm như sau:
- Ở bước khởi chạy trình duyệt, tôi sẽ thêm vào các tham số để in toàn bộ log của các request/response vào file chromedriver.log
- Chạy một test case bất kỳ ở chế độ debug, chúng ta sẽ lấy được thông tin Debugging Port, sau đó gọi tới API /sessions để lấy được sessionId.
- Có được 2 thông tin này, chúng ta sẽ gọi tới API /session/:sessionId/url  để navigate tới một trang web bất kỳ.


Hy vọng bài viết này đã mang tới cho các bạn những thông tin hữu ích về cách thức mà Selenium hoạt động. Nếu có thắc mắc hoặc ý kiến đóng góp, vui lòng để lại comment bên dưới. Chúc các bạn một ngày vui vẻ.

.
Xin vui lòng chờ đợi
Dữ liệu bài viết đang được tải về

💻Nhận hướng dẫn online 1 kèm 1 Automation Test từ cơ bản tới nâng cao (From Zero to Hero) 😁😁😁
Lộ trình gồm 3 phần:
1) Kỹ thuật lập trình và tư duy lập trình cơ bản
2) Nhập môn kiểm thử (Manual Test)
3) Kiểm thử tự động (Automation Test) + Chuẩn bị cho phỏng vấn
* Lộ trình tham khảo khoảng 30 buổi: Xem tại đây (thời gian học thực tế có thể ngắn hơn hoặc dài hơn tùy vào mỗi cá nhân người học)

🎓Đối tượng người học:
- Những bạn bị mất gốc căn bản môn lập trình.
- Những bạn muốn theo con đường kiểm thử (testing), đặc biệt là kiểm thử tự động (Automation Test).

🦘Người hướng dẫn:
- Mình sẽ là người trực tiếp hướng dẫn.
- Nếu là các vấn đề ngoài chuyên môn hoặc sở trường, mình sẽ nhờ các anh chị em khác cũng làm trong ngành.

🤓Giới thiệu:
- Mình đã có hơn 10 năm kinh nghiệm làm IT ở cả trong và ngoài nước. Trong đó 3 năm đầu là làm lập trình viên Java, sau đó bén duyên với mảng Automation Test và theo nghề tới tận bây giờ. Mình được đào tạo chính quy về IT từ một trường Đại học danh tiếng ở TP.HCM (hệ kỹ sư 4 năm rưỡi), có chứng chỉ ISTQB, có thể giao tiếp tốt bằng tiếng Anh và có kinh nghiệm làm việc thực tế ở cả 2 mảng Outsource và Product. Title chính thức của mình là QA Automation Engineer, tuy nhiên, mình vẫn làm những dự án cá nhân chuyên về lập trình ứng dụng như Học Tiếng Anh StreamlineSách Nhạc. Mình là người có thái độ làm việc chuyên nghiệp, chăm chỉ và luôn nhiệt tình trong công việc.

💵Chi phí và hình thức thanh toán:
- Các bạn vui lòng liên hệ qua email songtoigianvn@gmail.com để book nội dung và khung giờ học.
- Mức phí: 150.000đ/buổi, mỗi buổi 60 phút. Có thể thanh toán mỗi lần cho 5 buổi.
- Thanh toán qua Momo, chuyển khoản v.v...
BÌNH LUẬN
© Copyright by CUỘC SỐNG TỐI GIẢN
Loading...