2015-04-17 42 views
2

我剛剛更新到量角器2.0,我在我的項目中發現了一些問題。量角器2.0不等待sendKeys()。承諾問題

expect()失敗,因爲給定的文本是''它似乎預計在sendKeys()完成之前完成。

elem.clear().sendKeys('Message'); 
expect(elem.getAttribute('value')).toBe('Message'); 

我得到的錯誤是:

預計'是 '信息'。

即更新爲量角器2.0工作之前,我知道之一beaking changes is related with then() and promises

要使更新和刪除混亂,這消除了 元件(),然後發揮功能,除非有。一個行動結果。這個 函數是完全不必要的,因爲它總是會自動解析爲 ,但是刪除操作可能會導致重大更改。換句話說,一個 ElementFinder現在不再是一個承諾,直到一個動作被調用爲 。

但在我的項目的其他測試中,它的工作原理,我認爲這個問題可能與我正在做一個循環內期望有關。這裏整個代碼

describe('message', function() { 
    it('Should fill out visible message fields', function(){ 
      getDisplayedElements(element.all(by.model('message'))) 
     .then(function(displayedMessageInputs){ 
       _.each(displayedMessageInputs, function(elem){ 
        elem.clear().sendKeys('Message'); 
        expect(elem.getAttribute('value')).toBe('Message'); 
       }); 
     }); 
    }); 
}); 

如果我使用那麼()函數它的作品,但是...我不喜歡它!

elem.clear().sendKeys('Message') 
.then(function(){ 
    return elem.getAttribute('value'); 
}) 
.then(function(inputValue){ 
    expect(inputValue).toBe('Message'); 
}); 
+0

你看到Chrome和Firefox之間的行爲有什麼不同嗎? (它在Chrome中失敗,但在Firefox中按預期工作?) – dlongley

回答

1

第二種方法顯示它是正確的方法。 Promise用於清晰地組織異步回調行爲。 SendKeys異步回調不能被捕獲,除非Promise在您期望之前解決。此外,它看起來實際上正在返回Promise,在這種情況下,似乎使用函數提供的內容是明智的。如果你不喜歡使用兩個天使,你總是可以期待:

elem.clear().sendKeys('Message') 
.then(function(){ 
    expect(elem.getAttribute('value')).toBe('Message'); 
}); 
+0

感謝您的代碼工作,但我有一個奇怪的行爲。 '寫信'被寫入。 2.期待是通過。 3.輸入清除()。 第三步真的很奇怪。任何想法爲什麼發生這種情況 – Mikel

+0

對不起,我不完全瞭解你現在面臨的問題。我懷疑,也許您需要在承諾解決後設置(取決於您使用的測試框架)「完成」功能。在摩卡中,這是一個傳遞給「it」的函數,一旦promise被解決就可以調用它。在茉莉花中,你可以設置一個runs/waitsFor/runs風格的異步行爲測試。除非不關心測試之間的元素變異,否則最有可能需要刪除afterEach塊中正在修改的元素;我會關心的一些事情。 – BTC

+3

@BTC量角器和webdriver實現一些神奇的鏈式承諾,因此原始問題中的兩個表單都應該等效。在量角器中。 (請參閱https://github.com/angular/protractor/blob/master/docs/control-flow.md) –