วันนี้มีคำถามเกี่ยวกับการใช้งาน Waiting ใน Selenium
สำหรับการรอให้ element มีใน DOM (Document Object Model)
สำหรับการรอให้ element มีใน DOM แต่ยังไม่แสดง (Not visible)
สำหรับการรอให้ element มีใน DOM แต่ยังไม่สามารถทำอะไรได้ (Not enable, Not clickable)

ซึ่งเจออย่างมากสำหรับระบบ frontend ที่พัฒนาด้วยภาษา JavaScript เป็นหลัก

คำถามคือ
ถ้าใช้ Selenium ในการทดสอบระดับ UI (User Interface) จะต้องทำอย่างไร ?
เนื่องจากถ้าเขียนแบบปกติแล้ว test case จะพังง่ายมาก ๆ
บางครั้งทดสอบผ่าน บางครั้งทดสอบผิด
ทำให้ชุดการทดสอบไม่น่าเชื่อถือเลย

คำตอบก็คือ
ทำการ delay ไงล่ะ เช่น sleep(5000) คือรอ 5 วินาที
ซึ่งเป็นวิธีการที่ง่ายที่สุดแล้ว ใคร ๆ ก็ทำ
แต่ข้อเสียคือ จากตัวอย่างต้องรอไป 5 วินาที
ลองคิดดูสิว่า ถ้าทำแบบนี้เยอะ ๆ
เวลารวมในการทดสอบจะเป็นอย่างไร ?

น่าจะใช้เวลามากมาย ซึ่งไม่ค่อยดีต่อการทดสอบแน่ ๆ !!
ดังนั้นมาหาวิธีอื่นกันดีกว่านะ

ใน Selenium นั้นมีการรอ (Waiting) ดังต่อไปนี้คือ

1. Implicit waiting
2. Explicit waiting
3. Fluent waiting

มาดูรายละเอียดของแต่ละตัวกัน

1. Implicit waiting

เป็นการบอกให้ selenium รู้ว่า
เวลาในการหา element แต่ละตัวบนหน้าจอหรือใน DOM เป็นเท่าไร
ถ้าหาไม่เจอในเวลาที่กำหนดแล้ว
selenium จะทำการโยน exception ออกมา
ซึ่ง implicit waiting จะกำหนดก่อนการเปิด browser ขึ้นมา
และจะถูกใช้งานในทุก ๆ ครั้งที่หา element

ตัวอย่าง code

2. Explicit waiting หรือ Smart waiting

เป็นการรอแบบมีเงื่อนไขที่กำหนด
แต่ถ้าไม่เจอ element ตามเงื่อนไนในเวลาที่กำหนด
ก็จะทำการโยน exception ออกมา
ตัวอย่างของเงื่อนไขเช่น
Element นั้นแสดงหรือไม่ ?
Element นั้นซ่อนหรือไม่ ?
Element นั้น click ได้หรือไม่ ?

โดยที่ Explicit waiting จะทำการตรวจสอบค่าใน DOM
ประมาณทุก ๆ 500 millisecond

3. Fluent waiting

เป็นการรอขั้นกว่า Explicit waiting นั่นก็คือ
การรอแบบมีเงื่อนไขในเวลาที่กำหนด
แต่ยังไม่พอนะ
เพิ่มความถี่ในการตรวจสอบอีกด้วย (Polling interval)
ยังไม่พออีกนะ
สามารถ ignore exception ที่เราไม่ต้องการ
ทำให้การรอมีความยึดหยุ่นมากขึ้นอีกเยอะ

แสดงการทำงานดังรูป
จะทำการตรวจสอบทุก ๆ 250 millisecond

ตัวอย่าง code

ดังนั้นลองดูสิว่า ระบบที่ทำการทดสอบนั้นเป็นอย่างไร ?

ตัวอย่างเช่น
ถ้า element ที่ต้องการหานั้น
ต้องสามารถ click ได้ด้วย
คำถามคือ คุณจะใช้ implicit waiting หรือไม่ ?
ถ้าใช้สิ่งที่ตามมาก็คือ อาจจะหา element เจอ
แต่ไม่สามารถ click ได้
เพราะว่า implicit waiting จะจบการทำงานเมื่อเจอ element เท่านั้น

ดังนั้นวิธีการที่น่าจะดีกว่าคือ Explicit waiting และ Fluent waiting นะครับ

ปิดท้ายด้วยตารางเปรียบเทียบของ Selenium waiting ทั้ง 3 ตัว

Reference Websites
http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
http://toolsqa.com/selenium-webdriver/c-sharp/advance-explicit-webdriver-waits-in-c/
http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/