1. ホーム
  2. angularjs

[解決済み] 分度器で入力のテキストを取得する方法

2022-09-20 20:25:59

質問

protractor のドキュメントに、以下のような例があります。

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'.

理論的には、docsからの例に従って、私は代わりに行うことができます。

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が完全なモデル名を好まないという設計上の決定があるのでしょうか? もしそうなら、異なるバインディングを選択するために、他にどのような修飾語を使用することができますか?

EDIT。

vdrulerzさんが提案された解決策も試しましたが、以下のようにコードを修正しました。

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

console.logは空白の値(プロミスでもオブジェクトでもない)を返しており、expectはメッセージを与えて失敗しています。

Expected '' to equal 'A risk name'.

私の理解では、protractorはすでにexpectにパッチを当ててプロミスを処理しているので、根本的な問題はモデル経由で識別されたフィールドで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');  
});

最初の部分はパスします - expectが動作します。 2番目の部分も動作し、vdrulerzの構文も有効であることを示唆しており、コンソールに'true'を記録しています。 私は、getTextに潜在的な欠陥があると思います。

どのように解決するのですか?

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

input要素からgetTextを実行した結果は常に空です。

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

element.getAttribute('value')

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