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

use*_*582 24 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();

        })
    })

});
Run Code Online (Sandbox Code Playgroud)

上面的代码返回

 Error: Error while waiting for Protractor to sync with the page: {}
Run Code Online (Sandbox Code Playgroud)

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

到SSHMSH:

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

Lud*_*der 39

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

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

// protractor-conf.js
rootElement: '.my-app',
Run Code Online (Sandbox Code Playgroud)

当你的HTML是:

<div ng-app="myApp" class="my-app">
Run Code Online (Sandbox Code Playgroud)


ssh*_*msh 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 + '!'
);
Run Code Online (Sandbox Code Playgroud)

基本上,您正在等待浏览器的当前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);
    });
});
Run Code Online (Sandbox Code Playgroud)

请注意,如果您要更改 URL(即,从当前的AngularJS激活页面转移到另一个,暗示AngularJS库需要重新加载和初始化),至少在我的经验中,没有办法避免ptor.sleep(...)调用.只有当你停留在同一个Angular页面上,但是在hashtag之后更改URL的一部分时,上述内容才有效.


Xåp*_* - 6

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

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

通过执行此操作来修复它:

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

换句话说,我忘记导航到我要测试的页面,因此量角器在查找Angular时遇到了麻烦。天哪!