2017-05-03 20 views
0

夜間テストのためにcustom commandを書きます。nightwatchカスタムコマンドで値を割り当てた後、変数が未定義に戻ります

newValidFromTextの値を次のコードスニペットに設定できないのはなぜですか?あなたは、視認性のゾーンのうち、あなたの変数を尋ねたので

exports.command = function() { 

var newValidFromText; //Want to set value to this variable 

var browser= this; 
browser 
    .useCss() 
    .perform(function() { 

     //Setting the value to the variable 'newValidFromText' 
     newValidFromText = "June 1, 2017 " 

     //Testing the value set - console prints "June 1, 2017" 
     console.log("newValidFromText now is: "+ newValidFromText); 
    }) 

    .waitForElementVisible('input[id*="SubscriptionStart"]') 

    //Test for correct value - getting validFromText = undefined 
    .verify.valueContains('input[id*="SubscriptionStart"]', validFromText) 
return browser.useCss(); 
}; 

答えて

1

私はナイトウォッチのドキュメントのページでこれを見つけたテストは 実行されるまで、このように撮影しUnderstanding the Command Queue.

値も使用できません。コールバックでは、テストケース関数 本体のすべてのコードがすでに解決されており、他のコードが実行される唯一の場所は 以外のコールバックです。 が、これはうまくいくかもしれないと思うことが簡単にできるので、これは心に留めておくことが重要です。

// incorrect usage of a callback value 

var text; 
browser 
    .getValue('#input', function (result) { 
    text = result.value; 
    }) 
    .setValue('#output', text); // WRONG: text is undefined 

ここでの問題は、setValueの()呼び出しは、メインのテスト ケース関数呼び出しで起こるということです、テキストがまだあるときにコールバックが呼び出される前に は未定義です。 setValue()は、テキストの正しい値を持つためには、それが 内で呼び出される、または後しばらくしなければならない、のgetText()コールバック:

1

exports.command = function() { 

var newValidFromText; //Want to set value to this variable 

var browser= this; 
browser 
.useCss() 
.perform(function() { 

    //Setting the value to the variable 'newValidFromText' 
    newValidFromText = "June 1, 2017 " 

    //Testing the value set - console prints "June 1, 2017" 
    console.log("newValidFromText now is: "+ newValidFromText); 

this.waitForElementVisible('input[id*="SubscriptionStart"]') 

    .verify.valueContains('input[id*="SubscriptionStart"]', validFromText); 

}) 

};

+0

私はこの解決策に同意します。しかし、私はこれの内部を知りたいです。 – daredadevil

+0

あなたの答えは、コールバックから取得したデータの価値を使用するために従うものですが、私はそれがなぜそのような理由に興味がありましたか?私には、[ドキュメントから見つけたもの](http://stackoverflow.com/a/43786411/2605210)にその理由が説明されています。 – daredadevil

0

しかし、あなたはそのためにカスタムメソッドを使用することができますし、それは次のようになります完璧な。

customTitle: function() { 

var application = this.waitForElementPresent('@selector') 
....do something; 
return application; 
}, 

you: function() { 

...code 
.customTitle(); 
return you; 
}; 
関連する問題