分度器の入力でgetTextする方法


105

分度器のドキュメントで、次の例を確認します。

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やオブジェクトではなく)空白の値を返し、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に潜在的に欠陥があると思いますか?

回答:


202

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

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

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

element.getAttribute('value')

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


ああ、探しも含めてどこを見てもいいと思った。そして、私は答えを見つけられなかったという理由で、今日これを分度器githubの問題として提起しました。わざわざ。私の要素はng-modelにバインドされているため、htmlには「ng-model = "risk.name"」が含まれています。しかし、それはそれを機能させるために必要なものではないかもしれません。getAttributeの使用を提案するようにdocoを更新することをお勧めします。
PaulL 2013

1
これを理解するのにあまりにも長い時間を費やしたので、後世のためにこれを追加します。getAttributeは実際にはストリングではなくプロミスを返します。github.com/angular/protractor/issues/673
Bordlamer

そしてこの魔法は、実際にはプロパティを取得するgetAttributeの動作(つまり、「value」属性がDOMに存在しない場合でも値を返す)のために機能すると思います:「...存在する場合、同じ名前のプロパティの値が返されます "
The Red Pea

6

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

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

    },

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

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


テキストを直接使用したい場合はそれを行う必要があることを理解していますが、ProtractorがJasmineの期待マッチャーがpromiseを処理するようにパッチを当てたので、expect(element.getText())。toEqualがelementと実質的に同じになるようにしました.getText()。then(expect(text).toEqual)。違いますか?
PaulL 2013

これも私にはうまくいきません。上記の質問を拡張して、これがフォーマットされていることを確認できます。
PaulL 2013

element(by.locator( 'abc')。getText()。then(function(text){console.log(text)expect(text).toEqual( "sometext");});を使用してみてください
vdrulerz

Object [object Object]にはメソッド「locator」がないと報告されています。'by.locator'の分度器apiにメソッドが表示されず、コードにもメソッドが表示されません。by.locatorメソッドがあった場合は、「by」のようなものになります。 locator( 'model'、 'risk.name') '?
PaulL 2013

by.locatorを使用すると、prot.findelement(By.id)、CSS、Xpath、または任意のロケーター属性などを使用できることを意味します...それでも機能しない場合は、plzでコードとhtml属性を共有してください...お手伝いします...
vdrulerz 2013

2

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

0

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

開始日:

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

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

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

0

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

                    });

-1

あなたはこのようなものを試すことができます

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

値を取得する場所でこの関数を呼び出すことができます。


-3

あなたはjQueryを使用してテキストボックスにテキストを取得できます(私にとってはうまくいきます)、画像の詳細をチェックインします

コード:

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

この上記のクエリをコードに挿入します。画像の詳細:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.