มาใช้ Playwright เขียน e2e testing กันเถอะ
Tags: e2e, playwright, testing
Published: 2021-11-13 01:58:26

## Playwright คืออะไร 

[Playwright](https://playwright.dev/) คือ e2e (end to end) testing framework ที่พัฒนาโดย Microsoft 


หลายๆคนบอกว่า Playwright ยังถือว่าเป็น framework ที่ค่อนข้างใหม่มากๆ (first public release on Jan 2020) แต่ถ้าดูใน contributor page ของ [playwright](https://github.com/microsoft/playwright/graphs/contributors) และ [puppeteer](https://github.com/puppeteer/puppeteer/graphs/contributors) จะพบว่า main contributor ของ puppeteer ย้ายมา contribute playwright กันหมดเลย


ซึ่งเป็นที่รับรู้โดยปกติใน community ของ Playwright ว่า Playwright ใช้ API เดียวกันกับ Puppeteer

## Why not Selenium

Selenium เป็น e2e framework ที่ผ่านการทดสอบมาอย่างยาวนาน ผ่านการใช้งานอย่างโชกโชน และถึงแม้ว่าจะมีข้อดีมากมาย แต่ก็มีข้อจำกัดบางอย่างที่ทำให้ผมไม่อยากเอามาทำ POC และเลือกใช้งาน คือ 

- การติดตั้งที่ซับซ้อน (เพราะต้องลง driver ของ browser)
- package ที่มีขนาดใหญ่
- เขียนและใช้งานยากเกินไป (สำหรับผม)
- ฯลฯ

## Why not Cypress

ถึงแม้ว่าจะเป็น e2e framework ที่มาแรงมีจำนวนคนใช้งานเยอะ และมียอดการใช้งานที่เยอะกว่า Playwright มากๆ

![https://www.npmtrends.com/cypress-vs-playwright-vs-@playwright/test](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8tbl3y9pqdd06maggt49.png)

แต่ Cypress ก็มีข้อจำกัดอยู่มากมาย ที่จะสร้างความลำบากให้ผมในการทำ e2e test ในระบบปัจจุบันที่ผมกำลังรับผิดชอบ ซึ่งเรื่องส่วนใหญ่จะเป็น feature ที่ Cypress ไม่มีแต่ Playwright สามารถทำได้ นั่นก็คือ 

1. **Thrid party login**: Cypress ยอมให้รัน e2e script ได้บน domain เดียวเท่านั้น ซึ่งใน use case ที่ผมใช้จะต้องสามารถทำ login บน third party ได้ ~ นี่เป็นสาเหตุหลักในการปฏิเสธ Cypress เพราะผมไม่ต้องการที่จะเพิ่ม logic ที่ไม่เกี่ยวข้องกับการเทส จนเกินความจำเป็น

2. **Multiple browser session**: Cypress รันได้แค่ browser เดียว ซึ่งการทำเทสเคสในกรณีที่ต้องใช้ user หลายๆคน จะต้องเขียนในทำ log in / log out ก่อน ซึ่งจะส่งผลกระทบให้ระยะเวลาในการ execute นาน

3. **Performance**: ต่ำกว่า Playwright พอสมควร

4. **Wait**: การทำ wait นั้นยังอ่อนหัดกว่า Playwright มากๆ Cypress ทำได้แค่กำหนดเวลา และรอให้ element แสดง ส่วน Playwright มี function ทำ wait ที่ยืดหยุ่น(เพราะใช้ API ของ puppeteer ทั้งหมด) ไม่ว่าจะเป็นการ รอให้ page load เสร็จโดยดูจาก network, รอให้ element แสดง, รอ element หาย ฯลฯ


## Playwright promising features

นอกเหนือจากเรื่องของ performance และการใช้งานที่แทบจะเหมือนกับ Puppeteer แล้ว สิ่งที่ทำให้ Playwright น่าสนใจว่า framework อื่นๆ คือ

### 1. Code generator

Playwright สามารถเปิด recording mode เพียงแค่รัน

```sh
yarn playwright codegen {url}
```

Playwright จะเปิด Chromium ตาม url ที่กำหนดใน command และ Playwright Inspector (หรือ IDE นั่นแหละ) ขึ้นมาบันทึกทุกการทำงานของเรา และแปลงเป็น e2e script ให้

![Playwright Code Generator](https://user-images.githubusercontent.com/284612/92536033-7e7ebe00-f1ed-11ea-9e1a-7cbd912e3391.gif)


> Playwright code generator ช่วยให้เราเขียน e2e script ไวขึ้น เพราะไม่ต้องมาคอย inspect element ที่ต้องการ รวมทั้งจะได้ element ที่ Playwright มองเห็นจริงๆ

### 2. Debug mode

ถึงแม้ว่าจะมี code generator แต่ Playwright ก็ไม่ได้ฉลาดมากพอที่จะ capture ทุก element ที่เราต้องการ โดยเฉพาะ component ที่เราไม่ได้เขียนมาเพื่อรองรับการทำ e2e ที่จะทำให้ Playwright เลือก selector ที่คลุมเครือ 


ซึ่งอันที่จริง ก็เป็นเรื่องปกติของการทำ recording ของ e2e framework ทุกตัว และก็เป็นเรื่องปกติที่เราจะต้องมา revise และแก้ไขมันตลอด


แต่ใน debug mode Playwright จะเปิด IDE และเปิดไฟล์และ highlight บรรทัดที่กำลังรันอยู่ ที่จะทำให้เรารู้ว่ามันกำลังทำงานที่บรรทัดไหน


นอกเหนือจากนั้นเราสามารถหยุด โดยการกด pause ที่ IDE หรือกำหนด `page.pause()` ใน e2e script ของเราได้

![Playwright Inspector](https://user-images.githubusercontent.com/883973/108614092-8c478a80-73ac-11eb-9597-67dfce110e00.png)

> debug mode จะช่วยให้เราสามารถแก้ไข e2e script ของเราได้ง่ายและไวขึ้น เพราะไม่จำเป็นต้องคอยรันหลายๆครั้งเพื่อดู error เราสามารถหยุด แล้วลองเล่นและ record การใช้งานเพื่อเอามาแก้ไขได้เลย


### 3. Trace viewer 

ในกรณีที่รัน e2e ไม่ผ่าน สิ่งที่เราต้องการจะรู้คือ ทำไมมันถึงไม่ผ่าน มันเกิดปัญหาอะไร ซึ่งตามปกติ e2e framework ทั่วๆไปจะสามารถ capture screen shot หรือ record video ได้


แต่ Playwright มี feature ที่เทพกว่านั้น คือ Trace Viewer ซึ่งจะแสดง timeline ของการรัน คู่กับ script ในแต่ละ line เพื่อดูว่าปัญหาเกิดขึ้นที่ตรงไหนบ้าง

![Trace Viewer](https://user-images.githubusercontent.com/883973/120585896-6a1bca80-c3e7-11eb-951a-bd84002480f5.png)


### 4. Authentication 


นี่คือ feature ที่ตอบโจทย์ผมมากกที่สุด คือการที่สามารถทำ login แล้วเก็บ browser session เพื่อเอากลับมา reuse ได้ โดยที่ไม่ต้อง login ซ้ำอีกหลายๆครั้ง

การใช้งาน authentication ของ Playwright ถือว่าง่ายมากๆ เพราะเราสามารถเก็บ session ลง config และ reuse ได้ง่ายๆ โดยไม่ต้องเขียนโค้ดเพื่อดึง cache session เหมือน framework อื่นๆ ที่จะต้องเอา logic การทำ authentication ไปป่ะปนกับเทสเคส


และสิ่งที่เทพสุดๆของการทำ authentication คือ Playwright สามารถทำ login ได้หลาย session และสามารถเอามา reuse ในเทสเคส 

> การรัน e2e พร้อมกันหลายๆ​ session จะทำให้ลดระยะเวลาในการ execute เพราะไม่จำเป็นต้องเขียนให้ทำ log in / log out 

## บทสรุป

นี่เป็นเพียงแค่ความคิดเห็นส่วนตัวของผม ณ เวลานี้เท่านั้น โดยตาม use case และข้อจำกัดของระบบที่ผมดูแลในตอนนี้ Playwright เหมาะสมที่สุดในการเอามาทำ e2e testing เนื่องจากมีเครื่องมือที่ช่วยให้ผมเขียน e2e testing ได้ง่ายและรวดเร็ว

ผลลัพท์คือ สร้าง e2e ได้ไว ลด logic ที่ไม่เกี่ยวข้องกับการเทส และที่สำคัญที่สุดคือลด execution time ซึ่งจะช่วยประหยัดเวลาและประหยัดเงินในการรัน e2e ไปได้เยอะ

## Ref 

- [why playwright](https://github.com/microsoft/playwright/blob/master/docs/src/why-playwright.md)
- [playwright trace viwer](https://github.com/microsoft/playwright/blob/master/docs/src/trace-viewer.md)
- [playwright debug](https://github.com/microsoft/playwright/blob/master/docs/src/debug.md)
- [playwright codegen](https://github.com/microsoft/playwright/blob/master/docs/src/codegen.md)
- [playwright auth](https://github.com/microsoft/playwright/blob/master/docs/src/auth.md)
- [multiple context scenario](https://playwright.dev/docs/multi-pages/#multiple-contexts)
- [geekculture: Is Playwright better than Cypress? Playwright vs Cypress](https://medium.com/geekculture/is-playwright-better-than-cypress-playwright-vs-cypress-151bd65a224f)
- [somkiat.cc: สรุปจากบทความเปรียบเทียบความเร็วของ Cypress vs Selenium vs Playwright vs Puppeteer](https://www.somkiat.cc/cypress-vs-selenium-vs-playwright-vs-puppeteer/)
- [npm compare between cypress and playwright](https://moiva.io/?npm=@playwright/test+cypress+playwright)