ตรวจสอบองค์ประกอบปัจจุบัน & รอคำสั่งเข้า Selenium
⚡ สรุปอย่างชาญฉลาด
ตรวจสอบว่ามีองค์ประกอบอยู่หรือไม่ และใช้คำสั่ง waitFor ใน Selenium IDE จะตรวจสอบว่าหน้าเว็บมีองค์ประกอบและข้อความตรงตามที่การทดสอบคาดหวังหรือไม่ และจะหยุดการเล่นชั่วคราวจนกว่าเงื่อนไขแบบไดนามิกจะเป็นจริงก่อนที่จะดำเนินการขั้นตอนต่อไป
บันทึกไว้ Selenium IDE สคริปต์จะคลิกและพิมพ์ แต่โดยตัวมันเองแล้วไม่สามารถตัดสินได้ว่าแอปพลิเคชันทำงานถูกต้องหรือไม่ มีคำสั่งสองกลุ่มที่ทำหน้าที่นั้น: ตรวจสอบ คำสั่งที่ตรวจสอบสถานะของหน้าเว็บ และ รอ คำสั่งที่ระงับการทำงานจนกว่าหน้าเว็บจะพร้อมตรวจสอบ
⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: ภาพหน้าจอด้านล่างมาจากต้นฉบับ Firefox-เสียบเข้าไป Selenium IDE ตัวนี้ไม่ได้มีการแจกจ่ายอีกต่อไปแล้ว และพวกเขาใช้ชื่อแบบ camelCase Selenese IDE ที่ใช้ในปัจจุบันคือ Chrome Firefox และขอบ ส่วนขยายของเบราว์เซอร์พฤติกรรมที่อธิบายไว้ในที่นี้ยังคงใช้ได้อยู่ แต่ชื่อคำสั่งบางส่วนได้เปลี่ยนไป — แผนที่ping ตารางจะปรากฏในภายหลังในบทความนี้ และคำสั่งและภาพหน้าจอต้นฉบับทั้งหมดได้รับการเก็บรักษาไว้อย่างถูกต้องตามที่เผยแพร่ไว้
ตรวจสอบการมีอยู่ขององค์ประกอบ
เราสามารถใช้คำสั่งสองคำสั่งต่อไปนี้เพื่อตรวจสอบการมีอยู่ขององค์ประกอบ:
- ตรวจสอบองค์ประกอบปัจจุบัน – คืนค่า TRUE หากพบองค์ประกอบที่ระบุในหน้า คืนค่า FALSE หากไม่เป็นเช่นนั้น
- ตรวจสอบองค์ประกอบไม่ปัจจุบัน – คืนค่า TRUE หากไม่พบองค์ประกอบที่ระบุที่ใดก็ได้ในเพจ FALSE หากมีอยู่
คำสั่งทั้งสองรับองค์ประกอบหนึ่งตัว ระบุตำแหน่ง ที่ Target ฟิลด์ — รหัส, ชื่อ, ตัวเลือก CSS, ข้อความลิงก์ หรือ XPath การแสดงออก — และทั้งสองอย่างไม่จำเป็นต้องมีค่า
สคริปต์ทดสอบด้านล่างนี้จะตรวจสอบว่ากล่องข้อความชื่อผู้ใช้มีอยู่ภายใน Mercury หน้าแรกของทัวร์ในขณะที่กล่องข้อความชื่อจริงไม่ใช่ กล่องข้อความชื่อจริงเป็นองค์ประกอบที่มีอยู่ในหน้าการลงทะเบียนของ Mercury ทัวร์ไม่อยู่ในหน้าแรก
เพราะสิ่งเหล่านี้คือ ตรวจสอบ คำสั่งแทนที่จะเป็น ยืนยัน หากคำสั่งใดล้มเหลว ระบบจะบันทึกข้อผิดพลาดลงในบันทึกการทำงาน และขั้นตอนที่เหลือจะยังคงทำงานต่อไป ความแตกต่างนี้จะอธิบายโดยละเอียดเพิ่มเติมในส่วนถัดไป
ตรวจสอบการมีอยู่ของข้อความบางอย่างในคำสั่งใน Selenium
การตรวจสอบว่าองค์ประกอบนั้นมีอยู่จริงหรือไม่นั้นไม่เพียงพอเสมอไป การทดสอบมักจะต้องยืนยันคำที่แสดงให้ผู้ใช้เห็นด้วย คำสั่งข้อความสองคำสั่งนี้ครอบคลุมกรณีดังกล่าว
- ตรวจสอบข้อความปัจจุบัน – คืนค่า TRUE หากพบสตริงข้อความที่ระบุในเพจที่ใดที่หนึ่ง คืนค่า FALSE หากไม่เป็นเช่นนั้น
- ตรวจสอบ TextNotPresent – ส่งคืน TRUE หากไม่พบสตริงข้อความที่ระบุที่ใดก็ได้ในเพจ เป็นเท็จหากพบ
โปรดจำไว้ว่าคำสั่งเหล่านี้คำนึงถึงขนาดตัวพิมพ์
บันทึกด้านล่างแสดงให้เห็นว่ามีการตรวจสอบหน้าเดียวกันสองครั้ง โดยใช้การสะกดคำที่แตกต่างกันสองแบบสำหรับวลีเดียวกัน
ในสถานการณ์ข้างต้น “Atlanta to Las Vegas” ถูกจัดการแตกต่างจาก “atlanta to Las Vegas” เนื่องจากตัวอักษร “A” ในคำว่า “Atlanta” เป็นตัวพิมพ์ใหญ่ในประโยคแรก ส่วนตัวพิมพ์เล็กในอีกประโยคหนึ่ง เมื่อใช้คำสั่ง verifyTextPresent กับแต่ละประโยค ปรากฏว่าประโยคหนึ่งผ่านการตรวจสอบ ในขณะที่อีกประโยคหนึ่งไม่ผ่านการตรวจสอบ
ตรวจสอบตำแหน่งเฉพาะขององค์ประกอบ
ข้อบกพร่องในการจัดวางมักไม่ทำให้ตัวระบุตำแหน่งเสียหาย ดังนั้นการตรวจสอบการมีอยู่จึงพลาดข้อบกพร่องเหล่านั้น คำสั่งกำหนดตำแหน่งจะช่วยอุดช่องว่างนั้นได้
Selenium IDE ระบุตำแหน่งขององค์ประกอบโดยการวัด (เป็นพิกเซล) ว่าอยู่ห่างจากขอบด้านซ้ายหรือด้านบนของหน้าต่างเบราว์เซอร์เพียงใด
- ตรวจสอบองค์ประกอบตำแหน่งซ้าย – ตรวจสอบว่าจำนวนพิกเซลที่ระบุตรงกับระยะห่างขององค์ประกอบจากขอบด้านซ้ายของหน้าหรือไม่ สิ่งนี้จะส่งกลับ FALSE หากค่าที่ระบุไม่ตรงกับระยะห่างจากขอบด้านซ้าย
- ตรวจสอบองค์ประกอบตำแหน่งด้านบน – ตรวจสอบว่าจำนวนพิกเซลที่ระบุตรงกับระยะห่างขององค์ประกอบจากขอบด้านบนของหน้าหรือไม่ สิ่งนี้จะส่งกลับ FALSE หากค่าที่ระบุไม่ตรงกับระยะห่างจากขอบด้านบน
สคริปต์ด้านล่างจะบันทึกค่าชดเชยพิกเซลที่คาดไว้ในคอลัมน์ Value
โปรดใช้ความระมัดระวังในการใช้คำสั่งทั้งสองนี้ ค่าชดเชยพิกเซลจะเปลี่ยนแปลงไปตามขนาดหน้าต่าง ระดับการซูม และแบบอักษรที่ติดตั้ง ดังนั้นตัวเลขที่กำหนดไว้ตายตัวซึ่งใช้ได้ผลในเครื่องหนึ่ง อาจใช้ไม่ได้ผลในอีกเครื่องหนึ่ง
รอคำสั่งใน Selenium
คำสั่ง verify สามารถตรวจสอบได้เฉพาะสิ่งที่แสดงอยู่บนหน้าจอเท่านั้น ดังนั้นการตรวจสอบที่ทำงานเร็วเกินไปจะล้มเหลวแม้ว่าแอปพลิเคชันจะทำงานได้ก็ตาม คำสั่ง wait ช่วยแก้ปัญหาเรื่องเวลาดังกล่าวได้
ต่อไปนี้เป็นประเภทของคำสั่งรอใน Selenium
และคำสั่งรอ
คำสั่งเหล่านี้เป็นคำสั่งที่จะรอให้โหลดหน้าใหม่ก่อนที่จะย้ายไปยังคำสั่งถัดไป
ตัวอย่างเช่น
- คลิกและรอ
- พิมพ์และรอ
- เลือกและรอ
คำสั่งเหล่านั้นทั้งหมดเป็นคำสั่งการทำงานทั่วไปที่มีคำต่อท้ายว่า AndWait ดังตัวอย่างขั้นตอนที่บันทึกไว้ด้านล่าง
คำสั่ง waitFor
คำสั่งเหล่านี้เป็นคำสั่งที่รอให้เงื่อนไขที่ระบุเป็นจริงก่อนดำเนินการต่อไปยังคำสั่งถัดไป (โดยไม่คำนึงถึงการโหลดหน้าใหม่) คำสั่งเหล่านี้เหมาะสมกว่าที่จะใช้บนเว็บไซต์ไดนามิกที่ใช้ AJAX ซึ่งเปลี่ยนค่าและองค์ประกอบโดยไม่ต้องโหลดทั้งหน้าซ้ำ ตัวอย่างได้แก่:
- waitForTitle
- รอข้อความปัจจุบัน
- รอการแจ้งเตือน
พิจารณาสถานการณ์ Facebook ด้านล่าง
เราสามารถใช้การผสมผสานระหว่าง "คลิก" และ "waitForTextPresent" เพื่อยืนยันการมีอยู่ของข้อความ "ระบุวันเกิดของคุณ"
เราไม่สามารถใช้ clickAndWait ได้เนื่องจากไม่มีการโหลดหน้าเว็บเมื่อคลิกที่ "เหตุใดฉันจึงต้องระบุวันเกิดของฉัน" ลิงค์ ถ้าเราทำเช่นนั้นการทดสอบจะล้มเหลว
กฎเดียวกันนี้ใช้กับเนื้อหาใดๆ ที่ถูกแทรกโดยสคริปต์แทนที่จะเป็นการนำทาง ซึ่งเป็นเหตุผลว่าทำไม หน้าจอที่ขับเคลื่อนด้วย AJAX โดยส่วนใหญ่แล้วจำเป็นต้องใช้ waitFor มากกว่า andWait
คำสั่ง Assert, Verify และ waitFor ใน Selenium IDE
ผู้เริ่มต้นมักเลือกตระกูลโปรแกรมผิด แล้วก็สงสัยว่าทำไมโปรแกรมถึงหยุดทำงานเมื่อพบข้อบกพร่องครั้งแรก หรือทำไมถึงรายงานข้อผิดพลาดถึงยี่สิบรายการ ทั้งๆ ที่ทั้งหมดนั้นไม่ใช่ปัญหา tracกลับไปที่หนึ่ง คำนำหน้าทั้งสามคำตอบคำถามที่แตกต่างกันสามข้อ
| อุปสรรค | สิ่งที่มันไม่ | เมื่อเกิดความล้มเหลว | ใช้ดีที่สุดสำหรับ |
|---|---|---|---|
| ยืนยัน | ตรวจสอบสภาพทันที | บันทึกข้อผิดพลาดและหยุดการทดสอบ | เงื่อนไขเบื้องต้น — การเข้าสู่ระบบที่ต้องสำเร็จก่อนที่สิ่งอื่นใดจะมีความหมาย |
| ตรวจสอบ | ตรวจสอบสภาพทันที | บันทึกข้อผิดพลาดและดำเนินการต่อด้วยคำสั่งถัดไป | การตรวจสอบอิสระ เช่น การมีฉลากหลายแบบในหน้ายืนยันเดียวกัน |
| รอ | ทำโพลไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นจริง | บันทึกข้อผิดพลาดเมื่อหมดเวลา แล้วจึงดำเนินการต่อ | สิ่งใดก็ตามที่แสดงผลช้า — การตอบสนอง AJAX, ตัวหมุนแสดงสถานะการแสดงผล, กล่องโต้ตอบ |
รูปแบบที่ใช้งานได้จริงจะรวมทั้งสามอย่างเข้าด้วยกัน: ตรวจสอบหน้าเว็บที่คุณเข้าชม รอองค์ประกอบที่มาถึงแบบอะซิงโครนัส จากนั้นตรวจสอบแต่ละฟิลด์ทีละรายการ การทำตามลำดับนี้หมายความว่าการนำทางที่ผิดพลาดเพียงครั้งเดียวจะหยุดการทดสอบก่อนกำหนด ในขณะที่ความไม่ตรงกันเล็กน้อยจะถูกรายงานในการทดสอบครั้งเดียว ระเบียบวินัยเดียวกันนี้สามารถนำไปใช้กับ... Selenium การทดสอบที่เขียนด้วยโค้ด ซึ่งเทียบเท่ากับการตรวจสอบแบบเข้มงวด (hard assertion), การตรวจสอบแบบผ่อนปรน (soft assertion) และการรอแบบระบุชัดเจน (explicit wait)
ตรวจสอบและรอคำสั่งในปัจจุบัน Selenium IDE
การขอ Firefox-ปลั๊กอิน IDE ที่สร้างภาพหน้าจอข้างต้นถูกยกเลิกไปแล้ว และชุดคำสั่งได้รับการสร้างใหม่สำหรับส่วนขยายเบราว์เซอร์ปัจจุบัน ชื่อภาษา Selenese บางชื่อยังคงอยู่ บางชื่อถูกเปลี่ยนชื่อ และบางชื่อถูกตัดออกไป ตารางด้านล่างแสดงการจับคู่คำสั่งที่ใช้ในบทความนี้กับคำสั่งที่เทียบเท่าในปัจจุบัน ซึ่งนำมาจากเอกสารอย่างเป็นทางการ Selenium คู่มืออ้างอิงคำสั่ง IDE.
| คำสั่งเซเลเนสแบบดั้งเดิม | คำสั่งใน IDE ปัจจุบัน |
|---|---|
| ตรวจสอบองค์ประกอบปัจจุบัน | ตรวจสอบว่ามีองค์ประกอบอยู่หรือไม่ |
| ตรวจสอบองค์ประกอบไม่ปัจจุบัน | ตรวจสอบว่าไม่มีองค์ประกอบอยู่ |
| ตรวจสอบข้อความปัจจุบัน | ตรวจสอบข้อความ (โดยจำกัดขอบเขตเฉพาะตัวระบุตำแหน่งขององค์ประกอบ ไม่ใช่ทั้งหน้าเว็บ) |
| ตรวจสอบ TextNotPresent | ตรวจสอบว่าไม่ใช่ข้อความ (จำกัดขอบเขตตามตัวระบุตำแหน่งขององค์ประกอบ) |
| ตรวจสอบชื่อเรื่อง | ตรวจสอบชื่อเรื่อง |
| ตรวจสอบตำแหน่งองค์ประกอบด้านซ้าย / ตรวจสอบตำแหน่งองค์ประกอบด้านบน | ไม่มีสิ่งที่เทียบเท่า — การยืนยันจุดยืนถูกยกเลิก |
| คลิกแล้วรอ, พิมพ์แล้วรอ, เลือกแล้วรอ | ไม่ต้องเติม AndWait ต่อท้าย เพราะคำสั่ง open จะรอการโหลดหน้าเว็บอยู่แล้ว |
| รอสำหรับองค์ประกอบปัจจุบัน | รอจนกว่าองค์ประกอบจะปรากฏ โดยมีระยะเวลารอเป็นมิลลิวินาที |
| รอการแจ้งเตือน | ยืนยันข้อความแจ้งเตือนหรือตรวจสอบข้อความแจ้งเตือนหลังจากกล่องโต้ตอบปรากฏขึ้น |
ความแตกต่างสองประการที่สำคัญที่สุดในการทำงานประจำวัน ประการแรก คำสั่งรอในปัจจุบัน — รอให้องค์ประกอบปรากฏ รอให้องค์ประกอบมองเห็นได้ รอให้องค์ประกอบแก้ไขได้ และคำสั่งที่ตรงกันข้ามกับคำสั่งเหล่านี้ — แต่ละคำสั่งจะระบุเวลาการรอเป็นมิลลิวินาทีอย่างชัดเจน ดังนั้นขั้นตอนที่ช้าจึงไม่จำเป็นต้องใช้เวลาหมดอายุร่วมกันอีกต่อไป ประการที่สอง การค้นหาข้อความทั่วทั้งหน้าเว็บหายไปแล้ว การตรวจสอบข้อความจำเป็นต้องมีตัวระบุตำแหน่ง ซึ่งโดยปกติแล้วจะให้ผลการตรวจสอบที่แม่นยำกว่าอยู่แล้ว
ข้อผิดพลาดที่พบบ่อยในการใช้คำสั่ง Verify และ waitFor
ปัญหาที่พบได้บ่อยที่สุดเกี่ยวกับคำสั่งเหล่านี้ ไม่ใช่ความบกพร่องของ IDE รายการด้านล่างนี้ครอบคลุมถึงความล้มเหลวที่เกิดขึ้นบ่อยที่สุดและวิธีแก้ไขแต่ละปัญหา
- องค์ประกอบนั้นมีอยู่จริง แต่การตรวจสอบยังคงล้มเหลว การมีอยู่และการมองเห็นได้นั้นแตกต่างกัน องค์ประกอบที่ซ่อนอยู่หลังกฎ CSS ยังคงมีอยู่ใน DOM ดังนั้นควรตรวจสอบการมีอยู่ควบคู่กับการรอจนกว่าองค์ประกอบจะปรากฏให้เห็นเมื่อการทดสอบขึ้นอยู่กับการที่ผู้ใช้เห็นองค์ประกอบนั้นจริง ๆ
- การตรวจสอบข้อความล้มเหลวเนื่องจากข้อความที่ดูเหมือนกันทุกประการ ช่องว่างที่ไม่เว้นวรรค ช่องว่างท้ายบรรทัด และเครื่องหมายอะพอสโทรฟีแบบโค้งที่คัดลอกมาจากเอกสารออกแบบ ล้วนทำให้การจับคู่ที่แม่นยำไม่ถูกต้อง ควรพิมพ์ข้อความที่ต้องการใหม่ด้วยตนเองแทนการคัดลอกวาง
- คำสั่งรอหมดเวลาในหน้าเว็บที่โหลดเสร็จสมบูรณ์แล้ว โดยปกติแล้วองค์ประกอบดังกล่าวจะอยู่ภายใน iframe ให้ทำการเลือกเฟรมก่อน มิฉะนั้นตัวระบุตำแหน่งจะถูกประเมินกับเอกสารที่ไม่ถูกต้อง
- clickAndWait ค้างในแอปพลิเคชันแบบหน้าเดียว ไม่มีการนำทางเกิดขึ้น ดังนั้นจึงไม่มีอะไรต้องรอ ให้เปลี่ยนเป็นการคลิกแล้วตามด้วยคำสั่ง waitFor ที่เหมาะสมแทน
- การตรวจสอบตำแหน่งผ่านในเครื่อง แต่ล้มเหลวบนเซิร์ฟเวอร์สำหรับสร้างโปรแกรม ขนาดหน้าจอและการแสดงผลฟอนต์แตกต่างกัน ควรเลือกตรวจสอบการมีอยู่หรือข้อความ หรือกำหนดขนาดหน้าต่างอย่างชัดเจนตั้งแต่เริ่มต้นการทดสอบ
- กระบวนการทั้งหมดจะหยุดชะงักลงเมื่อพบความไม่ลงตัวเพียงเล็กน้อย มีการบันทึกคำสั่ง assert ในตำแหน่งที่ควรจะเป็นคำสั่ง verify ให้เปลี่ยนคำนำหน้า แล้วโปรแกรมจะรายงานข้อผิดพลาดทั้งหมดแทนที่จะรายงานเฉพาะข้อผิดพลาดแรก
เมื่อบทภาพยนตร์ผ่านพ้นกับดักเหล่านี้ไปได้แล้ว ขั้นตอนต่อไปมักจะเป็น... เก็บค่าขณะรันไทม์ไว้ในตัวแปร ดังนั้นการตรวจสอบจึงเปรียบเทียบกับข้อมูลจริงแทนที่จะเป็นสตริงที่กำหนดไว้ตายตัว






