Protractor: рдЬрдм рдРрдк рдХреЛ ngUpgrad рдХреЗ рд╕рд╛рде рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдордИ 2017  ┬╖  51рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/protractor

рдореИрдВ рдПрдХ AngularJS (1.6) рдРрдк рдХреЛ рдПрдВрдЧреБрд▓рд░ (4) рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ NgUpgrad рдХреЗ рд╕рд╛рде рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдореЗрд░реЗ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред

рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЛ рдЕрдЧрд░ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рд╡рд╣ рд╣реИ:

рд╡рд┐рдлрд▓: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдгреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ 11 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╕рдордп рд╕рдорд╛рдкреНрддред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдПрдХ рдХреЛрдгреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рджреЗрдЦреЗрдВ: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting -for-angular

рд▓реЛрдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп - рд▓реЛрдХреЗрдЯрд░: By(css рдЪрдпрдирдХрд░реНрддрд╛, .toggle-summary-button)

рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдореЗрдВ рдмрджрд▓рд╛рд╡

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ AngularJS рдФрд░ Angular рджреЛрдиреЛрдВ рдШрдЯрдХ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рд╣реИрдВ рд╡реЗ рд╣реИрдВ:

1 html рдЯреИрдЧ рд╕реЗ рдПрдирдЬреА-рдРрдк рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛:

<html lang="en" *ng-app="myapp">

2 рдПрдХ AppModules (@NgModule) рдЖрджрд┐ рдЬреЛрдбрд╝рд╛ред

3 рдРрдк рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП NgUpgrad рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
  const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
  upgrade.bootstrap(document.body, ['myapp'], {strictDi: true});
});

рдЪрд╛рдВрджрд╛ рдкрд░реАрдХреНрд╖рдг

рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдорд╕реНрдпрд╛ рдЙрд╕ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдЬрдм рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЛрдгреАрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рд╣реИ рдЬреЛ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╡рд░рдг рднрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИред рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдкреЗрдЬ рдЦреЛрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рджрд░реНрдЬ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ:

  • рдореЗрд░реА рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "рд░реВрдЯ рдПрд▓рд┐рдореЗрдВрдЯ: 'рдмреЙрдбреА'" рдЬреЛрдбрд╝рдирд╛
  • рдореЗрд░реА рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "ng12Hybrid: true" рдЬреЛрдбрд╝рдирд╛ - рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рддрдГ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред
  • allScriptsTimeout рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ 11000 рд╕реЗ рдмрдврд╝рд╛рдХрд░ 60000 рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
  • WaitForAngularEnabled рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред рдпрд╣ рд▓реЙрдЧрд┐рди рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореЗрд░рд╛ рдХреЛрдИ рднреА http рдирдХрд▓реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ - рд╣рдо рдПрдХ рдмрджрд▓рд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ Zone.js рдФрд░ Angular рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ ETA рдирд╣реАрдВ рд╣реИ (рд╕рдкреНрддрд╛рд╣реЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛)ред рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред

рд╕рднреА 51 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдереА рдЬрд┐рд╕реЗ рдЗрд╕ рдЕрдкрдЧреНрд░реЗрдб рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рдкреЗрдЯрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { UpgradeModule } from '@angular/upgrade/static';
import { AppModule } from './app.module';

angular.element(document).ready(() => {
  platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
    upgrade.bootstrap(document.body, ['myapp'], {strictDi: true});
  });
});

рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА

//ng12Hybrid: true,
//useAllAngular2AppRoots: true,
//rootElement: 'body',

рдХреНрдпрд╛ рдЖрдк https://github.com/angular/protractor/issues/4234 рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, ngUpgrad рдореЗрдВ $interval рдЕрдм рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрдЧрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдерд╛ (https://github.com/angular/angular/issues/16349), рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@Evilweed - рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

