5

(私はこのSOの議論を見たことがありますが、それを私のケースに適用する方法がわからなかったので、新しい質問をしています。重複していないことを願っています)

Cucumber.js で分度器を使用して Angular で記述されたフォームをテストしています。

そこで私がやりたいのは、Protractor にフィールドのタイトル (リンク) をクリックするように指示し、そのフィールドが表示されたらテキストを入力し、次のフィールドのタイトルに移動することです。等々。

キュウリでの私のステップは次のとおりです。

When I fill the form with the following data
    | field            | content           |
    | First Name       | John              |
    | Last Name        | Doe               |
    | Address          | Some test address |
# and so forth

以下は、ステップ定義に対する中途半端な試みです。

this.When(/^I fill the form with the following data$/, function (table, callback) {
    data = table.hashes();
    # that gives me an array of objects such as this one:
    # [ { field: 'First Name', content: 'John' },...]

    for (var i = 0; i < data.length; i++){
        var el = element(by.cssContainingText('#my-form a', data[i].field));
          el.click().then(function(){
                var fieldEl = el.element(by.xpath("../.."))
                    .element(by.css('textarea'));
                fieldEl.sendKeys(data[i].content);
            });
        }
    };
    callback();
});

しかし、もちろん、これは機能しません。Protractor がフィールド名をクリックして必要なデータをフィールドに入力する前に、コールバック関数が呼び出され、Cucumber が次のステップに移動するためです。

私の質問は、Cucumber.js で Protractor を使用して、Cucumber テーブルで定義されたデータをフォーム フィールドに挿入する手順をどのように記述できるかということです。これは for ループを使用して実現可能ですか?

4

1 に答える 1

4

ループは約束をキューに入れているため、「クリック」またはキーの送信が発生する前にループが終了します。callbackすべての promise が解決された後に呼び出す必要があります。

私は2つの解決策を見ています(私は思う)。配列内の約束を追跡し、protractor.promise.all( http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/を参照) を使用して、約束の配列が完了するのを待つことができます。 . 最初に promise をvar promises = []配列に保存します。

var p = el.click().then(function(){ ... });
promises.push(p)

次に、ループの外側:

protractor.promise.all(promises).then(callback);

または、ControlFlow を利用してループ内で promise の順序を維持し、ループの最後の反復でコールバックを呼び出すことができます。

var p = fieldEl.sendKeys(data[i].content);
if (i === data.length - 1) { // beware: you want to check "i" inside the loop and not in a promise created in the loop.
     p.then(callback);
}

反対のすべてのテキストにもかかわらず、これらのいずれかが機能することを約束することはできません. うまくいけば、彼らは少なくともあなたを正しい方向に向けます.

于 2015-04-26T07:07:27.150 に答える