วิธี getText บนอินพุตในไม้โปรแทรกเตอร์


105

ในเอกสารสำหรับไม้โปรแทรกเตอร์ฉันเห็นตัวอย่างต่อไปนี้:

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');

สิ่งนี้พบองค์ประกอบ แต่ยังให้คำเตือนว่าฉันมีองค์ประกอบมากกว่าหนึ่งรายการที่ตรงกับ "ชื่อ" และน่าเสียดายที่คนที่เลือกไม่ใช่คนที่ใช่

ดังนั้นสองคำถาม:

  1. by.model ควรสามารถส่งคืน getText () ได้หรือมีการตัดสินใจในการออกแบบว่าไม่ทำเช่นนั้นและเราจำเป็นต้องใช้ by.binding แทน?
  2. ฉันควรจะใช้เอนทิตีที่มีคุณสมบัติครบถ้วนใน 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?

คำตอบ:


203

มีคำตอบในคำถามที่พบบ่อยของ Protractor: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- ว่างเปล่า

ผลลัพธ์ของ getText จากองค์ประกอบอินพุตจะว่างเปล่าเสมอ

นี่คือมุมมองของ Webdriver และองค์ประกอบจะมีค่า getText ว่างเสมอ ให้ลอง:

element.getAttribute('value')

สำหรับคำถามที่ 2 ใช่คุณควรใช้ชื่อแบบเต็มสำหรับ by.binding ฉันสงสัยว่าแม่แบบของคุณไม่มีองค์ประกอบที่ผูกไว้กับ risk.name ผ่านทาง {{}} หรือ ng-bind


อ่าฉันคิดว่าฉันมองหาทุกที่รวมทั้งค้นหาด้วย และฉันเพิ่งหยิบยกเรื่องนี้มาเป็นปัญหาในจีทูบไม้โปรแทรกเตอร์ในวันนี้บนพื้นฐานที่ฉันไม่พบคำตอบ รำคาญ. องค์ประกอบของฉันถูกผูกไว้กับ ng-model ดังนั้นจึงมี "ng-model =" risk.name "" ใน html แต่นั่นอาจไม่ใช่สิ่งที่จำเป็นในการทำให้มันใช้งานได้ ฉันจะแนะนำให้อัปเดต doco เพื่อแนะนำให้ใช้ getAttribute
PaulL

1
การเพิ่มสิ่งนี้สำหรับลูกหลานเนื่องจากฉันใช้เวลานานเกินไปในการหาสิ่งนี้: getAttribute ส่งคืนคำสัญญาไม่ใช่สตริง github.com/angular/protractor/issues/673
boredlamer

และฉันคิดว่าเวทมนตร์นี้ใช้ได้ผลเนื่องจากพฤติกรรมของ getAttribute ซึ่งจะได้รับคุณสมบัติจริง (กล่าวคือจะส่งคืนค่าแม้ว่าจะไม่มีแอตทริบิวต์ "value" อยู่ใน DOM ของคุณก็ตาม): "... เว้นแต่แอตทริบิวต์นั้นจะไม่ ปัจจุบันซึ่งในกรณีนี้จะมีการส่งคืนมูลค่าของทรัพย์สินที่มีชื่อเดียวกัน "
The Red Pea

6

getText() ฟังก์ชันจะไม่ทำงานเหมือนที่เคยเป็นสำหรับ webdriver เพื่อให้สามารถใช้งานได้กับไม้โปรแทรกเตอร์คุณจะต้องห่อมันในฟังก์ชันและส่งคืนข้อความบางอย่างเหมือนกับที่เราทำสำหรับกรอบไม้โปรแทรกเตอร์ของเราที่เราเก็บไว้ใน ฟังก์ชั่นทั่วไปเช่น -

getText : function(element, callback) {
        element.getText().then (function(text){             
            callback(text);
         });        

    },

ด้วยวิธีนี้คุณสามารถมีข้อความขององค์ประกอบ

โปรดแจ้งให้เราทราบหากยังไม่ชัดเจน


