在等待Protractor与具有基本量角器测试的页面同步时遇到错误

时间:2013-11-18 23:09:48

标签: angularjs-e2e protractor

describe('my homepage', function() {
    var ptor = protractor.getInstance();
    beforeEach(function(){
        // ptor.ignoreSynchronization = true;
        ptor.get('http://localhost/myApp/home.html');
        // ptor.sleep(5000);
    })
    describe('login', function(){

        var email = element.all(protractor.By.id('email'))
            , pass = ptor.findElement(protractor.By.id('password'))
            , loginBtn = ptor.findElement(protractor.By.css('#login button'))
            ;

        it('should input and login', function(){
            // email.then(function(obj){
            //  console.log('email', obj)
            // })
            email.sendKeys('josephine@hotmail.com');
            pass.sendKeys('shakalakabam');
            loginBtn.click();

        })
    })

});

上面的代码返回

 Error: Error while waiting for Protractor to sync with the page: {}

我不知道为什么会这样,ptor正确加载页面,它似乎是选择失败的元素。

TO SSHMSH:

谢谢,你几乎是正确的,并给了我正确的理念,所以关键是ptor.sleep(3000)让每个页面等待直到ptor与项目同步。

7 个答案:

答案 0 :(得分:39)

我收到了相同的错误消息(Angular 1.2.13)。我的测试太早开始了,Protractor似乎没等等Angular加载。

似乎我错误配置了量角器配置文件。如果未在BODY元素上定义ng-app指令,但在后代上定义,则必须将量角器配置文件中的rootElement属性调整为定义角度根元素的选择器,例如:

// protractor-conf.js
rootElement: '.my-app',

当你的HTML是:

<div ng-app="myApp" class="my-app">

答案 1 :(得分:13)

我正在使用ChromeDriver,第一次测试通常会出现上述错误。我已经成功地解决了这个问题:

ptor.ignoreSynchronization = true;
ptor.get(targetUrl);
ptor.wait(
    function() {
            return ptor.driver.getCurrentUrl().then(
                function(url) {
                    return targetUrl == url;
                });
    }, 2000, 'It\'s taking too long to load ' + targetUrl + '!'
);

基本上,您正在等待浏览器的当前URL成为您要求的内容,并允许2s发生这种情况。 您可能希望之后切换ignoreSynchronization = false,可能将其包装在ptor.wait(...)中。只是想知道,会取消注释ptor.sleep(5000);没有帮助吗?

编辑: 在获得Promise / Deferred的一些经验之后,我意识到正确这样做的方式是:

loginBtn.click().then(function () {
    ptor.getCurrentUrl(targetUrl).then(function (newURL){
        expect(newURL).toBe(whatItShouldBe);
    });
});

请注意,如果您正在更改 URL(即,从当前的AngularJS激活页面转移到另一个,暗示AngularJS库需要重新加载和初始化),至少在我的经验,没有办法避免ptor.sleep(...)电话。以上内容仅适用于您在同一个Angular页面上,但在主题标签后更改URL的部分。

答案 2 :(得分:5)

就我而言,我遇到了以下代码的错误:

describe("application", function() {
  it("should set the title", function() {
    browser.getTitle().then(function(title) {
      expect(title).toEqual("Welcome");
    });
  });
});

通过这样做解决了这个问题:

describe("application", function() {
  it("should set the title", function() {
    browser.get("#/home").then(function() {
      return browser.getTitle();
    }).then(function(title) {
      expect(title).toEqual("Welcome");
    });
  });
});

换句话说,我忘记导航到我想测试的页面,因此Protractor很难找到Angular。 D'哦!

答案 3 :(得分:2)

rootElement中定义的exports.config对象的ng-app参数必须与包含div指令的元素匹配。这并不一定要唯一地识别元素 - &#39; div&#39;如果指令在referenceConf.js中,就像我的情况一样。

来自// Selector for the element housing the angular app - this defaults to // body, but is necessary if ng-app is on a descendant of <body> rootElement: 'div',

exports.config

我开始使用量角器,观察其他优秀的protractor configuration file,他使用浓缩的rootElement。由于body默认为{{1}},因此如果您不是从提供的参考配置的副本开始,那么就没有提示您的配置有什么问题,甚至

  

等待Protractor与页面同步时出错:{}

消息并没有提供很多线索。

答案 4 :(得分:1)

我不得不改变这种做法:

    describe('navigation', function(){

        browser.get('');

        var navbar = element(by.css('#nav'));

        it('should have a link to home in the navbar', function(){
            //validate
        });

        it('should have a link to search in the navbar', function(){
            //validate
        });
    });

这样做:

    describe('navigation', function(){

        beforeEach(function(){
            browser.get('');
        });
        var navbar = element(by.css('#nav'));

        it('should have a link to home in the navbar', function(){
            //validate
        });

        it('should have a link to search in the navbar', function(){
            //validate
        });
    });

关键差异是:

    beforeEach(function(){
        browser.get('');
    });
希望这对某人有所帮助。

答案 5 :(得分:0)

我收到了这个错误:

  

失败:等待量角器与页面同步时出错:&#34; window.angular未定义。这可能是因为这是一个非角度页面,或者因为您的测试涉及客户端导航,这可能会干扰Protractor的自举。有关详情,请参阅http://git.io/v4gXM&#34;

解决方案是在page.navigateTo()之前致电page.getTitle()

在:

import { AppPage } from './app.po';

describe('App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
  });

  it('should have the correct title', () => {
    expect(page.getTitle()).toEqual('...');
  })
});

后:

import { AppPage } from './app.po';

describe('App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
    page.navigateTo();
  });

  it('should have the correct title', () => {
    expect(page.getTitle()).toEqual('...');
  })
});

答案 6 :(得分:0)

如果您使用

  

browser.restart()

在您的规格中

有时会抛出相同的错误。 尝试使用

  

等待browser.restart()