2016-01-23 16 views
5

要素属性が空でない値を持つのを待たなければならない分度器テストを作成していて、その値を呼び出し元関数に戻したいとします。これは私が予想した以上に書くのが難しいことが分かっています!分度器の要素属性値を取得する

browser.wait()コマンドを正しくスケジュールして、要素の属性が空でない値を待つことができました。この値が実際にコールバック関数内に入ると予想されていることが確認されていますが、理由は、私はコールバック関数の外で、テストコードの残りの部分にその値を返すことができません。私は、実行の順序は、私は、コールバック関数内console.log()呼び出しのコメントを解除したときに、私が見るので、私は、それがあることを期待していないことを伝えることができ

function test() { 
    var item = getItem(); 
    console.log(item); 
} 

function getItem() { 
    var item; 
    browser.wait(function() { 
     return element(by.id('element-id')).getAttribute('attribute-name').then(function(value) { 
      item = value; 
      // console.log(item); 
      return value !== ''; 
     }); 
    }); 
    return item; 
} 

:ここ

は次のように私のコードがどのように見えるかです期待値が印刷されます。ただし、test()関数の同じ呼び出しが「未定義」を出力します。

ここでは何が起こっていますか?私は何が欠けていますか?コールバック関数から属性値を正しく取得するにはどうすればよいですか?

ご協力いただきありがとうございます。

答えて

9

私は待機となった属性の部品を組み合わせないだろう - 論理的にこれらの2つの別々のものです、を分離し、それらを保つ:あなたは、待機状態をこのように単純化する可能性があること

browser.wait(function() { 
    return element(by.id('element-id')).getAttribute("attribute").then(function(value) { 
     item = value; 
     // console.log(item); 
     return value !== ''; 
    }); 
}); 

element(by.id('element-id')).getAttribute("attribute").then(function (value) { 
    console.log(value); 
}); 

注:

をただ、FYI
var EC = protractor.ExpectedConditions; 
var elm = $('#element-id[attribute="expected value"]'); 

browser.wait(EC.presenceOf(elm), 5000); 
elm.getAttribute("attribute").then(function (value) { 
    console.log(value); 
}); 

、あなたはdeferredとあなたの現在の問題を解決したことがあります。

function test() { 
    getItem().then(function (value) { 
     console.log(value); 
    }); 
} 

function getItem() { 
    var item = protractor.promise.defer(); 
    browser.wait(function() { 
     return element(by.id('element-id')).getAttribute('attribute').then(function(value) { 
      var result = value !== ''; 
      if (result) { 
       item.fulfill(value); 
      } 
      return result; 
     }); 
    }); 
    return item.promise; 
} 
+1

ありがとうございます!マイナーな修正を加えれば、私の場合は最後のアプローチが有効です。私は項目値を呼び出し側関数に直接返すことができるようにしたいと考えていましたが、非同期呼び出しの約束については、これは正しい考え方ではないようです。最後の行は 'return item.promise;'でなければなりません。 – exbuddha

1

は分度器は、制御フローとそれらを登録/約束とスケジュールでどのように機能するかについてのいくつかのより多くの読み取りを行った後、私は簡単に仕事の周囲に設けられた第一溶液の@alecxeに近いを見つけました。ここではそれが行く:

function test() { 
    var item = getItem().then(function(item) { 
    console.log(item); 
    }); 
} 

function getItem() { 
    return browser.wait(function() { 
    return element(by.id('element-id')).getAttribute('attribute-name').then(function(value) { 
     return value; 
    }); 
    }); 
} 

browser.wait()が約束自体を返すので、それは、発信者と実行の正しい順序が保証されている。この方法の内側に別のthen()を連鎖させることができます。

関連する問題