web-dev-qa-db-ja.com

分度器の入力でテキストを取得する方法

分度器のドキュメントには、次の例があります。

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

これにより要素が検出されますが、「name」に一致する要素が複数あるという警告も表示されます。残念ながら、それが選ぶものは正しいものではありません。

したがって、2つの質問:

  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が空の値(promiseまたはオブジェクトではない)を返しているため、メッセージを表示するのに失敗します:

Expected '' to equal 'A risk name'.

私の理解では、分度器はすでに約束を処理する期待にパッチを当てているので、根本的な問題はモデルによって識別されたフィールドでgetTextが機能しないことだと感じています(ラベルや他のウィジェットでgetTextを成功させることができます)。

GetText()ではなくgetAttributeを使用して、次のコードを実行することもできます。

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

最初の部分はパスします-期待通りです。 2番目の部分も機能し、vdrulerzの構文も有効であり、コンソールに「true」を記録します。 getTextに潜在的な欠陥があると思いますか?

93
PaulL

これは分度器FAQで回答されています: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element- is-always-empty

入力要素からのgetTextの結果は常に空です

これはwebdriverの癖です。要素には常に空のgetText値があります。代わりに、試してください:

element.getAttribute('value')

質問2については、はい、by.bindingに完全修飾名を使用できるはずです。テンプレートには、実際には{{}}またはng-bindを介してrisk.nameにバインドされている要素がないと思われます。

182
Jmr

getText()関数はwebdriverのようには機能しません。分度器で機能させるには、関数でラップして分度器フレームワークで行ったようなテキストを返す必要があります。のような一般的な機能でそれを保持しています-

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

    },

これにより、要素のテキストを持つことができます。

まだ不明な場合はお知らせください。

5
vdrulerz

私はこの問題を抱えていましたが、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
2
Michael Warner

要素の値を印刷または保存するには、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

                    });
0
P Mishra

このコードは機能します。ユーザーにカレンダーからの選択を強制する読み取り専用に設定された日付入力フィールドがあります。

開始日:

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
user5817055

以下のコードは、入力からテキストを取得するために私のために機能します

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