Codegen

Duy Văn | 06/02/2025


Playwright có một công cụ rất hữu ích giúp chúng ta tạo ra code tự động từ các thao tác trên trình duyệt, giúp chúng ta tiết kiệm thời gian viết code và giảm thiểu lỗi, nó là Codegen. Về cơ bản công cụ này sẽ mở ra một trình duyệt mới, chúng ta thực hiện các thao tác trên trình duyệt, sau đó công cụ sẽ tạo ra code Python dựa trên các thao tác mà chúng ta đã thực hiện.

Để sử dụng công cụ này, chúng ta cần cài đặt Playwright Python và sau đó chạy lệnh sau:

playwright codegen https://playwright.dev/

Thật ra chúng ta cũng chẳng cần đưa url vào, vì sau khi chạy lệnh trên, công cụ sẽ mở ra một trình duyệt mới, việc điền url vào thanh địa chỉ rồi ấn enter sẽ được gói gọn trong dòng

page.goto('https://playwright.dev/')

Giao diện Codegen rất dễ làm việc, mình sẽ không nói qua quá nhiều ở đây

Practice

Vấn đề ở chỗ, việc gen code ra dùng tool này chỉ mang tính chất mì ăn liền, theo practice chuẩn của dân test, chúng ta cần viết lại đoạn code theo POM

  • Lấy ra các element cần tương tác, đẩy vào thành attribute của Class tương ứng với pagge
  • Viết các method tương ứng với các thao tác trên element đó
  • Viết các test case sử dụng các method trên

Ví dụ, sau khi gen code, chúng ta sẽ có một đoạn code như sau:

from playwright.sync_api import sync_playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://playwright.dev/")
    page.click("text=Get Started")
    browser.close()

Chúng ta sẽ viết lại thành:

from playwright.sync_api import Page

class PlaywrightPage(Page):
    def __init__(self, page):
        self.page = page

    def click_get_started(self):
        self.page.click("text=Get Started")

    def run(self):
        self.click_get_started()
        self.click_installation()

Ví dụ thế, rồi để chạy

from playwright.sync_api import sync_playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://playwright.dev/")
    PlaywrightPage(page).run()
    browser.close()