24
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 正确加载页面,似乎是选择失败的元素。

对 SSHMSH:

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

4

7 回答 7

39

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

看来我错误地配置了量角器配置文件。当ng-app指令未在 BODY 元素上定义,而是在后代上定义时,您必须将rootElement量角器配置文件中的属性调整为定义角度根元素的选择器,例如:

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

当您的 HTML 是:

<div ng-app="myApp" class="my-app">
于 2014-03-19T21:52:16.063 回答
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 部分时,上述方法才有效。

于 2013-11-19T14:00:12.010 回答
6

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

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。哦!

于 2014-07-21T14:38:05.997 回答
2

在量角器配置文件中定义的对象的rootElement参数必须与包含指令的元素匹配。这不必是唯一标识元素 - 如果指令在 a 中,'div' 就足够了,就像我的情况一样。exports.configng-appdiv

来自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',

我是通过观看其他出色的egghead.io 讲座开始使用 Protractor 的,他在其中使用了浓缩的exports.config. 由于rootElement默认为body,因此如果您不从提供的参考配置的副本开始,则不会提示您的配置有什么问题,即使那样

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

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

于 2014-03-28T22:37:37.910 回答
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('');
    });

希望这可以帮助某人。

于 2016-03-17T04:12:24.863 回答
0

我收到了这个错误:

失败:等待 Protractor 与页面同步时出错:“window.angular 未定义。这可能是因为这是一个非角度页面,也可能是因为您的测试涉及客户端导航,这可能会干扰 Protractor 的引导。请参阅http://git.io/v4gXM了解详情”

解决方案是打电话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('...');
  })
});
于 2018-04-29T00:24:21.517 回答
0

如果您正在使用

browser.restart()

在您的规范中,有时会引发相同的错误。尝试使用

等待 browser.restart()

于 2018-11-14T09:35:17.193 回答