Protractor: $ рд╕рдордп рд╕рдорд╛рдкреНрддрд┐ () рдХреЗ рдЗрдВрддрдЬрд╛рд░ рд╕реЗ рдмрдЪреЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЕрдХреНрддреВре░ 2013  ┬╖  59рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/protractor

рд╣рдорд╛рд░реЗ рдРрдк рдореЗрдВ рд╣рдо рдХреБрдЫ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "рдкреЙрдкрдЕрдк" рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдкреЙрдкрдЕрдк рд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рд▓рдЧрднрдЧ 20 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ (рдЬрд┐рд╕рдХреЗ рдмрд╛рдж $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ)ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Protractor $ timeout рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм $ рдЯрд╛рдЗрдордЖрдЙрдЯ _timed out_ рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рддрддреНрд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред

рдЗрд╕реЗ рдХреИрд╕реЗ рдмрд╛рдИрдкрд╛рд╕ / рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕реБрдЭрд╛рд╡? (рд╣рдо _need_ рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╣реА "рдкреЙрдкрдЕрдк" рд╕рдВрджреЗрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдзрдиреНрдпрд╡рд╛рдж

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

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

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

рдЖрдк ptor.ignoreSynchronization рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЪрдВрдЪрд▓рддрд╛ рдЖ рд╕рдХрддреА рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдХреЛрдгреАрдп 1.2rc3 рдкрд░, рдЕрдм interval рд╕реЗрд╡рд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Protractor рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рджреЗрдЦреЗрдВ https://github.com/angular/angular.js/commit/2b5ce84f7b41fca24707e163ec6af84bc12e83)ред рдЖрдк рдПрдХ рдЕрдВрддрд░рд╛рд▓ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ 1 рдмрд╛рд░ рджреЛрд╣рд░рд╛рдПрдЧрд╛ред

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

$interval рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЪрд╛рд▓ рдЪрд▓реАред

  $interval(function() {
    // ...
  }, duration, 1);

рдпрд╣ рдЕрдм рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдмрд╣реБрдд рд╕рдВрдЬреАрджрд╛ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдкреЙрдкрдЕрдк рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдП (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "x" -рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ):

  afterEach(function() {
    removeLogMessagesFromDOM();
  });

@ рдореИрдХреЗрд╡рд┐рдХ : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ e2e рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рд╛рднрд╛рд░ @juliemr

рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ $timeout s рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛?

рд╕рд╛рде рд╣реА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ $interval рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ред рдереЛрдбрд╝реЗ рд╕реЗ рдореЛрдбрд╝ рдХреЗ рд╕рд╛рде рдЖрдк рдЗрд╕реЗ $timeout рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдмрдЪрдд рдХреЗ рдмрд╛рдж рд╕рдлрд▓рддрд╛ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛред рдпрд╣ рд╕реВрдЪрдирд╛ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛рдИ рдЬрд╛ рд░рд╣реА рдереАред рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЫрд┐рдкреЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ:

$timeout(function() {
    //hide notification
}, 3000);

рдЙрдкрд░рд╛рдВрдд:

var intervalCanceller = $interval(function() {
    //hide notification
    $interval.cancel(intervalCanceller);
}, 3000);

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡реИрдз рдореБрджреНрджрд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ? рдореИрдВ рдмрд╕ рдЦреБрдж рдЗрд╕ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ $interval рдмрдЬрд╛рдп $timeout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЕрдзрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВ $interval рд╕реЗ $timeout $interval рдмрджрд▓реВрдВред

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

username = element(select.model("user.username"))
password = element(select.model("user.password"))
loginButton = $('button[type=\'submit\']')
toast = $('.toaster')
# Check the toaster isn't displayed initially
expect(toast.isDisplayed()).toBe(false)  # This passes
username.sendKeys("redders")
password.sendKeys("wrongpassword")
loginButton.click()
toastMessage = $('toast-message')
# Check the toaster is now displayed
expect(toast.isDisplayed()).toBe(true)   # This passes
expect(toastMessage.getText()).toBe("Invalid password")  # This fails

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рд░реНрдХрдЕрдк рдпрд╣рд╛рдВ рд╣реИ (рдЬреЗрдб)

.toaster(ng-show="messages.length")
  .toast-message(ng-repeat="message in messages") {{message.body}}

рдЕрд╕рдлрд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ toastMessage = $('toast-message') рдХрд┐рд╕реА рднреА рддрддреНрд╡ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╢реБрд░реВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдм .toast-message рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ?

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

рдореИрдВ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ редignoreSynchronization = true; рд╕рд╣рд╛рдпрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреЛрдб рдХреЛ $ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдИ 2 рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдбред

@ vytautas-pranskunas- рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИ рдЕрдЧрд░ ignoreSynchronization рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред

рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдЬрдм ignoreSynchronization рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдПрдХ рдмрд╛рд░ рд╢реЛ рд╕рдВрджреЗрд╢ рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рддрдХ рд░рд╣рдиреЗ рдХреЗ рдмрд╛рдж рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рджреЛ рдкрд░рд┐рджреГрд╢реНрдп рдорд┐рд▓реЗ - рдкрд╣рд▓реЗ ignoreSynchronization рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - рдирд╣реАрдВ

1) рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд▓рд┐рдХ рдмрдЯрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореИрдВ expec(message).tobe(...) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ignoreSynchronization рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред

2) рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ (рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдореЗрд░реЗ рдЖрдЧреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рддрдм рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ browser.wait(by.(....).isPresent(), n) рдпрд╣рд╛рдБ ignoreSynchronization рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИ (рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп browser.wait рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдЖрдЙрдЯрдкреБрдЯ рджрд┐рдЦрд╛рдКрдВрдЧрд╛)

waits
waits
waits (element appears)
browser waits freezes for 5 seconds
after element disappears it continue
wait
wait
wait

рддреЛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрднреА рднреА рддрддреНрд╡ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рдлреНрд░реАрдЬ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд▓рдВрдХрд░ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рдЬрдирди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдердирдХ

рдЖрдк рд▓реЙрдЧ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВ рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдкрдирд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЫрджреНрдо рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ
(html рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдФрд░ рдПрдирдЬреА-рд░рд┐рдкреАрдЯ рд╣реИ)

constructor(){
$scope.$on('globalMessageAdded', () => {
            $scope.globalMessages = this.getMessages();
        });
}

callServer(){
//interval here acts like server delay
   $interval(()=> {
     $rootScope.messages.push('test messages');
      this.$rootScope.$broadcast('globalMessageAdded');
   }, 3000, 1);
}

getMessages = () => {
        var newMessages = <ISpaGlobalMessage[]>[];
        _.forEach(this.$rootScope.globalMessages, item => {
            newMessages.push(item);
//because of this timeout browser.wait stops waitng for 5 seconds
            this.$timeout(() => {
                this.remove(item);
                this.$rootScope.$broadcast('globalMessageRemoved');
            }, 5000);
        });

        return newMessages;
    }

рдФрд░ рдлреИрд▓рд╛ рд╣реБрдЖ рднрд╛рдЧ

element('button').click();
browser.ignoreSynchronization = true; //tried with and without it
browser.wait(() => element(by.css('.alert-success')).isPresent(), 10000000);
browser.ignoreSynchronization = false;

other code that should be executed after successful message

browser.wait рдХрднреА рднреА рдЙрд╕ рддрддреНрд╡ рдХреЛ рдирд╣реАрдВ рдЦреЛрдЬрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡ рдореМрдЬреВрдж рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝ рдЪреЗрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдХреНрдпреЛрдВ "browser.ignoreSynchronization = false?" Browser.wait () рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░рд╛ рдХреЛрдб

        var el = element(by.css('.popup-title.ng-binding'));
        browser.ignoreSynchronization = true; 
        browser.wait(function (){
            return el.isPresent();
        }, 10000);
        var popupMsg = el.getText();
        expect(popupMsg).toEqual('something...');
        browser.ignoreSynchronization = false; // not work, if take out this statement, it works again

рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрд╛рдЯреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЯреЛрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ npm рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ $ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реВрдВ рдХрд┐ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ рдПрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджреВрд╕рд░реЗ рдХрд╛ рдирд╣реАрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрд╡рдпрдВ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рдХреЛрдгреАрдп-рдпреВрдЖрдИ / рдмреВрдЯрд╕реНрдЯреНрд░реИрдк # 3982 рдкрд░ рд╣реИ рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ $ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╕реНрд╡реИрдк рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣рд╛рдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдЯреЛрд╕реНрдЯ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЧреБрдЬрд╝рд░рд╛ред

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП $interval рдХреЗ рдмрдЬрд╛рдп $timeout рдПрдХ рд╕реБрдЦрдж рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдФрд░ browser.ignoreSynchronization = true рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдХреЛрдИ рддреБрдЪреНрдЫ рдпрд╛ рд╡рд┐рдЪрд╛рд░?

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

+1 рд╣рдореЗрдВ рдПрдХ рдлрд┐рдХреНрд╕ рднреА рдЪрд╛рд╣рд┐рдПред

рдорд╛рдирд╛ред рдЯреЗрд╕реНрдЯ рдлрд┐рдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред +1

+1, рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рднреА рдЪрд▓рд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЙрдЯреЗрдХреНрдЯрд░ рдЯрд╛рдЗрдордЖрдЙрдЯреНрд╕ рдХреЛ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

IgnSynchronisation рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪреАрдЬреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ browser.waitForTimeouts(); рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд API рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

+1ред рдПрдХ рддрдп рдХреА рдЬрд░реВрд░рдд рд╣реИред рдХреНрдпреЛрдВ рд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдмрджрд╕реВрд░рдд workarounds рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

+1

+1, рдкрд░рддрджрд╛рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ .. рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

+1 @ vytautas-pranskunas рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ- рд╣рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣ рд╕реНрд╡рдпрдВ рдХрд╛рдо рдХрд░ рд╕рдХреЗ ...ред

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ browser.ignoreSynchronization = true рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

browser.ignoreSynchronization = true;
expect( elem.getText() ).toEqual( "foo" );
browser.ignoreSynchronization = false;

рддрдм рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: рдпрд╣ рдЕрднреА рднреА рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдФрд░ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ getText рдФрд░ expect рд╡рд╛рджреЗ рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рддрдм рддрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╣рд▓реЗ рд╣реА рд╡рд╛рдкрд╕ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдкрд┐рдЫрд▓реЗ рд╡рд╛рджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ then рдХреЙрд▓рдмреИрдХ рдкрд░ рд╡рд╛рдкрд╕ рддреБрд▓реНрдпрдХрд╛рд▓рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдЯреАрдо рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЙрди рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рдмрдлрд░ рдХреЗ рд╣реЛрдиреЗ рдкрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

browser.setIgnoreSynchronization( true );
expect( elem.getText() ).toEqual( "foo" );
browser.setIgnoreSynchronization( false );

рд╡реИрд╕реЗ рднреА, рдореИрдВ рднреА рдХрдИ рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ: рдПрдХ рдмрдбрд╝реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдЯреВрд▓рдЯрд┐рдкреНрд╕, рдореЛрдбрд▓, рдПрдирд┐рдореЗрд╢рди рдЖрджрд┐ рд╣реИрдВред рд╣рдордиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ browser.ignoreSynchronization = true; рд╕рд╛рде рд╕рд┐рдВрдХ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред

+1 $ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╣реИрдХ рд╣реИ, рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ

+1 рдЗрд╕ рдмрдЧ рдиреЗ рдореБрдЭреЗ рдЗрддрдирд╛ рджреБрдЦреА рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд╕рдВрд╡рд╛рдж рд╢реБрд░реВ рдХрд░реЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рджрд░реНрдЬрди рдмреЛрд╡рд░ рдФрд░ рдПрдирдкреАрдПрдо рдХреЛрдгреАрдп рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ рдЬреЛ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕реИрдХрдбрд╝реЛрдВ (!) рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ, рд╕рд╛рде рд╣реА рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ 45 рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдХреЛрдб рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдФрд░ рд╡рд╛рдЬрд┐рдм), рд╣рд╛рд▓рд╛рдБрдХрд┐, рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдХреЛрдб рдмрджрд▓рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╡рд╛рд▓ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ: рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдХреЛрдгреАрдп рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреИрдЪ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реИред рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдЬрдм рдмрдЧ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдФрд░ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╣реИ, рди рдХрд┐ рдмрд╛рд╣рд░ рдХреЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗред

