เคยเจอมั้ยคะ element not found ทั้งๆที่ element ที่ว่ามันก็โชว์หราอยู่หน้าจอ
ข้อผิดพลาดอันนี้นี้ถ้าไม่ใช่เราใส่ target ผิดเอง ก็เพราะว่า selenium หาไม่เจอจริงๆค่ะ เพราะมันเป็น ajax
วิธีแก้แบบง่ายๆแต่ได้ผลที่สุดคือสั่งให้ selenium หยุดการทำงานรอ ajax ค่ะ
วิธีสั่งหยุดแบบได้ผลชะงัดคือ pause แต่แนะนำให้ใช้เป็นไม้ตายสุดท้ายเมื่อวิธีอื่นๆไม่ได้ผลค่ะ
คำสั่งรอทั้งหลายจะขึ้นด้วย waitfor...
กระทู้นี้จะแนะนำแค่สองตัวที่(น่าจะ)ใช้บ่อยค่ะ
- waitForVisible รอจนกว่าสิ่งนั้นจะปรากฏ
- waitForElementPresent รอให้ element ที่ระบุโผล่มาบนหน้าเว็บ
ระยะเวลารอก็อยู่ที่เราจะเซ็ท timeout ไว้ค่ะ
default ที่ให้มากับตัว selenium คือ 30000 ms (30วินาที) ถ้าเลยเวลาก็จะได้ error มาค่ะ
สองตัวนี้รอได้เหมือนกันทำงานเหมือนกัน ต่างกันจุดเล็กๆนิดเดียวคือ waitForVisible จะหาไม่พบถ้า element นั้น hidden ค่ะ
รูปแบบ
command: waitForVisible
target: ตำแหน่งของ element ที่เราต้องการรอ
value: ไม่มี
command: waitForElementPresent
target: ตำแหน่งของ element ที่เราต้องการรอ
value: ไม่มี
target ของทั้งสองคำสั่งแนะนำให้เลือกตัวที่จะปรากฎมาเป็นลำดับสุดท้ายนะคะ
เพราะมันจะทำให้เรามั่นใจได้ว่าข้อมูลในหน้านั้นโหลดมาครบแล้วแน่นอน
วิธีใช้
ก็ไม่มีอะไรมากค่ะ เอาคำสั่ง wait ไปแทรกไว้ก่อนคำสั่งที่ถูกฟ้องว่า element not found นั่นแหละ
เช่น
click | link=HOME |
type | id=textbox_search1 | 2014-07
แล้วบังเอิญหน้า home เป็น ajax
ถ้าเราใช้คำสั่ง type ต่อทันทีจะไม่สามารถหา target ให้ type ได้ค่ะเพราะว่าหน้า home ยังไม่มีข้อมูลเลย
งั้นเราก็แทรกคำสั่ง wait ลงไปแบบนี้
click | link=HOME |
waitForVisible | link=Previous |
type | id=textbox_search1 | 2014-07
ทีนี้ก็จะทำการรอจนกว่า link ที่ชื่อ Previous จะปรากฎ
ซึ่งแปลว่าข้อมูลในหน้านั้นส่งมาครบแล้วค่อยทำคำสั่ง type ต่อไปค่ะ