@ рд╣реЗрдердХрд┐рдЯ - рдореИрдВрдиреЗ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЦреЛрдЬрдХрд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ $ рдЕрдВрддрд░рд╛рд▓ рдкрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред рдореИрдВрдиреЗ рдкреВрд░реЗ рдРрдк рдореЗрдВ $interval рдпрд╛ $timeout рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдкрд░ рднреА рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдЙрд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдХреБрдЫ async рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рдкреВрд░реА рддреНрд░реБрдЯрд┐ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рд▓рдВрдмрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдЕрднреА рддрдХ рдХреЛрдгреАрдп рдкрдХреНрд╖ рд╕реЗ рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧреАред рдпрджрд┐ рдЖрдкрдХреЗ рдРрдк рдХреЗ рдХреЛрдгреАрдп рднрд╛рдЧ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣реЗ async рдХрд╛рд░реНрдп рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред (рджреЗрдЦреЗрдВ https://github.com/angular/protractor/blob/master/docs/timeouts.md)

рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗ рд╣реИред рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдХреБрдЫ рдмрд╛рддреЗрдВ:

  • рдореЗрд░реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ beforeAll рдмреНрд▓реЙрдХ рд╣реИ рдЬреЛ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рднрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ waitForAngular рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рднрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рджреВрд╕рд░реА рдЫрдорд╛рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рд╣реИ (рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рддрддреНрд╡ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ)ред

  • рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ HTTP рдХреЙрд▓ рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж $ рдЕрдВрддрд░рд╛рд▓ рдпрд╛ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд╣реАрдВред

  • рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдордп рдХреЛрдгреАрдп рдкрдХреНрд╖ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдЕрднреА рднреА AngularJS рд╣реИред рдпрд╣ рдирдП рдХреЛрдгреАрдп рдШрдЯрдХ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рддрдХ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ http рдХреЙрд▓ рдХреЛрдгреАрдп 4 рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ)

  Message:
    Failed: Timed out waiting for asynchronous Angular tasks to finish after 11 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, *[name="password"])
  Stack:
    ScriptTimeoutError: asynchronous script timeout: result was not received in 11 seconds
      (Session info: chrome=58.0.3029.110)
      (Driver info: chromedriver=2.29.461585,platform=Mac OS X 10.12.4 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 11.07 seconds
    Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
    System info: host: 'Matt.lan', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.4', java.version: '1.8.0_111'
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.29.461585, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=58.0.3029.110, platform=MAC, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}]
    Session ID: 40deafceb49b72b1c0188ad0895c1179
        at Object.checkLegacyResponse (/Users/matt/web-app/node_modules/selenium-webdriver/lib/error.js:505:15)
        at parseHttpResponse (/Users/matt/web-app/node_modules/selenium-webdriver/lib/http.js:509:13)
        at doSend.then.response (/Users/matt/web-app/node_modules/selenium-webdriver/lib/http.js:440:13)
        at process._tickCallback (internal/process/next_tick.js:109:7)
    From: Task: Protractor.waitForAngular() - Locator: By(css selector, *[name="password"])
        at thenableWebDriverProxy.schedule (/Users/matt/web-app/node_modules/selenium-webdriver/lib/webdriver.js:816:17)
        at ProtractorBrowser.executeAsyncScript_ (/Users/matt/web-app/node_modules/protractor/lib/browser.ts:608:24)
        at angularAppRoot.then (/Users/matt/web-app/node_modules/protractor/lib/browser.ts:642:23)
        at ManagedPromise.invokeCallback_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:1366:14)
        at TaskQueue.execute_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2970:14)
        at TaskQueue.executeNext_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2953:27)
        at asyncRun (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2813:27)
        at /Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:676:7
        at process._tickCallback (internal/process/next_tick.js:109:7)Error
        at ElementArrayFinder.applyAction_ (/Users/matt/web-app/node_modules/protractor/lib/element.ts:482:23)
        at ElementArrayFinder.(anonymous function).args [as sendKeys] (/Users/matt/web-app/node_modules/protractor/lib/element.ts:96:21)
        at ElementFinder.(anonymous function).args [as sendKeys] (/Users/matt/web-app/node_modules/protractor/lib/element.ts:873:14)
        at /Users/matt/web-app/e2e-tests/modules/authentication.js:83:38
        at ManagedPromise.invokeCallback_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:1366:14)
        at TaskQueue.execute_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2970:14)
        at TaskQueue.executeNext_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2953:27)
        at asyncRun (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2813:27)
        at /Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:676:7
        at process._tickCallback (internal/process/next_tick.js:109:7)
    From: Task: Run beforeAll in control flow
        at Object.<anonymous> (/Users/matt/web-app/node_modules/jasminewd2/index.js:94:19)
    From asynchronous test: 
    Error
        at Suite.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:28:3)
        at Object.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:7:1)
        at Module._compile (module.js:571:32)
        at Object.Module._extensions..js (module.js:580:10)
        at Module.load (module.js:488:32)
        at tryModuleLoad (module.js:447:12)
  Message:
    Failed: No element found using locator: By(css selector, .toggle-asset-summary-button)
  Stack:
    NoSuchElementError: No element found using locator: By(css selector, .toggle-asset-summary-button)
        at elementArrayFinder.getWebElements.then (/Users/matt/web-app/node_modules/protractor/lib/element.ts:851:17)
        at ManagedPromise.invokeCallback_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:1366:14)
        at TaskQueue.execute_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2970:14)
        at TaskQueue.executeNext_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2953:27)
        at asyncRun (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2813:27)
        at /Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:676:7
        at process._tickCallback (internal/process/next_tick.js:109:7)Error
        at ElementArrayFinder.applyAction_ (/Users/matt/web-app/node_modules/protractor/lib/element.ts:482:23)
        at ElementArrayFinder.(anonymous function).args [as click] (/Users/matt/web-app/node_modules/protractor/lib/element.ts:96:21)
        at ElementFinder.(anonymous function).args [as click] (/Users/matt/web-app/node_modules/protractor/lib/element.ts:873:14)
        at Page.showAssetSummaryComponent (/Users/matt/web-app/e2e-tests/specs/home/page-object.js:289:31)
        at Object.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:63:12)
        at /Users/matt/web-app/node_modules/jasminewd2/index.js:112:25
        at new ManagedPromise (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:1067:7)
        at ControlFlow.promise (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2396:12)
        at schedulerExecute (/Users/matt/web-app/node_modules/jasminewd2/index.js:95:18)
        at TaskQueue.execute_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2970:14)
    From: Task: Run fit("should open asset summary component") in control flow
        at Object.<anonymous> (/Users/matt/web-app/node_modules/jasminewd2/index.js:94:19)
        at /Users/matt/web-app/node_modules/jasminewd2/index.js:64:48
        at ControlFlow.emit (/Users/matt/web-app/node_modules/selenium-webdriver/lib/events.js:62:21)
        at ControlFlow.shutdown_ (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2565:10)
        at shutdownTask_.MicroTask (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2490:53)
        at MicroTask.asyncRun (/Users/matt/web-app/node_modules/selenium-webdriver/lib/promise.js:2619:9)
    From asynchronous test: 
    Error
        at Suite.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:62:5)
        at Suite.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:60:3)
        at Object.<anonymous> (/Users/matt/web-app/e2e-tests/specs/home/asset.spec.js:7:1)

рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА - рдПрдХ рдирдП 'рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ' рдПрдВрдЧреБрд▓рд░ 4 рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреЗрд╕рд┐рдХ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рдеред рд╕рдм рдХреБрдЫ рдиреЙрди-рд╣рд╛рдЗрдмреНрд░рд┐рдб рдореЛрдб рдкрд░ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

Failed: Timed out waiting for asynchronous Angular tasks to finish after 50 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, #loginModal h4)

рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: @ рдХреЛрдгреАрдп/рдЕрдкрдЧреНрд░реЗрдб 4.2.2
рдЬрд┐рд╕рдореЗрдВ рдЯреЗрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдПрдкреАрдЖрдИ рд╕реНрдерд┐рд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

рдЕрдЧрд░ рдХреЛрдИ рд░реЗрдкреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЖрдЧреЗ рджреЗрдЦреВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдм рддрдХ рдХреНрдпрд╛ рдЦреЛрдЬрд╛ рд╣реИ

рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬрд┐рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ window.setTimeout() рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ рд╕рд┐рдВрдХ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣реИ
рдХреЛрдгреАрдп-рдкрд▓ ред

рдпрд╣ рдареАрдХ рдЪрд▓рд╛ рдЬрдм рдореЗрд░рд╛ рдРрдк рд╕рд┐рд░реНрдл рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдХреЗ рд░реВрдк рдореЗрдВ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдЬрд╝реЛрди рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ

рдореИрдВрдиреЗ https://github.com/mattwilson1024/angular-hybrid рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб (NgUpgrad) рдРрдк рд╣реИ:

  • рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рдкреГрд╖реНрда (рд╡рд░реНрдг рдкреГрд╖реНрда) AngularJS (1.6) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдкреГрд╖реНрда рдореЗрдВ рдХреИрд░реЗрдХреНрдЯрд░рд▓рд┐рд╕реНрдЯ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╣реИ, рдЬреЛ рдПрдХ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдгреАрдп (4) рдШрдЯрдХ рд╣реИред
  • рдХреИрд░реЗрдХреНрдЯрд░рд▓рд┐рд╕реНрдЯ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдПрдХ рдЕрдиреНрдп рдХреЛрдгреАрдп 4 рдШрдЯрдХ, рдХреИрд░реЗрдХреНрдЯрд░рдбрд┐рдЯреЗрд▓ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдРрдк рдФрд░ рдПрдХ рдПрдХрд▓ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдХреЛрдгреАрдп-рдХреНрд╖рдг рд╢рд╛рдЦрд╛ angular-moment рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рддреА рд╣реИ рдФрд░ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд▓реЗрдмрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ am-time-ago рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдПрдкрд┐рд╕реЛрдб рдХреЗ рдмрд╛рдж рд╕реЗ рдХрд┐рддрдиреЗ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реИред рдРрдк рд╕реНрд╡рдпрдВ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЯреЗрд╕реНрдЯ рдЕрдм рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рд╕рдордп рд╕рдорд╛рдкреНрддрд┐

рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, AngularJS рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдХрд┐ $ рдЕрдВрддрд░рд╛рд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди $ рдЯрд╛рдЗрдордЖрдЙрдЯ, рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдпрд╛ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

function sayHello() { console.log('Hello, world'); }

$interval(sayHello, 30000); // Succeeds (with Angular 4.2.0 and later - see https://github.com/angular/angular/pull/16836)
$timeout(sayHello, 30000); // Fails - Timed out waiting for asynchronous Angular tasks to finish after 11 seconds
setInterval(sayHello, 30000); // Fails - Timed out waiting for asynchronous Angular tasks to finish after 11 seconds
setTimeout(sayHello, 300000); // Fails - Timed out waiting for asynchronous Angular tasks to finish after 11 seconds

рдЕрдЧрд▓реЗ рдХрджрдо

рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ "рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд╣рд░" рдХреЛрдб рдХреЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рд╕реЗ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЬрд╝реЛрди рдЖрджрд┐ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛрдб рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдгреАрдп-рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ) - рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ред рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕реЗрдЯрдЕрдк?

рдЬрд╝реЛрди рд╡рд┐рдВрдбреЛ рдкрд░ рд╕реЗрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ NgZone рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдПрдВрдЧреБрд▓рд░ рдЬрд╝реЛрди рдХреЗ рдмрд╛рд╣рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдореЗрдВ рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ

if (Zone && Zone.current.name === 'angular') {
  let angularZone = Zone.current;
  Zone.parent.run(() => {
    $timeout(() => {
       // Stuff here is run outside the Angular zone and will not be change detected
       angularZone.run(() => {
         // Inside the zone and will be change detected.
       });
    }, 500);
  });
}

рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдХрд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХреЛрдб рдореЗрдВ рднреА, рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдПрдВрдЧреБрд▓рд░ рдФрд░ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдореЗрдВ рдЯрд╛рд╕реНрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдХрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрд╕рд┐рдВрдХ рдЯрд╛рд╕реНрдХ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдореЗрдВ рд▓рд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рдорд╣реАрдиреЗ рд▓рдЧреЗрдВрдЧреЗред

рдЬрд╣рд╛рдБ рддрдХ рдХреЛрдгреАрдп-рдХреНрд╖рдг рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХреНрд╖реЗрддреНрд░-рдЬрд╛рдЧрд░реВрдХ рд╣реЛ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЖрдк рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ waitForAngular рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп browser.wait рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ WaitForAngular API рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрдЧрд╛ рдХрд┐ рдЖрдк рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рдмрдВрдж рд╣реИред

рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп (рдХреЛрдгреАрдп рд╕рд┐рдВрдХ рдХреЗ рдмрд┐рдирд╛) рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( browser.ignoreSynchronization = true рдИрд╕реА, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рд▓реЗрдХрд┐рди browser.ignoreSynchronization = false; рдХреЛ "Error while waiting for Protractor to sync with the page: "Cannot read property '$$testability' of undefined" рд╕рд╛рде рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рдВрдкреВрд░реНрдг E2E рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рд╢реВрдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИред

рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ 5.1.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрдЧрд░ рдореИрдВ ng12Hybrid: true рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЖрдкрдиреЗ ng12Hybrid рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ 4.1.0 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдПрдХ ngUpgrad рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ ng1 рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ platformBrowserDynamic() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреНрд╡рдЬ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рддреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ angular.io рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рдкреБрд░рд╛рдирд╛ рд╣реИ: https://angular.io/guide/upgrad#e2e -tests

рд╕реНрд╡рдпрдВ рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЕрдВрддрд┐рдо рд╢рдмреНрдж:

E2E рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдШрдЯрдХреЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╛рдлреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, E2E рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдХреЛ рдХреЗрд╡рд▓ рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдЬрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдиреЗ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рд╛ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

angular.io рдкрд░ рдЙрд╕ рдХрдерди рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ:

@heathkit рдЬреЛрдиреЛрдВ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдореМрдЬреВрджрд╛ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╕реВрдЯ рд╣реИ рдЬреЛ рдирд┐рд╣рд┐рдд рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп ngUpgrad рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ AngularJS рдХреЛ Angular рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдЗрдмреНрд░рд┐рдб рдЕрдкрдЧреНрд░реЗрдб рдореЛрдб рдореЗрдВ рд╣рдорд╛рд░реЗ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╕реВрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдиреЗ рд╣рдорд╛рд░реА рдкрд╣рд▓ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЕрднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдордЭрджрд╛рд░ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ! :0

рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ: AngularJS 1.6 -> Angular 4.2.4

рдХрд┐рд╕реА рдХреЛ рднреА рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рдордХрд╛рдЬ рдкрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? 1.6 рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗ рдмрд┐рдирд╛ рдпрд╛рдиреАред

@ quinw68 - @heathkit рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдгреАрдп 'рдЬреЛрди' рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдРрдк рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди, рдФрд░ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред

рдПрдХ рдФрд░ 'рд╡рд░реНрдХ-рдЕрд░рд╛рдЙрдВрдб' рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдРрдк рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдирд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЕрдм рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдРрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдм рдХреЛрдгреАрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдкрд░ рддрддреНрд╡реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЖрдкрдХреЗ рдРрдк рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдирдЬреА рдЕрдкрдЧреНрд░реЗрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЛрдгреАрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рд╢реБрджреНрдз рдХреЛрдгреАрдп (2+) рдРрдк рдореЗрдВ, рдПрдХ рд▓рдВрдмрд╛ setTimeout (рдпрд╛ рддреЛ рд╕реАрдзреЗ рдпрд╛ рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╣реЛрдиреЗ рд╕реЗ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@ рд╣реЗрдердХрд┐рдЯ , рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛? рдХреНрдпрд╛ рдПрдирдЬреАрдЕрдкрдЧреНрд░реЗрдб рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рд░рд╣рд╛ рд╣реИ?

@gkalpak рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдХреЛрдгреАрдп-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдПрдХ рдмрдбрд╝реЗ AngularJS рдРрдк рдХреЗ рд╕рд╛рде ngUpgrad рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

AngularJS рдореЗрдВ, рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЗрд╡рд▓ $browser.defer() рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ async рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ - рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ $timeout рдФрд░ $http рдХреЙрд▓ред рдПрдХ рдмрд╛рд░ рдЬрдм рдХреЛрдИ ngUpgrad рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдг рд▓рдВрдмреЗ setTimeout рдХреЙрд▓ (рд╕рдВрднрд╡рддрдГ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ) рдХреЗ рдХрд╛рд░рдг рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд▓рдЧреЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рддреЛ рдЬреНрдпрд╛рджрд╛рддрд░, рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ ngUpgrad рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдм рд▓реЛрдЧреЛрдВ рдХреЗ AngularJS рдРрдк рдФрд░ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдг рдЕрдЪрд╛рдирдХ рдХреЛрдгреАрдп (2+) рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдзреАрди рд╣реИрдВред

рддреЛ, рдПрдХ рд╢реБрджреНрдз рдХреЛрдгреАрдп рдРрдк рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрджрд┐ рдХреЛрдИ рддреГрддреАрдп рдкрдХреНрд╖ рдХреЛрдгреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд▓рдВрдмрд╛ setTimeout рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛?

@vikerman рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдирдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдХреЛ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рдЪрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╡реЗ рд╕рд╡рд╛рд░ рди рд╣реЛрдВ, рддрдм рддрдХ рдЖрдкрдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рддреГрддреАрдп рдкрдХреНрд╖ рдРрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдЖрдк рдХреЗрд╡рд▓ waitForAngular рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╢рд░реНрддреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдлреАрдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрдЧрд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕ рдореИрдХреНрд░реЛрдЯрд╛рд╕реНрдХ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рдмрдВрдж рд╣реИред

@heathkit @vikerman рдХреГрдкрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ?

рдЬрд┐рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЙрд╕рдореЗрдВ рдкрд╣рд▓реЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдорддрджрд╛рди рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓рдкреЗрдЯрд╛ рддрд╛рдХрд┐ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред WaitForAngular ();

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рдВрджрд╛ рдХреА рдЯреАрдо/рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж ред рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдореЗрд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП 3 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рд░рд┐рд▓реАрдЬ, 200 рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗрд╡рд╛рдУрдВ, рдирд┐рд░реНрджреЗрд╢реЛрдВ, рдШрдЯрдХреЛрдВ, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 400 e2e рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрдо рдЙрддреНрдкрд╛рджрди рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░ рдХрд┐рддрдирд╛ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдиреЗ рдПрдирдЬреАрдЕрдкрдЧреНрд░реЗрдб рдФрд░ рд╕рд╣рд╛рдпрдХ рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз 2 рд╕рдкреНрддрд╛рд╣ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ рдЯреНрд░реИрдХ рдореЗрдВ рдореЗрд░реЗ рдХреЛрдгреАрдп рдЙрдиреНрдирдпрди рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм e2e рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ (рдЕрднреА рддрдХ) рдПрдХ рджреГрд╢реНрдп рдкрде рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@mattwilson1024 рдХреА рдорд╣рд╛рди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ $timeout , setTimeout , setInterval рд╣рдорд╛рд░реЗ рдРрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ angular-ui-bootstrap (v.2.5.6) рдФрд░ ui-select (v0.19.8) $timeout рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рдЕрдиреНрдп рднреА рдЙрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ - рдХреЛрдгреАрдп-рдпреВрдЖрдИ-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк - 400k рдПрдирдкреАрдПрдо рдбрд╛рдЙрдирд▓реЛрдб/рдореЛ, рдпреВрдЖрдИ-рдЪрдпрди 100k +/рдореЛред

angular-ui-bootstrap 2015 рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг $ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╣реИ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ "рдЗрд╕ рдмрдЧ рдЪрд╛рдВрджрд╛ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣рд╛рдБ рдирд╣реАрдВред рдЗрд╕ рдмрдВрджред" рд╕рд╛рде рд╣реА, angular-ui-bootstrap рдЕрдм рдЙрдирдХреЗ рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдг @ рдПрдирдЬреА-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк/рдПрдирдЬреА-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдмреАрдЯрд╛ рдореЗрдВ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рдпреБрдХреНрдд рдХреЛрдгреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╡реИрдзрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рдкрд░, рдореИрдВ @heathkit рд╕реЗ рд╕рд╣рдордд $timeout рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреЛрдж рдирд╣реАрдВ рд▓реЗрддрд╛ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдХреЗрд╡рд▓ рдПрдирдЬреАрдЧреНрд░реЗрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдФрд░ рдЬрдм рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдЪреБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ, рдореИрдВ ngUpgrad рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрди рддреГрддреАрдп рдкрдХреНрд╖ рдЖрдЗрдЯрдореНрд╕ рд╕реЗ рдЕрдкрдЧреНрд░реЗрдб рдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрд╣ред

рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдХреЗ рд▓рд┐рдП рд╢реЛрдз рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд░рд╛рдзреА рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ, рдЖрджрд┐) рдФрд░ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╣рд╛рдВ рдореБрдЭреЗ $timeout рдорд┐рд▓рд╛ рд╣реИ:
рдХреЛрдгреАрдп-рдпреВрдЖрдИ-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк v2.5.6

  • UibAlertрдирд┐рдпрдВрддреНрд░рдХ
  • Uib рд╣рд┐рдВрдбреЛрд▓рд╛ рдирд┐рдпрдВрддреНрд░рдХ
  • UibDatepickerрдкреЙрдкрдЕрдкрдХрдВрдЯреНрд░реЛрд▓рд░
  • UibTypeaheadрдирд┐рдпрдВрддреНрд░рдХ
  • рдпреВрдЖрдИрдмреАрдЯреВрд▓рдЯрд┐рдк

рдпреВрдЖрдИ-рдЪрдпрди

  • uiрдЪреБрдиреЗрдВ
  • uiрдЪреБрдиреЗрдВрдПрдХрд╛рдзрд┐рдХ
  • uiрдЪрдпрдирдПрдХрд▓
  • uiрд╕рд┐рд▓реЗрдХреНрдЯрд╕реЙрд░реНрдЯ
  • рдпреВрдЖрдИрдПрд╕рдУрдкрдирдХреНрд▓реЛрдЬрд╝

рдХреЛрдгреАрдп-рд╕рдВрд╕рд╛рдзрди $resource рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ $timeout
рдХреЛрдгреАрдп-рдлрд╝рд┐рд▓реНрдЯрд░ ( $window.setTimeout )

рдирдорд╕реНрддреЗ - рд╣рдо рдПрдХ рдмрджрд▓рд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ Zone.js рдФрд░ Angular рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ ETA рдирд╣реАрдВ рд╣реИ (рд╕рдкреНрддрд╛рд╣реЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛)ред рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ [email protected] рдРрдк рдХреЛ NgUpgrad рд╕реЗ [email protected] рдкрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд░рддрд╛ рд╣реВрдВ
рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ @ рдореИрдЯрд╡рд┐рд▓реНрд╕рди 1024 рдФрд░ @tonybranfort , рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрдкрдиреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕ рд╕рдордп рдХреЗ рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ browser.ignoreSynchronization = true/false; рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд╡рд░реНрдХрдЖрдЙрд░рдВрдб рдорд┐рд▓рд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдиреЗ рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪрдпрди рдХрд┐рдпрд╛, рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ:

it('should be able to pick option', function () {
        expect(myPage.optionSelected()).toBe(false);
        myPage.pickOption('Option 1');
        expect(myPage.anyOptionSelected()).toBe(true);
        expect(myPage.getSelectedOption()).toBe('Option 1');
});

рдЬрдм рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реБрдЖред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛрдгреАрдп-рдпреВрдЖрдИ-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реЗ рдПрдХ рдЯреВрд▓рд▓рд┐рдк рд╣реИ, рдЬрд┐рд╕рдореЗрдВ $timeout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/angular-ui/bootstrap/blob/master/src/tooltip/tooltip.js

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЛрдИ async рдХреЙрд▓ рдирд╣реАрдВ рд╣реИрдВред рддреЛ рдореИрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдирджреЗрдЦрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ:

it('should be able to pick a font', function () {
        browser.ignoreSynchronization = true;  // tell protractor do not waitForAngular
        expect(myPage.optionSelected()).toBe(false);
        myPage.PickOption('Option 1');
        expect(myPage.anyOptionSelected()).toBe(true);
        expect(myPage.getSelectedOption()).toBe('Option 1');
        browser.ignoreSynchronization = false;  // reset the flag
});

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рддрджрд╛рд░ рдмрдирд╛ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдПрд╕рд┐рдВрдХреНрд╕ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдп @vikerman - рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? https://github.com/angular/protractor/issues/4290#issuecomment -337094393

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди:

рдЗрд╕ рднрдВрдбрд╛рд░ рдореЗрдВ:

https://github.com/Innovic-io/protractor-angular-hybrid-app

рдпрд╣рд╛рдВ рдРрдк рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ:
https://github.com/Innovic-io/protractor-angular-hybrid-app/blob/master/src/models/angular.ts#L9

@vikerman рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдХреНрдпрд╛ рдЗрди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХреВрдВ?

рд╕реЗ : рдХрд╛рд╕реНрдЯрдЕрд╡реЗ (рдПрд╕?) рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдХреЗ рджреНрд╡реАрдк рдкрд░ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдЕрдВрдХ #4290 . рджреНрд╡рд╛рд░рд╛ рдлрдВрд╕реЗ
рдкреНрд░рддрд┐ : @vikerman @juliemr

рдЕрд╣реЛ! рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдкрдбреЗрдЯ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ? 16 рдЕрдХреНрдЯреВрдмрд░ рдХреЛ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ "рд╕рдкреНрддрд╛рд╣реЛрдВ рдХреЗ рдХреНрд░рдо" рдореЗрдВ рдПрдХ рдИрдЯреАрдП рдерд╛ред рдпрд╛, рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХреЗрдВред

рдпреЗ рд╡реЗ рд░рд╛рдлреНрдЯ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

  • рд╕рднреА angular-ui-bootstrap / ui-select рдХреЛ рдмрджрд▓реЗрдВ ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рдкреЙрдк рдЕрдк рд╣реЛрдЧрд╛ рдФрд░ рдореИрдВ рдЙрд╕ рдХрд╛рдо рдХреЗ рдмрд╛рдж рднреА рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдкрд░ рдЕрдЯрдХрд╛ рд░рд╣реВрдВрдЧрд╛ред рд╕рдмрдХ рд╕реАрдЦрд╛ : рддреГрддреАрдп рдкрдХреНрд╖ рдШрдЯрдХреЛрдВ рдХреЛ рдореЗрд░реЗ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯреЗрдВред
  • waitForAngularEnabled(false) рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ @vladotesanovic рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЕрднреА рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ waitForAngularEnabled рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдПред
  • рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕/рдПрдВрдЧреБрд▓рд░ рд╕рд╛рдЗрдб рдмрд╛рдп рд╕рд╛рдЗрдб рдЗрдВрдХреНрд░реАрдореЗрдВрдЯрд▓ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рдРрдк рдХреЛ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ : рдирд╣реАрдВ, рдмрд╕ рдореЗрд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
  • рдХреЛрдгреАрдп рдХреЗ рдмрдЬрд╛рдп Vue рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВ ред рд╕реВрдЪреА рдореЗрдВ рдЙрдЪреНрдЪ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рджреЛрдиреЛрдВ AngularJs рдХреЗ рд╕рд╛рде рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХрдардкреБрддрд▓реА рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рд╕рднреА рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ - рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░рдгрдиреАрддрд┐рдХ рджрд┐рд╢рд╛ рд╣реИред
  • рдпрд╛ #4290 рд╕реЗ рдПрдХ рд╕реБрдзрд╛рд░ рдФрд░ рдореИрдВ ngUpgrad рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрди рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)

рд╣рдорд╛рд░реА рдЯреАрдо рд╣рдорд╛рд░реЗ рдЬрдЯрд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ рдФрд░ NgUpgrad рдХреЗ рд╕рд╛рде рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЙрди рд╕рднреА рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдирд╣реАрдВ рдирд┐рдкрдЯ рд╕рдХрддреЗ рдЬреЛ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВред

рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рд╣реИрдВ? рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдореЗрдВ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдХреЛрдгреАрдп рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд░рдЦ рд╕рдХреЗрдВред

@tonybranfort : рдареАрдХ рдЙрд╕реА рдирд╛рд╡ рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк... рд╣рдо ui-select рдФрд░ angular-ui-bootstrap рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИрдВ - рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрдиреНрдирдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рдЕрд╡рд░реЛрдзрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкрд╣рд▓ рдХрд░ рджреА рд╣реИ, рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЕрдкрдбреЗрдЯ рд░рдЦреЗрдВ! рдореИрдВ

рд╣рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╕реЗ рдХреЛрдИ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╣рдо рдЕрдкрдиреЗ рдРрдк рдХреЛ рдПрдВрдЧреБрд▓рд░ рд╡реА 1 рд╕реЗ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдореЗрдВ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВ рдФрд░ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдирдлрд░рдд рд╣реИ рдХрд┐ рд╡реА 1 рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЕрдм рддрдХ рдПрдВрдЧреБрд▓рд░ рд╡реА 5 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рдореЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╡реЛрдЯ рдбрд╛рд▓рддреЗ рд╣реБрдП, рд╣рдо рдЕрдкрдиреЗ рдРрдк рдХреЛ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдкреВрд░реЗ рд╕реВрдЯ рдХреЛ рдЕрдзрд┐рдХ рдЬреЛрдЦрд┐рдо рдореЗрдВ рдбрд╛рд▓реЗ рдмрд┐рдирд╛ рдЗрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП waitForAngularEnabled(false) рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЖрд╡реЗрджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рднреА рдорд╛рд░рд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ $ рдЕрдВрддрд░рд╛рд▓ рд╕реЗрд╡рд╛ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред рдХрднреА-рдХрднреА рдЪрд╛рдВрджрд╛ рдЙрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдирд╣реАрдВ - рдореБрдЭреЗ рдЕрднреА рддрдХ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдХрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ (рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдпрд╛ рдирд╣реАрдВ)

рд╣рд╛рдп @vikerman - рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдХреЛрдИ рдЦрдмрд░ рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рджреЗрддреА рд╣реИ рдХрд┐

рдпрд╣рд╛рдВ рд╡рд╣реА рдореБрджреНрджрд╛ред

@vikerman рдХреНрдпрд╛ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ?

рд╣рдо рдЙрдиреНрд╣реАрдВ рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рд╣реЛред

рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдХреНтАНрдпрд╛ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирдЬрд░ рдЖ рд░рд╣реА рд╣реИ?

рд╣рдо рдПрдВрдЧреБрд▓рд░ рдФрд░ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдореЗрдВ рдЯрд╛рд╕реНрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдХрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрд╕рд┐рдВрдХ рдЯрд╛рд╕реНрдХ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред

@heathkit рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИред

рдпрд╣ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрдВ рдЬрд┐рдирдХрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдкреБрд░рд╛рдирд╛ рд▓рдЧрддрд╛ рд╣реИ: https://www.protractortest.org/#/system -setupред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ $timeout рдХреЛ $interval рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВред
рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╣рд╛рдБ рд╣реИрдВ: http://www.protractortest.org/#/timeoutsред рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рдХрд┐ рдЙрдирдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг "рдХреЛрдгреАрдп рд╕рдВрдХрд░ + рдЪрд╛рдВрджрд╛" рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдЗрд╕рдиреЗ рдореЗрд░реА рдорджрдж рдХреАред рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: https://github.com/ui-router/angular-hybrid/issues/39#issuecomment -309057814

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╣рдордиреЗ рдереЛрдбрд╝реА рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рд╣реИрдВред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрдирдд angularjs рджреНрд░рд╖реНрдЯрд╛/рдкрд╛рдЪрди рдЪрдХреНрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдирдВрдд рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдЪрдХреНрд░ рд▓реВрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдПрдХ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рд╛рде 1 рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рдЕрдЧрд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рджреНрд░рд╖реНрдЯрд╛ рджреЗрдЦреА рдЬрд╛ рд░рд╣реА рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рджреНрд░рд╖реНрдЯрд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдЖрджрд┐ред рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рдХреНрд░реЛрдо рдореЗрдВ рдХреЗрд╡рд▓ рджреЗрд╡ рдЙрдкрдХрд░рдг рдЦреЛрд▓реЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдЬрд╛рдПрдВ, рдХреБрдЫ рд╕реЗрдХрдВрдб рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ NgZone рдХреЙрд▓ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд░рд╣реА рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдирдВрдд рдкрд╛рдЪрди рдЪрдХреНрд░ рд╣реИред рдХреЙрд▓ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ

рдЖрдк рд╕реНрдерд╛рдиреАрдп рдЬрд╝реЛрди.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЯрд╛рдЗрдордЖрдЙрдЯ/рдЕрдВрддрд░рд╛рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛:

try {
  throw new Error("track");
} catch(err) {
  console.debug(err);
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдХреЛрдб рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрддрд╛ рд╣реИ!

@vikerman рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ? рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдЕрдкрдиреА рд░рд╛рдп рджреЗрдВ рдХрд┐ рдЗрд╕реЗ рдХрд┐рддрдиреА рдЬрд▓реНрджреА рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдзрдиреНрдпрд╡рд╛рджред

рдЖрдк рд╕реНрдерд╛рдиреАрдп рдЬрд╝реЛрди.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЯрд╛рдЗрдордЖрдЙрдЯ/рдЕрдВрддрд░рд╛рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛:

try {
  throw new Error("track");
} catch(err) {
  console.debug(err);
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдХреЛрдб рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрддрд╛ рд╣реИ!

рдЯрд╛рдЗрдордЖрдЙрдЯ/рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдХрд╣рд╛рдВ рд░рдЦреЗрдВрдЧреЗ?

@maurycyg рдкреИрдЪрдЯрд╛рдЗрдорд░ -> рдкреИрдЪрдореЗрдереЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд╛рд▓

рдпрд╣ рдзрд╛рдЧрд╛ рджреЗрдЦрдХрд░ рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

$timeout рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЗрд╕реЗ $interval (рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП) рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ (рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЪреЗрдХ)ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛрдгреАрдп-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдШрдЯрдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рдереА, рдЬрд┐рд╕реЗ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ 0 рд╡рд┐рд▓рдВрдм рдХреЗ рд╕рд╛рде $timeout рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред

app.config(function($provide) {
    function isUnderProtractor() {
        var nav = window.navigator;
        var lowercasedUserAgent = nav.userAgent;
        return !lowercasedUserAgent || lowercasedUserAgent.contains('protractor');
    }

    if (isUnderE2ETest()) {
        $provide.decorator('$timeout', ['$interval', '$delegate', function($interval, $delegate) {
            var newTimeout = function(fn, delay, invokeApply, pass) {
                if (!delay)
                    return $interval(fn, delay, 1, invokeApply, pass);
                else
                    return $delegate(fn, delay, invokeApply, pass);
            };
            newTimeout.cancel = $delegate.cancel;
            return newTimeout;
        }]);
    }
}

рдЬрд╝реЛрди.рдЬреЗрдПрд╕ v0.8.9 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╕реЗ рд╡реЗрдм рдПрдкреАрдЖрдИ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреИрдЪрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
https://github.com/angular/zone.js/blob/master/MODULE.md

рдиреАрдЪреЗ рджреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЬрд╝реЛрди-flags.ts рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ
(window as any).__Zone_disable_timers = true;

рдЗрд╕реЗ Zone.js . рд╕реЗ рдкрд╣рд▓реЗ polyfills.ts рдореЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВ

import './zone-flags';
import 'zone.js/dist/zone';  // Included with Angular CLI.

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрд╝реЛрди рдЯрд╛рдЗрдорд░ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрддрд╛ рд╣реИ, (рдЙрджрд╛ред asyncValidators)ред рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдмрдВрджрд░-рдкреИрдЪрд┐рдВрдЧ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред

platformBrowserDynamic().bootstrapModule(AppModule)
.then((moduleRef: NgModuleRef<AppModule>) => {
  const ngZone: NgZone = moduleRef.injector.get(NgZone);
  const originalSetTimeout = window.setTimeout;
  (window as any).setTimeout = function setTimeout(fn, ms) {
    return ngZone.runOutsideAngular(() => {
      return originalSetTimeout(() => {
        ngZone.run(fn);
      }, ms);
    });
  };
})

рд╢рд╛рдпрдж рд╕рдорд╕реНрдпрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдореЗрдВ рд╣реА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рд╣реИред

рдПрдВрдЧреБрд▓рд░ рдЬреЗрдПрд╕ рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдВрдЧреБрд▓рд░ 2+ рд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝реЛрди.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЧрд┐рд░рдиреЗ рд▓рдЧрд╛ред

рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдЕрдЧрд▓реА рдкрд░реАрдХреНрд╖рдг рдХреНрд░рд┐рдпрд╛ рддрднреА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд┐рд░ рд╣реЛред рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдПрдВрдЧреБрд▓рд░ рдЬреЗрдПрд╕ рднрд╛рдЧ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдПрдВрдЧреБрд▓рд░ 2+ рднрд╛рдЧ рдХреА рд╕реНрдерд┐рд░рддрд╛ред рджреЛрдиреЛрдВ рднрд╛рдЧ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдХреЛрдгреАрдп рдЬреЗрдПрд╕ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ $$testability.whenStable рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдгреАрдп 2+ рдХреА рд╕реНрдерд┐рд░рддрд╛ window.getAngularTestability(...).whenStable рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдк рдкреНрд░реЛрдЯреИрдХреНрдЯрд░ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП debugger; рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ WaitForAngular _\node_modules\protractor\built\clientsidescripts.js_ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ;
рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ Angular2+ рдЬрд╝реЛрди рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП , рд╕рднреА рдорд╛рдЗрдХреНрд░реЛ рдЯрд╛рд╕реНрдХ рдФрд░ рдореИрдХреНрд░реЛ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЕрдм рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХреЛрдгреАрдп 2+ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдореЗрд╢рд╛ рдЕрд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рди рд╣реЛ рдЬрд╛рдП рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЧрд┐рд░ рдЬрд╛рдПред рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдВрдЧреБрд▓рд░ рдЬреЗрдПрд╕ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдФрд░ рдпрд╣ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдВрдЧреБрд▓рд░ 2+ рдЬрд╝реЛрди рдХреА рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕:
рдЪреВрдВрдХрд┐ рдмрд╣реБрдд рдХрдо рд╕рдордп рдерд╛ рдФрд░ рдореИрдВ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВрдиреЗ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬреЛ рдПрдВрдЧреБрд▓рд░ 2+ рдЬрд╝реЛрди рд╕реЗ рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗ рдЧрдпрд╛ред

    $provide.decorator("$animateCss", ["$delegate", createDecorator]);
    $provide.decorator("$http", ["$delegate", createDecorator]);
    $provide.decorator("$timeout", ["$delegate", createDecorator]);
    $provide.decorator("$interval", ["$delegate", createDecorator]);
    $provide.decorator("$q", ["$delegate", createDecorator]);
    $provide.decorator("$xhrFactory", ["$delegate", createDecorator]);
    $provide.decorator("$templateRequest", ["$delegate", createDecorator]);
    $provide.decorator("$httpBackend", ["$delegate", createDecorator]);

    $provide.decorator("$animate", ["$delegate", createDecorator]);
    $provide.decorator("$rootScope", ["$delegate", createDecorator]);
    $provide.decorator("$templateCache", ["$delegate", createDecorator]);
    $provide.decorator("$browser", ["$delegate", createDecorator]);

    function runInRootZone(fn, ...args) {
        if (window.Zone.current.parent) {
            return window.Zone.current.parent.run(() => runInRootZone(fn, ...args));
        }

        return fn(...args);
    }

    function decorate(decorator, $delegate) {

        const keys = Object.keys($delegate);
        for (let i = 0; i < keys.length; i++) {

            const key = keys[i];
            if (angular.isFunction($delegate[key])) {
                decorator[key] = createDecoratorForFunctionLikeService($delegate[key]);
            } else {
                if (decorator[key] !== $delegate[key]) {
                    decorator[key] = $delegate[key];
                }
            }
        }
    }

    function createDecoratorForFunctionLikeService($delegate) {

        function decorator(...args) {
            return runInRootZone($delegate, ...args);
        }

        decorate(decorator, $delegate);

        return decorator;
    }

    function createDecoratorForService($delegate) {

        decorate($delegate, $delegate);

        return $delegate;
    }

    function createDecorator($delegate) {
        if (angular.isFunction($delegate)) {
            return createDecoratorForFunctionLikeService($delegate);
        }
        return createDecoratorForService($delegate);
    }

рдпрджреНрдпрдкрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдордп рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдкрдиреЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдк рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдЬрд╝реЛрди (рд░реВрдЯ рдпрд╛ рдХреЛрдгреАрдп) рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП Angular2+ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЛ, рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ Angular2+ рдШрдЯрдХреЛрдВ рдХреЛ рд░реВрдЯ рдЬрд╝реЛрди рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред ngUpgrad рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░рдгреЛрдВ рдХреЗ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рдореВрд▓ рдореБрджреНрджреЗ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд╕рд╛рде рджреВрд╕рд░рд╛ рдлрд┐рдХреНрд╕ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдХреЛрдб рдЬреЛрди рдХреЛ рдЕрд╕реНрдерд┐рд░ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЬрд╝реЛрди.рдЬреЗрдПрд╕ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ _TaskTrackingZoneSpec_ (_\node_modules\zone.js\dist\task-tracking.js_), рдЬреЛ рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рдЬрд╝реЛрди рдореЗрдВ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдБ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ( creationLocation )ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрдк рдХреЗ рдПрдВрдЧреБрд▓рд░ 2+ рднрд╛рдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдВрдЧреБрд▓рд░ рдЬрд╝реЛрди (window as any).a9Zone = (upgradeModule as any).ngZone._inner; рд╕реЗрд╡ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╣реАрдВ рдЬреЛрдбрд╝реЗрдВ

$rootScope.$watch(function () {
    if (window.a9Zone) {
        console.log("Angular2+ task count:", window.a9Zone._zoneDelegate._taskCounts);

        // Optional.
        window.getAllAngularTestabilities().forEach(_ => {
            _.taskTrackingZone.macroTasks.forEach(t => {
                console.log(t, t.creationLocation);
            });
        });
    }
});

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдЬрд╣рд╛рдВ рдорд╛рдЗрдХреНрд░реЛрдЯрд╛рд╕реНрдХ рдФрд░ рдореИрдХреНрд░реЛрдЯрд╛рд╕реНрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╝реЛрди рдореЗрдВ рд╣реИрдВ (_microTasks.lenght! == 0 && macroTasks.lenght! == 0_)ред

рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдВрдЧреБрд▓рд░ рдЬрд╝реЛрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ ngZone.runOutsideAngular рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд░реВрдЯ рдЬрд╝реЛрди рд╡рд╣рд╛рдБ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬрд╣рд╛рдБ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдПрдВрдЧреБрд▓рд░ рдЬрд╝реЛрди рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЧрд┐рд░реЗрдЧрд╛ред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЗ рд╕рд╛рде waitForAngular рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╣реИрдХ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред

onPrepare: function() {

            var script = "var callback = arguments[arguments.length - 1];" +
                "angular.element(document.querySelector(\"body\")).injector()"+
                ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)");

            browser.waitForAngular = function() {
                return browser.executeAsyncScript(script)
            };
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

rafalf picture rafalf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

andyman3693 picture andyman3693  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tmeneau picture tmeneau  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

codef0rmer picture codef0rmer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mvolkmann picture mvolkmann  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