рдХреГрдкрдпрд╛ рдЗрд╕ рдкрд░ рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░реЗрдВред

+1

рдпрд╣ рдмрдЧ рдирдореВрдирд╛ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП e2e рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ,

1) рдЦреЗрддреЛрдВ рдХреЛ рднрд░реЗрдВ рдФрд░ рдХреБрдЫ рдлрд╝реЙрд░реНрдо рдЬрдорд╛ рдХрд░реЗрдВ, рдЬреЛ рдХрдИ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛
* рд╕реНрдЯреЗрдЯрд╕ рдореИрд╕реЗрдЬ рд▓рд┐рдВрдХ, рдЬреЛ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ
* рдЕрд▓рдЧ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ
2) рдЕрдЧрд▓рд╛ рдЬрдм рдЖрдк рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдкреЙрдк рдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП

рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕реНрдЯреЗрдЯрд╕ рдореИрд╕реЗрдЬ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ .ignoreSynchronization = true рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рд▓рд┐рдВрдХ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдкреЙрдк рдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдФрд░ рдХреБрдЫ Google рдЙрддреНрддрд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП $ рд╕рдордп рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдЬрд╛рдБрдЪ рдХреА, рдЕрдм рдпрд╣ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдиреБрд░реЛрдз рд╣реИ рдХрд┐ рд╣рдо рд╣рд░ рдмрд╛рд░ $ рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рдПрдХ рддрддреНрд╡ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЙрдкрд░реНрдпреБрдХреНрдд рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ $ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП window.setTimeout рдФрд░ window.clearTimeout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдмрд╣реБрдд рдХреЛрдгреАрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╛рдЪрди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди $ рдЕрдВрддрд░рд╛рд▓ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ

