Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

Test run fails with :"Failed: Timed out waiting for asynchronous Angular tasks to finish after..." #4584

Closed

Description

@aozolin

Bug report

  • Node Version: v8.9.1
  • Protractor Version: 5.2.0
  • Angular Version: 5.0.1
  • Browser(s): Chrome 62.0.3202.89
  • Operating System and Version Mac OS High Sierra 10.13.1, Windows 10
  • Your protractor configuration file
require('ts-node/register');
exports.config = {
  suites: {
    login: [
      'test/e2e/prime.e2e.ts'
    ]
  },
  framework: 'jasmine2',
  allScriptsTimeout: 110000,
  getPageTimeout: 110000,
  jasmineNodeOpts: {
    showTiming: true,
    showColors: true,
    isVerbose: false,
    includeStackTrace: false,
    defaultTimeoutInterval: 600000
  },
  directConnect: true,
  multiCapabilities: [
    {
      'browserName': 'chrome',
      shardTestFiles: false,
      maxInstances: 1
    }
  ]
};
  • A relevant example test
import { browser, by, element, ExpectedConditions as EC } from 'protractor';
describe('Test to show Protractor vs Angular sync issue', () => {
    it('Prime NG growl', () => {
        browser.get('https://www.primefaces.org/primeng/#/growl');
        expect(element(by.css('.ui-button[label="Warn"]')).isPresent()).toBe(true);
        element(by.css('.ui-button[label="Warn"]')).click();
        element(by.css('.ui-button[label="Success"]')).click();
    });
});
  • Output from running the test
    Failed: Timed out waiting for asynchronous Angular tasks to finish after 110 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular While waiting for element with locator - Locator: By(css selector, .ui-button[label="Success"])

  • Steps to reproduce the bug
    Just run above test case.

  • The URL you are running your tests against (if relevant)
    https://www.primefaces.org/primeng/#/growl

Hi protractor team,

Recently we have faced with blocking issue, synchronisation between Protractor and Angular fails. Please use above test example to reproduce the issue.
If modify the test case and put browser.waitForAngularEnabled(false); after the first click - test passed success. So it looks like Protractor becomes waiting for Angular to complete its tasks infinitely.

Please investigate the issue and help to fix it as it's a really blocker for our team now.

