112

分度器のドキュメントでは、次の例を参照してください。

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

これは要素を見つけますが、「名前」に一致する要素が複数あるという警告も出します。残念ながら、それが選択するものは正しいものではありません。

だから、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 またはオブジェクトではない) を返し、expect は失敗して次のメッセージが表示されます。

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 に欠陥がある可能性があると思いますか?

4

8 に答える 8

219

これは分度器 FAQ で回答されています: 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 に完全修飾名を使用できるはずです。あなたのテンプレートには、{{}} または ng-bind を介して risk.name にバインドされた要素が実際には含まれていないと思われます。

于 2013-12-04T22:10:33.207 に答える
6

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

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

    },

これにより、要素のテキストを取得できます。

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

于 2013-12-03T12:31:40.837 に答える