рдареАрдХ рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реБрдП, рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА?

+1

рдпрд╣ рдореБрдЭреЗ рдкрд╛рдЧрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛ (рдкреНрд░реЛрдЯреНрд░реЗрдХреНрдЯрд░ рдиреЛрдм рдпрд╣рд╛рдБ) рдЬрдм рддрдХ рдореИрдВ рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧрдВрджреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдирд╣реАрдВ рдЖрдпрд╛:

beforeEach(function () { browser.ignoreSynchronization = true; });
afterEach(function () { browser.restart(); });

рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд░ рд░рд╣рд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдмрд╣реБрдд рдзреАрдорд╛ рдирд╣реАрдВ рд╣реИред

+1

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

рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ browser.ignoreSynchronization = true; рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ ред рдЕрднреА рдореИрдВ рдкреГрд╖реНрда рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ:

describe('something', function() {
  it('should do....', function() {
    var fooPage = new FooPage();
    fooPage.visit();
    var barPage = fooPage.clickCreate();  // does some API call, then redirects to barPage
    // at this point, enough things are happening that it is impossible to interact with barPage.
    // Protractor locks up.
    // barPage makes other API call & opens WebSocket
    barPage.clickBaz();  // nope.  will timeout every time.
  });
});

@benjaminapetersen рдореЗрд░реЗ рдорджрджрдЧрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

btn1.click();         // Triggers many things and eventually displays page2
wait.forURL('page2'); // wait for page2 to be loaded before moving on
$('.btn1').click();   // this does some async job and eventually displays btn2
wait.forElement('.btn2');
$('.btn2').click();

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП wait.forElement рд╡рд╛рдкрд╕реА

