ในเอกสารสำหรับไม้โปรแทรกเตอร์ฉันเห็นตัวอย่างต่อไปนี้:
describe('by model', function() {
it('should find an element by text input model', function() {
var username = element(by.model('username'));
username.clear();
username.sendKeys('Jane Doe');
var name = element(by.binding('username'));
expect(name.getText()).toEqual('Jane Doe');
});
สิ่งที่ปรากฏชัดเจนที่นี่คือคุณสามารถใช้ "by.model" เพื่อกำหนดค่าในช่องป้อนข้อมูล แต่ถ้าคุณต้องการดูที่ช่องป้อนข้อมูลและดูว่ามีอะไรอยู่คุณต้องใช้ "by.binding"
ฉันมีชุดรหัสที่ (โดยสรุป) ฉันทำ:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(ในรหัสจริงของฉันฉันบันทึกเอนทิตีจากนั้นกลับมาที่โหมดแก้ไขและฉันกำลังตรวจสอบว่าค่าของฉันถูกบันทึกจริง แต่มันก็ยังคงเดือดเหมือนเดิมและโค้ดตัวอย่างนี้ก็ให้ปัญหาเดียวกัน)
สิ่งนี้ทำให้ฉันมีข้อผิดพลาด:
Error: Expected '' to equal 'A value'.
ในทางทฤษฎีตามตัวอย่างจากเอกสารฉันสามารถทำได้:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
แต่ by.binding ดูเหมือนจะไม่ชอบโมเดลที่มีคุณสมบัติครบถ้วนฉันได้รับข้อผิดพลาด:
Error: No element found using locator: by.binding("risk.name")
มันใช้งานได้ (หลังแฟชั่น) ถ้าฉันทำ:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
สิ่งนี้พบองค์ประกอบ แต่ยังให้คำเตือนว่าฉันมีองค์ประกอบมากกว่าหนึ่งรายการที่ตรงกับ "ชื่อ" และน่าเสียดายที่คนที่เลือกไม่ใช่คนที่ใช่
ดังนั้นสองคำถาม:
- by.model ควรสามารถส่งคืน getText () ได้หรือมีการตัดสินใจในการออกแบบว่าไม่ทำเช่นนั้นและเราจำเป็นต้องใช้ by.binding แทน?
- ฉันควรจะใช้เอนทิตีที่มีคุณสมบัติครบถ้วนใน by.binding ได้หรือไม่หรือมีการตัดสินใจในการออกแบบที่ by.binding ไม่ชอบชื่อรุ่นเต็ม? ถ้าเป็นเช่นนั้นฉันสามารถใช้คุณสมบัติอื่นใดเพื่อเลือกระหว่างการเชื่อมโยงที่แตกต่างกันได้
แก้ไข:
ฉันได้ลองวิธีแก้ปัญหาที่แนะนำโดย vdrulerz แล้วฉันแก้ไขโค้ดดังนี้:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
console.log ส่งคืนค่าว่าง (ไม่ใช่คำสัญญาหรือวัตถุ) และสิ่งที่คาดหวังล้มเหลวในการให้ข้อความ:
Expected '' to equal 'A risk name'.
ความเข้าใจของฉันคือไม้โปรแทรกเตอร์ได้แก้ไขความคาดหวังที่จะจัดการกับสัญญาแล้วดังนั้นฉันรู้สึกว่าปัญหาพื้นฐานคือ getText ไม่ทำงานบนฟิลด์ที่ระบุผ่านโมเดล (ฉันสามารถ getText บนป้ายกำกับและวิดเจ็ตอื่น ๆ ได้สำเร็จ)
ฉันยังสามารถเรียกใช้รหัสต่อไปนี้โดยใช้ getAttribute แทน getText ():
expect(element(by.model('risk.name')).getAttribute('autofocus')).toEqual('true');
element(by.model('risk.name')).getAttribute('autofocus').then(function(text) {
console.log(text);
expect(text).toEqual('true');
});
ส่วนแรกผ่านไป - ความคาดหวังได้ผล ส่วนที่สองยังใช้งานได้โดยแนะนำว่าไวยากรณ์ของ vdrulerz ก็ใช้ได้เช่นกันและจะบันทึก 'true' ลงในคอนโซล ฉันคิดว่าอาจมีข้อบกพร่องกับ getText?