2017-05-03 42 views
0

爲夜服測試編寫custom command在夜服自定義命令中分配值後,變量返回undefined

爲什麼我不能在下面的代碼片段中設置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

我發現這捕獲在這個方式Nightwatch的文檔頁面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; 
};