如何解释在量角器中使用browser.sleep

时间:2015-01-21 09:57:33

标签: javascript css angularjs selenium protractor

我是一个新的量角器,我试图测试popover事件, 这是我的代码:

    describe('popover directive', function() {
        var buttons= element.all(by.tagName('button'));

        it('should show the popover title by clicking', function() {
            var popTitle="testTitle";               
            var popContent="testContent";                   

            element(by.model('title')).clear().sendKeys(popTitle);     
            element(by.model('content')).clear().sendKeys(popContent).then(function(){
                 buttons.get(0).click().then(function(){
                     browser.sleep(1000);
                     expect(element(by.className('popover-title')).getText()).toMatch(popTitle);                
                     expect(element(by.className('popover-content')).getText()).toMatch(popContent);
                 });    
             });                    
            buttons.get(0).click(); 
            browser.sleep(1000);      
            expect(element(by.css('[class="popover fade top in"]')).isPresent()).toBe(false);      
        });
    }); 

1.如果我没有添加browser.sleep()等延迟时间代码,测试将会失败并显示一条消息:

NoSuchElementError: No element found using locator: By.className('popover-title')

是否可以不添加延迟时间代码...如browser.sleep()?如果这是不可能的,那么如何有效地设置睡眠时间呢?这与CSS动画有一些联系吗?

2.使用browser.waitForAngular()click().then(function(){...})代替browser.sleep()似乎无效,将收到相同的错误消息。

如果有人能够回答这些问题,那将会很棒。非常感谢。

2 个答案:

答案 0 :(得分:8)

您必须添加睡眠的原因可能是因为您的动画。许多动画使用setTimeout,Angular(因此Protractor)不知道并且不等待。等同于setTimeout的角度是其$timeout服务。

但通常您无法更改动画库以停止使用setTimeout。要在量角器中使用此功能,请使用browser.wait超时(不睡眠)。

buttons.get(0).click(); 

browser.wait(function() {
  return element(by.css('[class="popover fade top in"]')).isPresent().then(function(present) {
    return !present;
  });
  // or by checking any other element to know that the animation completed
}, 1000);

expect(element(by.css('[class="popover fade top in"]')).isPresent()).toBe(false);      

使用Protractor 1.7,您将能够使用expectedConditions库,以便您可以这样做:

var EC = protractor.ExpectedConditions
buttons.get(0).click(); 

var e = element(by.css('[class="popover fade top in"]'));
browser.wait(EC.not(EC.presenceOf(e)), 1000);

expect(e.isPresent()).toBe(false); 

答案 1 :(得分:0)

而不是使用浏览器,声明一个量角器实例:

  ptor = protractor.getInstance();
  ptor.ignoreSynchronization = true;

然后使用:

ptor.get

而不是浏览器。