2014-09-30 103 views
8

在我的測試中,我需要檢查所有預期值是否存在於選擇框中。我花了一段時間,但我終於創造了這個輔助函數:量角器獲取所有選擇框(選項)值

function getSelectValues(elementFinder) 
{ 
    var defer = protractor.promise.defer(), 
     promise = defer.promise; 

    elementFinder.all(by.tagName('option')).then(function(elements) 
    { 
    var values = [], 
     elemCount = elements.length, 
     counter = 0; 

    elements.forEach(function(element) 
    { 
     element.getAttribute('value').then(function(optionValue) 
     { 
     counter += 1; 
     values.push(optionValue); 

     if(counter === elemCount) 
     { 
      defer.fulfill(values); 
     } 
     }); 
    }) 
    }); 

    return promise; 
} 

它的工作原理,但看起來十分可怕的我。有沒有更好的方法來做到這一點?

編輯:

兩個小時的閱讀文檔後,我得到了我的輔助函數簡化爲:

getSelectValues: function(elementFinder) 
{ 
    return elementFinder.all(by.tagName('option')).map(function(elem, index) 
    { 
     return elem.getAttribute('value'); 
    }); 
} 

profileType = element(by.model('regObj.profileType')); 
expect(getSelectValues(profileType)).toEqual(['', 'aa', 'bb', 'cc']); 
+0

幹得好!你可以添加它作爲你自己問題的答案。 – 2014-09-30 22:20:16

+0

'如何提高我的代碼'的問題不是真正的stackoverflow方式:s不會downvote,偉大的結果:) – nilsK 2014-10-01 20:01:32

+0

也許這個問題沒有明確說明,但我認爲必須有更好的方式來做到這一點。我沒有在文檔或東西中找到一些方法:)謝謝:) – Ralphz 2014-10-02 13:05:02

回答

11

如果您正在使用量角器> 1.3.0,你可以做到以下幾點:

var values = element(by.model('regObj.profileType')). 
       all(by.tagName('option')).getAttribute('value'); 
expect(values).toEqual(['', 'aa', 'bb', 'cc']);