browser.wait(() => elem.isPresent().then(p => p, () => {}), timeout, 'Not found');
// browser.wait(function() { return elem.isPresent().then(function(p) { return p;} , function() {}); }, timeout, 'Not found');

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ: рдореИрдВ рдПрдХ рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдореИрдВ рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ, рдЖрджрд┐ред рдЗрд╕ рддрд░рд╣ рд╕реЗ $ timeout рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рддреЗрдЬ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдпрд╣рд╛рдБ рдХреБрдВрдЬреА рдЖрдВрддрд░рд┐рдХ рд╡рд╛рджреЗ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдЗрд╕реЗ рдХреБрдЫ рдФрд░ рдкреНрд░рдпрд╛рд╕ рджреЗрдирд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ: рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП ExpectedConditions рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ рдЬрдм рдХреЛрдгреАрдп DOM рдиреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ng-if рд╢рд░реНрддреЗрдВ):

browser.wait(browser.ExpectedConditions.precenseOf(elem), timeout, 'Not found');

@floribon рднрдпрд╛рдирдХ, рдзрдиреНрдпрд╡рд╛рдж!

@ рдЬреБрд▓рд┐рдореНрд░ рдпреВ рдореБрдЭреЗ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдореБрдЭреЗ [email protected]

@juliemr рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣реЗ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $ рдЕрдВрддрд░рд╛рд▓ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдЕрднреА рднреА рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдгреАрдп рдХреЛрдб рд╣реИ
рдпрд╣ред $ рдЕрдВрддрд░рд╛рд▓ () (> =)ред $ http.get(рдпрд╣ред рдЙрдкрд╕рд░реНрдЧ (рдпреВрдЖрд░рдПрд▓), рд╡рд┐рдиреНрдпрд╛рд╕), реж, рез)
рдкреНрд░реЛрдЯреНрд░реЗрдХреНрдЯрд░ рдЕрднреА рднреА $ http рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдЪрд╛рдВрджрд╛ 5.x рдФрд░ angualrjs 1.6x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреНрдпрд╛ рддреБрдо рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реЛ?

+1, рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

+1

+1

+1

+1

+1

+1

рдЗрд╕ рдпреБрдХреНрддрд┐ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдФрд░ рдЪреАрдпрд░реНрд╕ @floribon рдХреЛ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред

    // screenshot-spec.js

    // a close button that appears on the md-toast template
    const closeToastButton = $('[data-automation="toast-close"]')
    const cond = protractor.ExpectedConditions
    function waitToastShow() {
        return browser.wait(cond.elementToBeClickable(closeToastButton), 5000)
    }
    function waitToastHide() {
        return browser.wait(cond.invisibilityOf(closeToastButton), 5000)
    }

    screenshot = name => browser.takeScreenshot().then(/* save fn */)

    describe('a suite ... ', () => {
        it('takes screenshots of an md-toast once shown and after hidden', function () {
            // ... actions that launch an md-toast using $mdToast.show({ ... })
            browser.ignoreSynchronization = true
            waitToastShow().then(() => {
                screenshot('toast-showing.png')
                waitToastHide().then(() => {
                    screenshot('toast-hidden.png')
                    browser.ignoreSynchronization = false;
                })
            })
        });
    }

рд▓реЛрдЧ рдХреИрд╕реЗ рдореИрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
`
рдпрд╣ ('1-рдПрдХ рдИрдореЗрд▓ рдкрд░ рднреЗрдЬреЗ рдЧрдП рдкрдВрдЬреАрдХрд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП', рдлрд╝рдВрдХреНрд╢рди (рдХрд┐рдпрд╛) {

// setTimeout(function () {
            flow.execute(browser.params.getLastEmail)
                .then(function (email) {
                    expect(email.subject)
                        .toEqual('[email protected] submitted feedback');
                    expect(email.headers.to)
                        .toEqual('[email protected]');
                    expect(email.html.includes('User feedback details: accountId: 12345, related To: dashboard, description: ' + D.feedbackMsg + ''))
                        .toEqual(true);
                    console.log(email.html);
                    // done();
                });


    });`
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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