เมื่อ Automated Test แบบไม่เขียนโค๊ดไม่พอ มาลอง Playwright Python สิครับ

สวัสดีครับ

บางทีเราทำ Automated Test ด้วยวิธีง่ายๆ อย่าง Chrome Recorder มันก็ดีนะครับ แต่ถ้างานมันซับซ้อนขึ้น ต้องการควบคุม เยอะขึ้น หรืออยากทดสอบแบบที่ต้องป้อนข้อมูลเยอะๆ แบบนี้ Recorder อย่างเดียวอาจจะไม่พอแล้วนะครับ

วันนี้ผมเลยอยากแนะนำเครื่องมือ สุดเจ๋ง อย่าง Playwright นะครับ มันเป็นไลบรารีของ Python ที่ช่วยให้เราควบคุม Browser ได้แบบโปรเลย ทั้ง Chrome, Firefox, Safari ก็ได้หมดเลยนะ

มาเริ่มกันเลยดีกว่า ง่ายๆ แค่ติดตั้งไม่กี่คำสั่งเองครับ

pip install playwright
playwright install

จากนั้น เราก็เขียน โค๊ดทดสอบง่ายๆ ได้เลยนะ ลองดูตัวอย่างนี้ ครับ สมมติว่า เรามีฟอร์มสำหรับ Login อยู่ นะครับ

# test_login.py
import asyncio
from playwright.async_api import async_playwright, expect

async def run():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False) # อยากเห็น Browser ทำงาน ก็ headless=False นะครับ
        page = await browser.new_page()
        await page.goto("https://www.example.com/login") # สมมติหน้า Login นะครับ
        await page.fill("#username", "myuser")
        await page.fill("#password", "mypassword123")
        await page.click("button[type=\'submit\']")

        # ตรวจสอบว่า Login สำเร็จไหมครับ
        await expect(page).to_have_url("https://www.example.com/dashboard")
        print("Login สำเร็จแล้วนะครับ!")

        await browser.close()

if __name__ == "__main__":
    asyncio.run(run())

โค๊ดนี้คือเราบอกให้ Playwright เปิด Chrome ไปที่หน้า Login แล้วก็กรอก Username, Password แล้วก็กดปุ่ม Login นะครับ จากนั้นก็เช็คว่า URL ปลายทางเป็นหน้า Dashboard ไหม ถ้าใช่ก็แปลว่า Login สำเร็จนะครับ

ทีนี้ ถ้าเราอยากทดสอบข้อมูลเยอะๆ ล่ะครับ เช่น ทดสอบว่ากรอกข้อมูลตามกฏแล้วมันผ่านไหม หรือกรอกผิดแล้วมี Error ขึ้นถูกไหม อันนี้แหละครับที่ Playwright ช่วยเราได้ดีกว่า ลองดูตัวอย่างนี้ครับ ทดสอบการสมัครสมาชิกโดยใช้ข้อมูลหลายๆ ชุดกันนะครับ (ตรงนี้จะแตะ compliance เล็กน้อยโดยการทดสอบข้อมูลตามกฎนะ)

# test_register_data_driven.py
import asyncio
from playwright.async_api import async_playwright, expect

test_users = [
    {"username": "user1", "email": "[email protected]", "password": "Pass123!", "expected_success": True},
    {"username": "short", "email": "[email protected]", "password": "weak", "expected_success": False}, # รหัสผ่านอ่อนแอ
    {"username": "noemail", "email": "", "password": "GoodPass123!", "expected_success": False}, # ไม่มีอีเมล์
]

async def register_test():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        for user_data in test_users:
            print(f"\
กำลังทดสอบผู้ใช้: {user_data[\'username\']}")
            await page.goto("https://www.example.com/register") # หน้าสมัครสมาชิกนะครับ

            await page.fill("#username", user_data["username"])
            await page.fill("#email", user_data["email"])
            await page.fill("#password", user_data["password"])
            await page.click("button[type=\'submit\']")

            if user_data["expected_success"]:
                await expect(page).to_have_url("https://www.example.com/registration-success")
                print(f"✔️ สมัครสมาชิกสำเร็จสำหรับ {user_data[\'username\']} ครับ")
            else:
                await expect(page.locator(".error-message")).to_be_visible() # ต้องเห็นข้อความ error นะ
                print(f"❌ พบข้อผิดพลาดตามคาดสำหรับ {user_data[\'username\']} ครับ")

        await browser.close()

if __name__ == "__main__":
    asyncio.run(register_test())

เห็นไหมครับ แบบนี้เราก็สามารถทดสอบได้หลายเคส โดยไม่ต้องมานั่งกรอกเองทีละครั้งเลยนะครับ ช่วยให้เรามั่นใจว่าระบบทำงานถูกต้องตามกฎเกณฑ์ (compliance) ได้ง่ายขึ้นเยอะเลยนะ

และถ้าอยากให้เห็นหลักฐานการทดสอบด้วย เราก็สามารถ Save รูปหน้าจอไว้ได้ด้วยนะครับ อันนี้ก็ดีมากๆ เลยนะ

# ในโค๊ดตัวอย่างก่อนหน้า ตรงที่ต้องการ Save
await page.screenshot(path=f"screenshots/{user_data[\'username\']}_result.png")

แบบนี้เราก็จะมีหลักฐานเป็นรูปภาพ เก็บไว้ดูได้เลยนะครับ ว่าตอนทดสอบหน้าตาเป็นยังไง ช่วยให้เราทำงาน logging การทดสอบได้ดีขึ้นอีกด้วยนะครับ

หวังว่าบทความนี้จะช่วยให้เพื่อนๆ โปรแกรมเมอร์เห็นว่า Automated Test แบบเขียนโค๊ดด้วย Playwright มันมีพลังแค่ไหนนะครับ สามารถนำไปใช้กับงาน Testing ได้หลากหลายกว่าเดิมเยอะเลย ลองเอาไปปรับใช้กับระบบของเพื่อนๆ ดูนะครับ!

Read more

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

เจาะลึกเรื่องราวของ Eileen Gu นักสกีฟรีสไตล์ผู้สร้างประวัติศาสตร์ในโอลิมปิก 2026 สถิติที่ไม่เคยมีมาก่อน ประเด็นถกเถียง และความแข็งแกร่งส่วนตัวที่ทำให้เธอก้าวสู่ระดับโลก

By ทีมงาน devdog
วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

เจาะลึกวันพระและความสำคัญของวันมาฆบูชา 2569 ทั้งวันหยุดราชการ ธนาคาร กิจกรรมเวียนเทียนต้นไม้ และผลกระทบต่อบริการขนส่ง เตรียมตัววางแผนทำบุญและพักผ่อน

By ทีมงาน devdog
ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

เจาะลึกงานวิวาห์ "บังมัดคลองตัน" กับ "ต้นข้าว มิสแกรนด์" พร้อมเหตุผลจากใจเจ้าสาวที่เลือกความรักเหนือกาลเวลาและคำวิจารณ์ สู่การเริ่มต้นชีวิตคู่ที่สะท้อนการให้อภัย

By ทีมงาน devdog
ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

เจาะลึกไฮไลท์บอลไทยลีก 2 ของมหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรง ชัยชนะสำคัญจาก ชิตชนก และบทบาทโค้ชดุสิต สู่เส้นทางเพลย์ออฟที่น่าจับตา!

By ทีมงาน devdog