web-dev-qa-db-ja.com

分度器-次を実行する前に非同期の約束を待つ

まず第一に、私はすでにその点に関する様々な投稿やブログをチェックしました、そして私はまだそれを正しくする方法を理解することができません。

私は多くの異なる組み合わせを試しました:

  • ブラウザ待機
  • protractor.controlFlow()。execute
  • protractor.controlFlow()。await(

...それでも成功しません。

私の問題

BeforeEach関数内で、分度器のpromiseを呼び出し、それが解決されるのを待ってから、残りのコードを実行したいと思います。

マイコード

私は私を助けてくれる人のためにこの簡単なテストを用意しました

describe('testAsync', function() {

  beforeEach(function() {
    console.log('beforeEach - step 1 ')

    browser.get("https://angularjs.org/");
    console.log('beforeEach - step 2 ')
    testFunc()
    console.log('beforeEach - after testFunc - step 3')

  });

  var testFunc = function(){

    console.log("testFunc - step 1")

    browser.wait(function() {
      var deferred = protractor.promise.defer();
      element(by.id('Twitter-widget-1')).isPresent()
        .then(function (isPresent) {
          console.log("testFunc - step 2")
          deferred.fulfill(isPresent);
      });
      return deferred.promise;
    });

    console.log("testFunc - step 3")

  }

  it('test after BeforeEach', function() {
    console.log("Last trace")
  });

});

現在の出力

[launcher] Running 1 instances of WebDriver
beforeEach - step 1
beforeEach - step 2
testFunc - step 1
testFunc - step 3
beforeEach - after testFunc - step 3
testFunc - step 2
Last trace

期待される出力

[launcher] Running 1 instances of WebDriver
beforeEach - step 1
beforeEach - step 2
testFunc - step 1
testFunc - step 2 // <------  This is within the promise resolve
testFunc - step 3
beforeEach - after testFunc - step 3
Last trace
11
aorfevre

私はこれがあなたが望む出力を得ると思います:

describe('testAsync', function() {

  beforeEach(function() {
    console.log('beforeEach - step 1 ');

    // `get` implicitly registers a promise with the control flow
    browser.get("https://angularjs.org/");

    console.log('beforeEach - step 2 '); // runs "before" get above returns!

    testFunc().then(function() {
       // use a then to explicitly chain a dependency off a promise
       console.log('beforeEach - after testFunc - step 3');
    })

    protractor.promise.controlFlow().execute(function() {
       console.log('beforeEach - after testFunc, via controlFlow - step 4');
    });

    console.log('beforeEach - end of beforeEach - everything registered, nothing done');
  });

  var testFunc = function(){

    console.log("testFunc - step 1")

    // return browser wait promise to caller
    // `wait` also implicitly registers with the control flow
    return browser.wait(function() {
      return element(by.id('Twitter-widget-1')).isPresent()
        .then(function (isPresent) {
          console.log("testFunc - step 2")
          return true; // tell wait its done by resolving then promise->element promise->wait
      });
    });
  }

  it('test after BeforeEach', function() {
    console.log("Last trace")
  });

});
12
P.T.

testFunc内の2つのconsole.log(ステップ1と3)は、promiseにラップされていないため、関数を呼び出すとすぐに起動します。これはあなたの出力によって証明されています。次に、promise(これはうまく機能しているように見えます!)は、promiseが解決されたときに(ただし、ログがすでに実行された後に)ステップ2のログを返します。

したがって、これはあなたが望むことをしているように見えますか?つまりbeforeEachは、最初の仕様に達する前に非同期関数を起動しているように見えます。

0
Brine