即使页面已完全加载,等待Protractor在11秒后与页面同步也会超时

时间:2016-06-06 22:53:36

标签: angularjs protractor

我是量角器的新手,所以请耐心等待。

我已经多次看过这个问题,但是所提出的解决方案都不适合我。我的测试应用程序在非角度登录页面上启动。我设置browser.ignoreSynchronization = true,登录,将其重新设置为false,然后重新加载页面。然后我尝试与结果页面上的元素进行交互。第一个元素没有问题,但是尝试查找第二个元素会引发消息

的类型错误

“失败:无法分配给Timed out的只读属性'stack'等待Protractor在11秒后与页面同步。请参阅https://github.com/angular/protractor/blob/master/docs/faq.md     在等待带定位器的元素时 - 定位器:[有效定位器]“

我可以通过将ignoreSychronization设置为true并使用sleeps来使其工作,但这不会破坏使用量角器的整个目的吗?!我可以使用java + selenium,我已经熟练了。

我确定页面正在加载,并且没有未完成的http,超时或其他调用。为了确保,我将超时设置为2分钟,结果相同。

我的测试看起来像这样:

describe('this does not work', function() {
    beforeEach(function() {
        // log in on non-angular page
        // ignoreSynchronization because this isn't an angular page
        browser.ignoreSynchronization = true;
        var d = browser.driver;
        d.get(g.url);

        var username_field = d.findElement([valid locator]);
        username_field.sendKeys(username);

        var next_button = d.findElement([valid locator]);
        next_button.click();

        var password_field = d.findElement([valid locator]);
        password_field.sendKeys(password);

        var login_button = d.findElement([valid locator]);
        login_button.click();

        // done with non-angular page
        browser.ignoreSynchronization = false;
        browser.get(g.url);

    });
    it('does not work', function() {

        //  if you comment out this line, the next will execute successfully
        // this succeeds, so page is loaded
        expect(element([valid locator]).getText()).toBe('some string');

        // otherwise, the exception is thrown trying to get this element
        element([valid locator]).click();
        element([valid locator]).click();
    });
});

欢迎任何帮助/指示/建议。

编辑: 我应该包括我的conf.js:

exports.config = {
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['./specs/**/broken_spec.js'],
  useAllAngular2AppRoots: true
}

1 个答案:

答案 0 :(得分:1)

在一夜之间思考(是的,我在量角器中做梦),我意识到正确使用承诺可能就是答案。我在How can I wait for a condition?找到了一些非常有用的提示,并将我的测试实现为:

describe('this does not work', function() {
    beforeEach(function() {
        // log in on non-angular page
        // ignoreSynchronization because this isn't an angular page
        browser.ignoreSynchronization = true;
        [login]
        // done with non-angular page
        browser.ignoreSynchronization = false;
        browser.get(g.url);
    });
    it('should work', function() {
        // log out
        var userInfoButton = [valid locator];
        browser.driver.isElementPresent(userInfoButton).then(function() {
            browser.driver.findElement(userInfoButton).then(function(button) {
                button.click();
                var logoutButton = [valid locator];
                browser.driver.isElementPresent(logoutButton).then(function() {
                    browser.driver.findElement(logoutButton).then(function(button) {
                        button.click();
                    });
                });
            });
        });
    });
});