ฉันเข้าใจว่าฉันต้องทำเช่นนั้นถ้าฉันต้องการใช้ข้อความโดยตรง แต่ฉันคิดว่าไม้โปรแทรกเตอร์ติดตั้งจัสมินคาดหวังให้นักจับคู่จัดการกับคำสัญญา - ดังนั้นการคาดหวัง (element.getText ()) toEqual นั้นมีประสิทธิภาพเหมือนกับองค์ประกอบ .getText () แล้ว (คาดว่า (ข้อความ) .toEqual) ที่ไม่ถูกต้อง?
PaulL

สิ่งนี้ยังไม่ได้ผลสำหรับฉัน ฉันได้ขยายคำถามของฉันไว้ด้านบนเพื่อให้คุณเห็นรูปแบบนี้
PaulL

พยายามใช้องค์ประกอบ (by.locator ('abc'). getText () แล้ว (ฟังก์ชัน (ข้อความ) {console.log (ข้อความ) คาดว่า (ข้อความ) .toEqual ("บางส่วน");});
vdrulerz

รายงานว่า Object [วัตถุวัตถุ] ไม่มีเมธอด 'locator' ฉันไม่เห็นเมธอดใน api ไม้โปรแทรกเตอร์ของ 'by.locator' และฉันไม่เห็นวิธีใดวิธีหนึ่งในโค้ดด้วย - และแน่นอนว่าถ้ามีเมธอด by.locator มันก็จะเป็นแบบ 'by ตัวระบุตำแหน่ง ('model', 'risk.name') '?
PaulL

ด้วย by.locator ฉันหมายความว่าคุณสามารถใช้บางอย่างเช่น prot.findelement (By.id), CSS, Xpath หรือแอตทริบิวต์ locator ใด ๆ .... หากยังใช้งานไม่ได้โปรดแชร์รหัสและแอตทริบิวต์ html ของคุณกับฉัน ... จะแน่นอน ช่วยคุณด้วย ...
vdrulerz

2

ฉันมีปัญหานี้ฉันลองวิธีแก้ปัญหาของ Jmr แต่มันไม่ได้ผลสำหรับฉัน เนื่องจากช่องป้อนข้อมูลทั้งหมดมีแอตทริบิวต์ ng-model ฉันจึงสามารถดึงแอตทริบิวต์และประเมินและรับค่าได้

HTML

<input ng-model="qty" type="number">

ไม้โปรแทรกเตอร์

var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10

0

รหัสนี้ใช้งานได้ ฉันมีช่องป้อนวันที่ที่ถูกตั้งค่าให้อ่านเท่านั้นซึ่งบังคับให้ผู้ใช้เลือกจากปฏิทิน

สำหรับวันที่เริ่มต้น:

var updateInput = "var input = document.getElementById('startDateInput');" +
    "input.value = '18-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent..searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);

สำหรับวันที่สิ้นสุด:

var updateInput = "var input = document.getElementById('endDateInput');" +
    "input.value = '22-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent.searchForm[input.name].$setViewValue(input.value);})";
    browser.executeScript(updateInput);


0

คุณต้องใช้ Promise เพื่อพิมพ์หรือเก็บค่าขององค์ประกอบ

 var ExpectedValue:string ="AllTestings.com";
          element(by.id("xyz")).getAttribute("value").then(function (Text) {

                        expect(Text.trim()).toEqual("ExpectedValue", "Wrong page navigated");//Assertion
        console.log("Text");//Print here in Console

                    });

-1

คุณสามารถลองสิ่งนี้

var access_token = driver.findElement(webdriver.By.name("AccToken"))

        var access_token_getTextFunction = function() {
            access_token.getText().then(function(value) {
                console.log(value);
                return value;
            });
        }

กว่าจะเรียกใช้ฟังก์ชันนี้ได้ในที่ที่คุณต้องการรับค่า ..


-3

คุณสามารถใช้ jQuery เพื่อรับข้อความในกล่องข้อความ (ทำงานได้ดีสำหรับฉัน) ตรวจสอบรายละเอียดภาพ

รหัส:

$(document.evaluate( "xpath" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

Example: 
$(document.evaluate( "//*[@id='mail']" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

ใส่ข้อความค้นหาข้างต้นนี้ลงในโค้ดของคุณ รายละเอียดภาพ:

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.