Cách lấy getText trên một đầu vào trong thước đo góc


105

Trong tài liệu về thước đo góc, tôi thấy ví dụ sau:

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

Điều rõ ràng ở đây là bạn có thể sử dụng "by.model" để đặt giá trị trong hộp nhập liệu, nhưng nếu bạn muốn nhìn vào hộp nhập liệu và xem có gì trong đó, bạn cần sử dụng "by.binding".

Tôi có một bộ mã trong đó (tóm lại) tôi làm:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');

(trong mã thực của mình, tôi lưu thực thể sau đó quay lại nó ở chế độ chỉnh sửa và tôi đang kiểm tra giá trị của mình đã thực sự được lưu chưa. Nhưng nó vẫn diễn ra như cũ và mã mẫu này đưa ra cùng một vấn đề).

Điều này mang lại cho tôi một lỗi:

Error: Expected '' to equal 'A value'.

Về lý thuyết, làm theo ví dụ từ tài liệu, thay vào đó tôi có thể làm:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');

Nhưng by.binding dường như không thích mô hình đủ điều kiện, tôi gặp lỗi:

Error: No element found using locator: by.binding("risk.name")

Nó hoạt động (sau một thời trang) nếu tôi làm:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');

Điều này tìm thấy một phần tử, nhưng cũng đưa ra cảnh báo rằng tôi có nhiều phần tử khớp với 'name'. Và tiếc là cái nó chọn không phải là cái đúng.

Vì vậy, hai câu hỏi:

  1. Liệu by.model có thể trả về getText () hay có một quyết định thiết kế rằng nó không làm điều đó và chúng ta cần sử dụng by.binding thay thế?
  2. Liệu tôi có thể sử dụng một thực thể đủ điều kiện trong by.binding hay có một quyết định thiết kế mà by.binding không thích tên model đầy đủ? Nếu vậy, tôi có thể sử dụng định tính nào khác để chọn giữa các ràng buộc khác nhau của mình?

BIÊN TẬP:

Tôi cũng đã thử giải pháp do vdrulerz đề xuất, tôi đã sửa đổi mã như sau:

element(by.model('risk.name')).getText().then(function(text) {
  console.log(text);
  expect(text).toEqual('A risk name');  
});

Console.log đang trả về một giá trị trống (không phải là một lời hứa hoặc một đối tượng) và mong đợi không đưa ra thông báo:

Expected '' to equal 'A risk name'.

Sự hiểu biết của tôi là thước đo góc đã vá lỗi mong đợi để xử lý lời hứa, vì vậy tôi cảm thấy rằng vấn đề cơ bản là getText không hoạt động trên một trường được xác định thông qua một mô hình (tôi có thể getText thành công trên nhãn và các tiện ích con khác).

Tôi cũng có thể chạy mã sau, sử dụng getAttribute thay vì 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');  
});

Phần đầu tiên trôi qua - mong đợi hoạt động. Phần thứ hai cũng hoạt động, cho thấy rằng cú pháp vdrulerz 'cũng hợp lệ và nó ghi' true 'vào bảng điều khiển. Tôi nghĩ rằng có thể có một khiếm khuyết với getText?

Câu trả lời:


202

Điều này được trả lời trong Câu hỏi thường gặp về thước đo góc: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- trống

Kết quả của getText từ một phần tử đầu vào luôn trống

Đây là một điều kỳ quặc trên webdriver. và các phần tử luôn có giá trị getText trống. Thay vào đó, hãy thử:

element.getAttribute('value')

Đối với câu hỏi 2, có, bạn sẽ có thể sử dụng một tên đủ điều kiện cho by.binding. Tôi nghi ngờ rằng mẫu của bạn không thực sự có một phần tử được liên kết với risk.name qua {{}} hoặc ng-bind.


Ah, tôi nghĩ tôi đã tìm khắp mọi nơi, kể cả tìm kiếm nó. Và tôi vừa nêu vấn đề này như một vấn đề trong github thước đo góc ngày hôm nay trên cơ sở tôi chưa tìm ra câu trả lời. Làm phiền. Phần tử của tôi được liên kết với ng-model, vì vậy nó có "ng-model =" risk.name "" trong html. Nhưng đó có thể không phải là những gì cần thiết để làm cho nó hoạt động. Tôi đề nghị cập nhật doco để đề xuất sử dụng getAttribute.
PaulL