Activity

  1. joaopslins commented on Nov 22, 2017

    @joaopslins

    I have the same issue. The problem is not protractor, it's the growl component from primeng. It uses timeout() so the protractor thinks that the angular is busy and waits until timeout. That's why when you use waitForAngular(false) it works. I didn't find a solution yet too.

  2. aozolin commented on Nov 24, 2017

    @aozolin
    Author

    Thanks jotapsi.

    In this case I see 2 probable issues:

    1. It's Primeng issue, and they have to fix the issue.
    2. Primeng uses timeouts as it's allowed by Angular. So in this case Protractor should handle such cases somehow.
  3. joaopslins commented on Nov 24, 2017

    @joaopslins

    Yeah, you can see here, on the initTimeout() method, there is a setTimeout function. You know this is the problem because when you set the "sticky" input to true, the protractor problem goes away, at least in my case.

    My workaround for now is set waitForAngular to false and finish my test case this way, then I set it back to true and do a page refresh, resetting the timeout and then we can do the other tests normally.

    PrimeNG could add an input to the Growl Component so we could run the timeout outside angular zone, thus resolving the issue, but I don't really know if they are willing to do that.

    I really do not believe it's Protractor's fault, technically it's working as intended.

  4. SrivaniA commented on Nov 25, 2017

    @SrivaniA

    I see this too. I have the following versions installed :

    Node Version: v8.9.1
    Protractor Version: 5.2.0
    Browser(s): Chrome 62.0.3202.89
    Operating System and Version Mac OS High Sierra 10.13.1
    angular version : 2.3.0

    I observed this since last two days when my tests which were passing earlier suddenly started to fail.

    My bad , setting browser.waitForAngularEnabled(false) isn't really solving the problem as it is inconsistent and not working every time.
    Any better work around till the issue is resolved.

  5. SrivaniA commented on Nov 27, 2017

    @SrivaniA

    update : My dev team made changes to the application code which made the timeout to run outside angular zone. This made my tests green. But , i strongly believe this needs to be considered by protractor , perhaps.

  6. aozolin commented on Nov 29, 2017

    @aozolin
    Author

    Yes, I believe, there are some other components expect PrimeNG growl one. That might use timeouts as well. So we have to deal with such cases.

    It's better to get some thought about the issue from Protractor's team. As they might be aware of the issue and have some generic approach how to workaround it.

  7. qiyigg commented on Dec 6, 2017

    @qiyigg
    Contributor

    For now, if you have a "Repeated" setTimeout / setInterval in your app, Angular will always waits for your "setTimeout / setInterval " and therefore never stable and Protractor will wait for it forever.
    The regular solution is let that kind of "Repeated" setTimeout / setInterval run outside the Angular so that Angular zone won't be aware of that kind of async tasks.
    But that solution is not ideal, some third party library has that kind of async call and we cannot change third party library.
    Our current plan is to introduce a new mechanism to let Protractor ignore some asynchronous tasks based on some Rules.
    @heathkit is working on it, but it is involved with lots of changes in Angular and Zone. There's no ETA for that right now.

  8. shivangsanghi commented on Feb 17, 2018

    @shivangsanghi

    I am also facing the same issue in my project.

  9. carlospliego commented on Mar 7, 2018

    @carlospliego

    Same issue

  10. lxme commented on Mar 8, 2018

    @lxme

    Same issue.

  11. britomarco commented on Mar 14, 2018

    @britomarco

    Same issue.

  12. justintoth commented on Mar 14, 2018

    @justintoth

    Same issue....

  13. qiyigg commented on Mar 14, 2018

    @qiyigg
    Contributor

    As mentioned above, this was caused by repeated settimeout/setInterval in the test app.
    Just sync with @heathkit His change probably can be checked in at the end of this month, which should be able to let Protractor conditionally ignore some asynchronous tasks.

    For now, the recommend way is to let the repeated settimeout/setInterval run outside angular, so that it won't affect the stability of angular.

    If you cannot do so, e.g. the repeated settimeout/setInterval comes from a third party library, you have to
    disable sync with angular in your test:
    browser.waitForAngularEnabled(false)

  14. justintoth commented on Mar 14, 2018

    @justintoth

    Thanks, the browser.waitForAngularEnabled(false) worked for me!

  15. adam3039 commented on Mar 17, 2018

    @adam3039

    I have the same issue. I have a bit of code running on a Rxjs interval and get this error. If I comment out the interval, all is well.

  16. shivangsanghi commented on Mar 18, 2018

    @shivangsanghi

    You need to use browser.waitForAngularEnabled(true) before the timeout. this code(browser.waitForAngularEnabled(true)) will wait for pending http requests and timeouts to finish. This worked fine for me, Hope this will work for you guys also.

  17. mboughaba commented on Mar 30, 2018

    @mboughaba

    Faced this issue today ✋
    In my case, I believe that it is caused by pending http request to angularfire2.

    I solved it by adding

        browser.waitForAngularEnabled(false);
    
  18. aozolin commented on Apr 25, 2018

    @aozolin
    Author

    Fixed by PrimeNG team.
    The issue is being closed.

  19. russelltrafford commented on May 11, 2018

    @russelltrafford

    @aozolin can you confirm in which git commit/issue/release version this is fixed? Perhaps by referencing the fix PR to this issue?

  20. russelltrafford commented on May 11, 2018

    @russelltrafford

    For anyone else wondering, incase they don't reply, I'm assuming they meant fixed in either #4681 or #4681

  21. StanislavKharchenko commented on May 14, 2018

    @StanislavKharchenko

    Hello.
    I have the same problem with timeouts on Angular application, which uses primeng = 5.2.5.
    Could you please specify in what version of primeng this problem was fixed?

    Thank you.

  22. aschlei commented on May 21, 2018

    @aschlei

    @qiyigg Do you know if the change you mentioned (to let Protractor conditionally ignore some asynchronous tasks) was ever merged in? And if so, is there any documentation or examples for how we might use this feature? We're running into this same problem with libraries besides primeng.

  23. qiyigg commented on May 21, 2018

    @qiyigg
    Contributor

    @aschlei Sorry, It hasn't been checked in yet.
    For now, you can disable sync with angular in your test:
    browser.waitForAngularEnabled(false);

  24. DocsWebApps commented on Jun 25, 2018

    @DocsWebApps

    Same problem but this solution worked OK.

    browser.waitForAngularEnabled(false);

  25. JamboBuenna commented on Sep 19, 2018

    @JamboBuenna

    @qiyigg Do you know if the change you mentioned (to let Protractor conditionally ignore some asynchronous tasks) was ever merged in? This is now a problem for everyone using Firebase with Angular & can imagine this will be an issue that will keep coming up.

  26. qiyigg commented on Oct 10, 2018

    @qiyigg
    Contributor

    @JamboBuenna As far as I know, @heathkit task was paused, and mainly because the original implementation relies on some Angular API that we might deprecate soon.

    add @vikerman, who will take over the Protractor stuff.

  27. heathkit commented on Oct 11, 2018

    @heathkit
    Contributor

    We do have a design for this, but I'm no longer working on Protractor and haven't had time to put it together.

    Anyone who wants to could make a Protractor plugin using the new Testability API that could selectively ignore tasks. The rough outline would be:

    1. Create a Protractor plugin that implements waitForPromise
    2. In your new waitForPromise, call Testability.whenStable() and pass it an update callback (see https://github.com/angular/angular/blob/16c03c0f38491444942fb165f1e8e2c7651d1494/packages/core/src/testability/testability.ts#L191). This callback will be called every time an async task starts or finishes.
    3. In your update callback, look at the list of tasks and filter out the ones you don't care about. If the update callback returns true, whenStable() will return.

    The current implementation of Testability does depend on Zone.js. However, I think you can count on Testability.whenStable() to continue to have knowledge of async tasks, regardless of what, if anything, happens with Zone.js

  28. wiedzmin26 commented on Jul 16, 2019

    @wiedzmin26

    @vikerman Can you help with it?

  29. yadimon commented on Sep 1, 2020

    @yadimon

    i had the same issue and started to implement a plugin for this.
    https://www.npmjs.com/package/protractor-sync-options-plugin
    you can already use it to ignore some special async tasks.

    need community help to develop it to high quality and probably more protractor/angular versions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions