2015-02-24 64 views
1

我試圖使用leadfoot模塊進行實習生和硒的功能測試。Leadfoot會話對象返回承諾

對於這個測試,我試圖點擊一個地方的按鈕,然後檢查頁面上其他地方的元素的顯示屬性。

我找不到擴大findById調用搜索的方法,所以我嘗試使用會話屬性,這似乎工作,但結果在一切都返回一個承諾。

我發現這將使它的工作的唯一方法是鏈接然後功能。 什麼使得會話(和其函數返回的元素)不同?

return this.remote 
    .findById('buttonContainer') 
    .findByClassName('buttonClass') 
    .click() 
    .session 
    .findById('stagePanel') 
    .then(function(element) { 
     element.findByClassName('itemList') 
     .then(function(element) { 
      element.getComputedStyle('display') 
      .then(function (display) { 
       // check display property 
      }); 
     }); 

    }); 

我確定我做了很多錯誤的事情,所以任何和所有的建議表示讚賞。

回答

4

this.remote對象是Command對象,而不是SessionElement對象。如果你想要一個會話,你可以從this.remote.session得到它,但它通常不是必需的,並且會話對象不可鏈接。

您的第二個findById不工作的原因是因爲您不是ending過濾您添加了以前的findBy調用。如果在查找操作後沒有調用end,則後續查找操作將使用前一個查找的元素作爲搜索的根元素。

換句話說,當您運行this.remote.findById('a').findById('b')時,它會在元素'a'內搜索元素'b',而不是在整個文檔this.remote.findById('a').end().findById('b')內搜索整個文檔中的'a'和'b'。

此外,任何時候在回調中執行異步操作時,都需要return操作的結果。如果不這樣做,測試不會知道它需要等待更多操作才能完成。返回鏈接還可以防止callback pyramids

return this.remote 
    .findById('buttonContainer') 
     .findByClassName('buttonClass') 
     .click() 
     .end(2) 
    .findById('stagePanel') 
    .then(function(stagePanel) { 
     return stagePanel.findByClassName('itemList'); 
    }).then(function(itemList) { 
     return itemList.getComputedStyle('display'); 
    }).then(function (display) { 
     // check display property 
    });