อุปสรรคที่ใหญ่ที่สุดในการทดสอบ ExtJS กับ Selenium คือ ExtJS ไม่แสดงองค์ประกอบ HTML มาตรฐานและ Selenium IDE จะสร้างคำสั่งที่กำหนดเป้าหมายไปที่องค์ประกอบที่ทำหน้าที่เป็นเพียงการตกแต่ง - องค์ประกอบที่ไม่จำเป็นซึ่งช่วย ExtJS กับเดสก์ท็อปทั้งหมด - มองและรู้สึก. นี่คือเคล็ดลับและกลเม็ดบางส่วนที่ฉันรวบรวมขณะเขียนการทดสอบซีลีเนียมอัตโนมัติกับแอป ExtJS
เคล็ดลับทั่วไป
การค้นหาองค์ประกอบ
เมื่อสร้างกรณีทดสอบ Selenium โดยบันทึกการกระทำของผู้ใช้ด้วย Selenium IDE บน Firefox ซีลีเนียมจะยึดการกระทำที่บันทึกไว้บนรหัสขององค์ประกอบ HTML อย่างไรก็ตามสำหรับองค์ประกอบที่คลิกได้ส่วนใหญ่ ExtJS จะใช้รหัสที่สร้างขึ้นเช่น "ext-gen-345" ซึ่งมีแนวโน้มที่จะเปลี่ยนแปลงในการเข้าชมหน้าเดียวกันในภายหลังแม้ว่าจะไม่มีการเปลี่ยนแปลงโค้ดก็ตาม หลังจากบันทึกการดำเนินการของผู้ใช้สำหรับการทดสอบแล้วจำเป็นต้องใช้ความพยายามด้วยตนเองในการดำเนินการดังกล่าวทั้งหมดซึ่งขึ้นอยู่กับรหัสที่สร้างขึ้นและเพื่อแทนที่ มีการเปลี่ยนสองประเภทที่สามารถทำได้:
การแทนที่ Id Locator ด้วย CSS หรือ XPath Locator
ตัวระบุตำแหน่ง CSS เริ่มต้นด้วย "css =" และ XPath locators ขึ้นต้นด้วย "//" (คำนำหน้า "xpath =" เป็นทางเลือก) ตัวระบุตำแหน่ง CSS มีรายละเอียดน้อยกว่าและอ่านง่ายกว่าและควรเป็นที่ต้องการมากกว่าตัวระบุตำแหน่ง XPath อย่างไรก็ตามอาจมีบางกรณีที่จำเป็นต้องใช้ตัวระบุตำแหน่ง XPath เนื่องจากตัวระบุตำแหน่ง CSS ไม่สามารถตัดมันได้
การเรียกใช้งาน JavaScript
องค์ประกอบบางอย่างต้องการการโต้ตอบของเมาส์ / คีย์บอร์ดมากกว่าปกติเนื่องจากการแสดงผลที่ซับซ้อนซึ่งดำเนินการโดย ExtJS ตัวอย่างเช่น Ext.form.CombBox ไม่ใช่<select>
องค์ประกอบจริง ๆแต่เป็นอินพุตข้อความที่มีรายการแบบเลื่อนลงแยกออกซึ่งอยู่ที่ด้านล่างของโครงสร้างเอกสาร ในการจำลองการเลือก ComboBox อย่างถูกต้องคุณสามารถจำลองการคลิกที่ลูกศรแบบเลื่อนลงก่อนจากนั้นจึงคลิกรายการที่ปรากฏขึ้น อย่างไรก็ตามการค้นหาองค์ประกอบเหล่านี้ผ่านตัวระบุตำแหน่ง CSS หรือ XPath อาจเป็นเรื่องยุ่งยาก อีกทางเลือกหนึ่งคือค้นหาคอมโพเนนต์ ComoBox และเรียกใช้วิธีการเพื่อจำลองการเลือก:
var combo = Ext.getCmp('genderComboBox');
combo.setValue('female');
combo.fireEvent('select');
ในซีลีเนียมrunScript
สามารถใช้คำสั่งเพื่อดำเนินการข้างต้นในรูปแบบที่กระชับยิ่งขึ้น:
with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
การรับมือกับ AJAX และการแสดงผลช้า
ซีลีเนียมมีรสชาติ "* AndWait" สำหรับคำสั่งทั้งหมดสำหรับการรอการโหลดหน้าเมื่อการดำเนินการของผู้ใช้ส่งผลให้เกิดการเปลี่ยนหน้าหรือโหลดซ้ำ อย่างไรก็ตามเนื่องจากการดึงข้อมูล AJAX ไม่เกี่ยวข้องกับการโหลดหน้าเว็บจริงจึงไม่สามารถใช้คำสั่งเหล่านี้ในการซิงโครไนซ์ได้ วิธีแก้ปัญหาคือการใช้ประโยชน์จากเบาะแสภาพเช่นการมี / ไม่มีตัวบ่งชี้ความคืบหน้า AJAX หรือการปรากฏของแถวในตารางส่วนประกอบเพิ่มเติมลิงก์ ฯลฯ ตัวอย่างเช่น:
Command: waitForElementNotPresent
Target: css=div:contains('Loading...')
บางครั้งองค์ประกอบจะปรากฏขึ้นหลังจากผ่านไประยะหนึ่งแล้วขึ้นอยู่กับว่า ExtJS แสดงผลคอมโพเนนต์เร็วเพียงใดหลังจากการกระทำของผู้ใช้ส่งผลให้มุมมองเปลี่ยนไป แทนที่จะใช้pause
คำสั่งอนุญาโตตุลาการวิธีที่ดีที่สุดคือรอจนกว่าองค์ประกอบที่น่าสนใจจะเข้ามาในความเข้าใจของเรา ตัวอย่างเช่นหากต้องการคลิกที่รายการหลังจากรอให้รายการนั้นปรากฏ:
Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')
การใช้การหยุดชั่วคราวโดยพลการไม่ใช่ความคิดที่ดีเนื่องจากความแตกต่างของเวลาซึ่งเป็นผลมาจากการเรียกใช้การทดสอบในเบราว์เซอร์ที่แตกต่างกันหรือในเครื่องต่าง ๆ จะทำให้กรณีทดสอบไม่สม่ำเสมอ
รายการที่ไม่สามารถคลิกได้
click
คำสั่งไม่สามารถเรียกใช้องค์ประกอบบางอย่างได้ เป็นเพราะตัวฟังเหตุการณ์อยู่บนคอนเทนเนอร์จริง ๆ โดยเฝ้าดูเหตุการณ์ของเมาส์ในองค์ประกอบลูกของมันซึ่งในที่สุดก็ส่งถึงผู้ปกครอง ตัวควบคุมแท็บเป็นตัวอย่างหนึ่ง ในการคลิกที่แท็บคุณต้องจำลองmouseDown
เหตุการณ์ที่ป้ายกำกับแท็บ:
Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0
การตรวจสอบฟิลด์
ช่องฟอร์ม (ส่วนประกอบ Ext.form. *) ที่เชื่อมโยงกับนิพจน์ทั่วไปหรือ vtypes สำหรับการตรวจสอบความถูกต้องจะทริกเกอร์การตรวจสอบความถูกต้องด้วยความล่าช้าบางอย่าง (ดูvalidationDelay
คุณสมบัติที่กำหนดเป็น 250ms ตามค่าเริ่มต้น) หลังจากผู้ใช้ป้อนข้อความหรือทันทีเมื่อฟิลด์สูญเสีย โฟกัส - หรือพร่ามัว (ดูvalidateOnDelay
คุณสมบัติ) ในการเรียกใช้การตรวจสอบความถูกต้องของฟิลด์หลังจากออกคำสั่ง type Selenium เพื่อป้อนข้อความภายในฟิลด์คุณต้องดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้:
ทริกเกอร์การตรวจสอบความถูกต้องล่าช้า
ExtJS เริ่มการทำงานของตัวจับเวลาการหน่วงเวลาการตรวจสอบเมื่อฟิลด์ได้รับเหตุการณ์คีย์อัพ ในการทริกเกอร์ตัวจับเวลานี้เพียงแค่ออกเหตุการณ์การคีย์ดัมมี่ (ไม่สำคัญว่าคุณจะใช้คีย์ใดเนื่องจาก ExtJS จะละเว้น) ตามด้วยการหยุดชั่วคราวสั้น ๆ ที่ยาวกว่า validationDelay:
Command: keyUp
Target: someTextArea
Value: x
Command: pause
Target: 500
ทริกเกอร์การตรวจสอบความถูกต้องทันที
คุณฉีดเหตุการณ์เบลอลงในช่องเพื่อเริ่มการตรวจสอบได้ทันที:
Command: runScript
Target: someComponent.nameTextField.fireEvent("blur")
กำลังตรวจสอบผลการตรวจสอบ
หลังจากการตรวจสอบความถูกต้องคุณสามารถตรวจสอบว่ามีหรือไม่มีฟิลด์ข้อผิดพลาด:
Command: verifyElementNotPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
Command: verifyElementPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
โปรดทราบว่าการตรวจสอบ "display: none" เป็นสิ่งที่จำเป็นเนื่องจากเมื่อช่องแสดงข้อผิดพลาดปรากฏขึ้นและจำเป็นต้องซ่อนไว้ ExtJS จะซ่อนช่องข้อผิดพลาดแทนที่จะลบออกจากโครงสร้าง DOM ทั้งหมด
เคล็ดลับเฉพาะองค์ประกอบ
การคลิกที่ปุ่มแบบฟอร์ม
การเลือกค่าจาก Ext.form.ComboBox
Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
ก่อนอื่นให้ตั้งค่าจากนั้นจึงยิงเหตุการณ์ที่เลือกอย่างชัดเจนในกรณีที่มีผู้สังเกตการณ์