2015-04-17 40 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) –