【问题标题】:Timed out waiting for Protractor to synchronize with the page after 11 seconds even though page is completely loaded即使页面完全加载,11 秒后等待量角器与页面同步也超时
【发布时间】:2016-10-06 16:29:00
【问题描述】:

我是量角器的新手,所以请多多包涵。

我多次看到这个问题被问到,但没有一个建议的解决方案适合我。我正在测试的应用程序从非角度登录页面开始。我设置 browser.ignoreSynchronization = true,登录,将其设置回 false,然后重新加载页面。然后我尝试与结果页面上的元素进行交互。第一个元素没有问题,但是尝试查找第二个元素会引发类型错误并显示消息

“失败:无法分配给只读属性'stack'的超时等待量角器在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
}

【问题讨论】:

  • 快速检查 - 在browser.get(g.url) 之后添加browser.waitForAngular() 有什么不同吗?谢谢。
  • @alecxe - 不,browser.waitForAngular() 是我尝试过的方法之一。没有区别,这实际上并不让我感到惊讶。找到了我要查找的第一个元素,因此我知道页面已加载。但是感谢您的尝试!

标签: angularjs protractor


【解决方案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();
                    });
                });
            });
        });
    });
});

【讨论】:

  • 我认为你把事情复杂化了。首先,您可以直接在it 内部使用elementbrowser,因为您已经在角度页面上打开了同步。此外,应该使用带有一组预期条件的browser.wait() - 这会使事情变得更容易。
  • @alecxe - ExpectedConditions 对我也不起作用。我等待按钮可单击,然后尝试单击它,但没有任何反应。我真的很沮丧。我很想深入了解并让我的测试在量角器中工作,但我昨天用 java+selenium 编写测试比一周量角器完成的要多:-(
  • 当然有学习曲线,也有困难的情况。无论如何,在量角器中做梦+1 :)
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2023-03-12
  • 2018-12-07
  • 2014-05-16
相关资源
最近更新 更多