当前位置: 首页 > 知识库问答 >
问题:

等待量角器在11秒后与页面同步超时,即使页面已完全加载

景震博
2023-03-14

我不熟悉量角器,所以请多包涵。

看到这个问题问了很多次,但是提出的解决方案都不适合我。我测试中的应用程序在一个没有角度的登录页面上启动。我设置browser . ignoresynchronization = true,登录,设置回false,重新加载页面。然后,我尝试与结果页面上的元素进行交互。第一个元素没有问题,但是试图找到第二个元素会抛出一个类型错误

"失败:等待量角器与页面同步11秒后超时,无法分配给只读属性' stack'。请在等待带有定位器的元素时查看https://github . com/angular/量角器/blob/master/docs/FAQ . MD-Locator:[有效定位器]"

我可以通过将ignoreSychronization设置为true并使用sleeps来实现它,但这难道不会破坏使用量角器的全部目的吗?!我可以使用java硒,我已经精通了。

我确信页面正在加载,并且没有未完成的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个答案

袁鸿达
2023-03-14

经过一夜的思考(是的,我在量角器里做梦),我意识到恰当地使用promise可能是答案。我在如何等待条件中找到了一些非常有用的提示?,并将我的测试实现为:

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();
                    });
                });
            });
        });
    });
});
 类似资料:
  • 问题内容: 我正在测试AngularJS应用程序,并且对量角器非常新。每次我打开浏览器时,它都会打开,然后等待超时,然后在cmd上引发以下错误。 我尝试增加超时限制,但始终会收到此错误。我也尝试过使用所有这些: 该页面正确加载,并且如果我使用Eclipse和Selenium与按钮对象进行交互,则可以正常工作。 只有量角器出现同步问题。请帮忙。 问题答案: 量角器超时的可能原因: 您的网页未以预期的

  • 问题内容: 我正在使用小型AngularJS应用测试量角器。 这是测试: 控制器: 草稿服务: 使用量角器运行此测试会导致以下错误: 但是,如果在控制器中更改此行: 对此: 测试失败,但未达到预期目的,但更重要的是:它不会超时。 启用query()时,在浏览器中手动运行应用程序以及查看Protractor打开的浏览器窗口时,转发器均会正确显示API返回的数据。 当服务与API通信时,为什么Prot

  • 问题内容: 我的档案是: 我的节点项目在9001端口上运行并在监听。 我的测试是: 我得到的错误是: 我究竟做错了什么?? 问题答案: (非常简短的版本): 使用代替。 较长的版本: Protractor基本上是Selenium及其Javascript WebDriver代码的包装。量角器添加代码以等待Angular“安顿下来”(即完成$ digest循环),然后继续测试代码。但是,如果您的页面上

  • 我试过下面的方法,但效果不理想。

  • 我试图遵循量角器官方网站上的量角器教程,但我甚至无法完成步骤0。 我在用量角器 之后,我一直在遵循教程的第0步。我有配置。js文件和test-spec.js文件如下: 配置js公司 测试规范js 当我运行protector

  • 我正在使用Selenium.WaitForPageToload方法在启用ajax的网页中等待。当我运行测试代码时,selenium甚至在页面加载后仍会等待,并抛出“等待操作完成超时”异常。我可能在甚至没有页面加载事件的地方使用了waitforpagetoload。我想它只是跳过部分,如果页面加载。我的代码是这样的 我使用的是Selenium-Java2.33版。google Chrome 27.0

  • 我们使用SeleniumQuery-0.19.0进行硒测试。 我们注意到$.url()没有等待页面完全加载。我还尝试了$.driver().get().navigate().to(url);。 null > 等待,即$(“*[id='login.username']”).WaitUntil(5000).IsPresent(); 超时,即$.driver().get().manage().timeo