分度器のドキュメントには、次の例があります。
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つの質問:
編集:
また、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に潜在的な欠陥があると思いますか?
これは分度器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にバインドされている要素がないと思われます。
getText()
関数はwebdriverのようには機能しません。分度器で機能させるには、関数でラップして分度器フレームワークで行ったようなテキストを返す必要があります。のような一般的な機能でそれを保持しています-
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
これにより、要素のテキストを持つことができます。
まだ不明な場合はお知らせください。
私はこの問題を抱えていましたが、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
要素の値を印刷または保存するには、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
});
このコードは機能します。ユーザーにカレンダーからの選択を強制する読み取り専用に設定された日付入力フィールドがあります。
開始日:
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);
以下のコードは、入力からテキストを取得するために私のために機能します
return(this.webelement.getAttribute('value').then(function(text)
{
console.log("--------" + text);
}))