2016-01-23 25 views
5

में तत्व विशेषता मान प्राप्त करें मैं एक प्रोटैक्टर परीक्षण लिख रहा हूं जिसे एक तत्व विशेषता के लिए एक खाली मूल्य होने का इंतजार करना है और फिर मैं उस मान को कॉलर फ़ंक्शन पर वापस करना चाहता हूं। यह अपेक्षा की तुलना में लिखना अधिक कठिन साबित हुआ है!प्रोटैक्टर

मैं तत्व विशेषता को गैर-खाली मान रखने के लिए प्रतीक्षा करने के लिए browser.wait() कमांड को सही ढंग से शेड्यूल करने में सक्षम हूं और मैंने सत्यापित किया है कि यह मान वास्तव में कॉलबैक फ़ंक्शन के अंदर आने की अपेक्षा कर रहा है, लेकिन कुछ के लिए कारण, मैं कॉलबैक फ़ंक्शन के बाहर और शेष टेस्ट कोड पर उस मान को वापस करने में सक्षम नहीं हूं।

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; 
} 

मैं बता सकता है कि निष्पादन के आदेश मैं इसे होने की उम्मीद के रूप में, क्योंकि जब मैं कॉलबैक फ़ंक्शन के अंदर console.log() कॉल uncomment, मैं देख नहीं है:

यहाँ कैसे मेरे कोड लगता है कि है अनुमानित मूल्य मुद्रित। हालांकि, test() फ़ंक्शन प्रिंट्स में एक ही कॉल 'अपरिभाषित' प्रिंट करता है।

यहां क्या हो रहा है? मैं क्या खो रहा हूँ? मैं कॉलबैक फ़ंक्शन से विशेषता मान को ठीक से कैसे प्राप्त कर सकता हूं?

मैं आपकी मदद की सराहना करता हूं।

उत्तर

9

मैं इंतजार और हो रही विशेषता भागों गठबंधन नहीं होगा - तार्किक इन दो अलग-अलग बातें हैं, रखने उन्हें अलग:

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); 
}); 

ध्यान दें कि, आप इंतजार हालत इस तरह से आसान बनाने में कर सकते हैं:

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); 
}); 

बस FYI करें, आप 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

धन्यवाद! कुछ मामूली सुधारों के साथ, आखिरी दृष्टिकोण मेरे मामले में काम करता है। मैं उम्मीद कर रहा था कि आइटम मूल्य सीधे कॉलर फ़ंक्शन पर वापस लौटने में सक्षम हो, लेकिन स्पष्ट रूप से यह अतुल्यकालिक कॉल में वादे के बारे में सोचने का सही तरीका नहीं है। अंतिम पंक्ति 'वापसी आइटम' प्रमोम होना चाहिए; '। – 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() और इस तरह से निष्पादन की सही क्रम की गारंटी है के साथ श्रृंखलित जा सकता है।

संबंधित मुद्दे