1
Thêm điều này cho hậu thế vì tôi vừa mất quá nhiều thời gian để tìm ra điều này: getAttribute thực sự trả về một lời hứa chứ không phải một chuỗi. github.com/angular/protractor/issues/673
dirtylamer

Và tôi nghĩ phép thuật này hoạt động nhờ hành vi của getAttribute, thực sự sẽ nhận được một thuộc tính (tức là điều này sẽ trả về một giá trị ngay cả khi không có thuộc tính "value" nào trong DOM của bạn): "..., trừ khi thuộc tính đó không phải hiện tại, trong trường hợp đó giá trị của tài sản có cùng tên sẽ được trả lại "
The Red Pea

6

getText() hàm sẽ không hoạt động giống như cách nó từng làm cho webdriver, để làm cho nó hoạt động với thước đo góc, bạn sẽ cần phải bọc nó trong một hàm và trả về văn bản giống như chúng ta đã làm cho khuôn khổ thước đo góc của chúng ta, chúng tôi đã giữ nó trong một chức năng phổ biến như -

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

    },

Bằng cách này, bạn có thể có văn bản của một phần tử.

Hãy cho tôi biết nếu nó vẫn chưa rõ ràng.


Tôi hiểu rằng tôi cần phải làm điều đó nếu tôi muốn sử dụng văn bản trực tiếp, nhưng tôi nghĩ rằng thước đo góc vá Jasmine mong đợi những người so khớp sẽ xử lý lời hứa - vì vậy mong đợi đó (element.getText ()). ToEqual cũng giống như element .getText (). then (mong đợi (văn bản) .toEqual). Điều đó không chính xác?
PaulL

Điều này cũng không làm việc cho tôi. Tôi đã mở rộng câu hỏi của mình ở trên để bạn có thể thấy nó được định dạng.
PaulL

cố gắng sử dụng phần tử (by.locator ('abc'). getText (). then (function (text) {console.log (text) hope (text) .toEqual ("sometext");});
vdrulerz

Nó báo cáo rằng Đối tượng [đối tượng Đối tượng] không có phương thức 'định vị'. Tôi không thấy một phương thức nào trong api thước đo góc của 'by.locator' và tôi cũng không thể thấy một phương thức nào trong mã - và chắc chắn nếu có một phương thức by.locator thì nó sẽ giống như 'by. định vị ('model', 'risk.name') '?
PaulL

với by.locator, tôi có nghĩa là bạn có thể sử dụng một cái gì đó như prot.findelement (By.id), CSS, Xpath hoặc bất kỳ thuộc tính định vị nào .... nếu nó vẫn không hoạt động, xin hãy chia sẻ mã của bạn và các thuộc tính html với tôi ... chắc chắn sẽ giúp bạn ra ngoài ...
vdrulerz

2

Tôi gặp sự cố này, tôi đã thử giải pháp của Jmr nhưng nó không hiệu quả với tôi. Vì tất cả các trường đầu vào đều có thuộc tính ng-model, tôi có thể kéo thuộc tính đó và đánh giá nó và nhận giá trị.

HTML

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

Thước đo góc

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

0

Mã này hoạt động. Tôi có một trường nhập ngày tháng đã được đặt thành chỉ đọc buộc người dùng phải chọn từ lịch.

cho một ngày bắt đầu:

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

cho một ngày kết thúc:

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

mã dưới đây phù hợp với tôi, để lấy văn bản từ đầu vào

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))

0

Bạn phải sử dụng Promise để in hoặc lưu trữ các giá trị của phần tử.

 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

Bạn có thể thử một cái gì đó như thế này

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

Hơn bạn có thể gọi hàm này ở nơi bạn muốn nhận giá trị ..


-3

Bạn có thể sử dụng jQuery để lấy văn bản trong hộp văn bản (hoạt động tốt đối với tôi), kiểm tra chi tiết hình ảnh

Mã:

$(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()

Đưa truy vấn trên này vào mã của bạn. Chi tiết hình ảnh:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.