2016-05-20 12 views
3

私の分度器テストでは、現在ログインしているユーザーのすべてのデータをリセットするエンドポイントにヒットしようとしています。今、普通の古いjavascriptを使ってbeforeAllでそのエンドポイントをヒットしていますが、正常にヒットしていますが、ページがリフレッシュされる前にテストが実行されているため、エラーが発生します。ここに私の現在のコードです:分度器HTTP GET要求

var EC = protractor.ExpectedConditions, 
    el = element(by.css('body div.modal-x')); 

browser.executeAsyncScript(function() { 
    var inj = angular.element(document.body).injector(); 
    var reHTTP = inj.get('reHTTP'); 
    var myService = inj.get('myService'); 
    var someVar = myService.getCurrent().definition.userName; 
    console.log(someVar); // works 
    reHTTP.get('/app/' + someVar + '/reset').then(function() { 
     // console.log('i am here'); // this works 
     // alert('Success!'); // this works 
     return browser.wait(EC.visibilityOf(el)); // this does not work 
    }); 
}); 

問題:私は今、ブラウザのコンテキストでだから私はそのexecuteScriptブロック内分度器機能を使用することはできません。はどのように適切にも(再び、私は現在beforeAllブロックでは、この機能を使用しています)このエンドポイントを叩きながら、私のExpectedConditionsを使用/アクセスできます。すなわちECは未定義

質問ありますか?

注意すべきいくつかのこと:

  • 私はbrowser.executeAsyncScriptを使用しない場合は、angularが定義されていないと私はサービスにアクセスすることはできません(または私は別の方法を見つけることができませんでした)
  • executeScriptを使用して(AsyncScriptではなく)は、非同期スクリプトよりも高速に失敗します

アイデアはありますか?

答えて

2

呼び出されるコールバック関数を期待してexecuteAsyncScript方法。リクエストが結果を返すと、あなたはそれを呼び出すことができます:

var EC = protractor.ExpectedConditions, 
    el = element(by.css('body div.modal-x')); 

browser.executeAsyncScript(function(callback) { 
    var inj = angular.element(document.body).injector(); 
    var reHTTP = inj.get('reHTTP'); 
    var myService = inj.get('myService'); 
    var someVar = myService.getCurrent().definition.userName; 
    console.log(someVar); // works 
    reHTTP.get('/app/' + someVar + '/reset').then(function() { 
     callback(); 
    }); 
}); 
browser.wait(EC.visibilityOf(el)); 
+0

ワウありがとう!それはとてもシンプルでしたが、何らかの理由で私は自分自身をコールバックと混同していました。私は質問を投稿する前に試してみましたが、正しく実装してはいけません... reHTTPが高次のものを呼び出すために自分のコールバックを必要とするのであれば混乱していたと思います。再度、感謝します。 – Gunderson

1

beforeEachafterEachでもお休みを利用しています。 beforeAll関数の先頭にbrowser.ignoreSynchronization = true;を使用して角度同期を解除し、スクリプトの後にbrowser.ignoreSynchronization = false;をリセットしてください。例えば

beforeEach(function() { 
    browser.ignoreSynchronization = true; 
    browser.executeAsyncScript(); 
    browser.ignoreSynchronization = false; 
});