Selenium IDE - waitFor.. แก้ปัญหา element not found กับ ajax

ตอบกระทู้

รูปแสดงอารมณ์
:icon_plusone: :like: :plusone: :gfb: :-D :) :( :-o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :angry: :baa: :biggrin:
รูปแสดงอารมณ์อื่นๆ

BBCode เปิด
[img] เปิด
[url] เปิด
[Smile icon] เปิด

กระทู้แนะนำ
   

มุมมองที่ขยายได้ กระทู้แนะนำ: Selenium IDE - waitFor.. แก้ปัญหา element not found กับ ajax

Selenium IDE - waitFor.. แก้ปัญหา element not found กับ ajax

โดย chbbk » 07/10/2014 6:23 pm

เคยเจอมั้ยคะ 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 ต่อไปค่ะ :-D

ข้างบน