Protractor: рдХреЛрд░ (рдХреЛрд░): рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ

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

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

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд░реНрдХ-рдЕрд░рд╛рдЙрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЬреИрд╕реЗ browser.get рдпрд╛ browser.refresh рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

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

@sjelin рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдПрдВрдЧреЗ?

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рдЗрди рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдлрд▓ рд▓реЙрдЧ рдЗрди рдХреЗ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред

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

@sjelin рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдПрдВрдЧреЗ?

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рдЗрди рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдлрд▓ рд▓реЙрдЧ рдЗрди рдХреЗ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рджреЛрдиреЛрдВ рдкреГрд╖реНрда рдХреЛрдгреАрдп рдкреГрд╖реНрда рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдкреГрд╖реНрда рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдмрд╕ browser.refresh рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдореИрдВ рдПрдХ рд╣рдлреНрддреЗ рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ POST рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рддреЛ browser.refresh() рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬрд╣рд╛рдБ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рд╣реЛрдЧрд╛:

(function (expectedUrl, timeout) {
    var loaded = false;

    browser.wait(function () {
        browser.executeScript(function () {
            return {
                url: window.location.href,
                haveAngular: !!window.angular
            };
        }).then(function (obj) {
            loaded = (obj.url == expectedUrl && obj.haveAngular);
        });

        return loaded;
    }, timeout);
})(expectedUrl, timeout);

@ рддрд╕реНрд╕реЛрд╡рди , рдпрд╣ рдПрдХрджрдо рд╕рд╣реА рд╣реИ! рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдереА

рдЬрдм рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдмреЗрд╕реНрдпреВрд▓ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдореЗрд░рд╛ рдЯреЗрд╕реНрдЯ рдкреЗрдЬред рдХреНрдпрд╛ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдХрд╛рдлреА @patrickliechty рдирд╣реАрдВ рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ <a href='google.com'> ) рдФрд░ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ google.cm рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ

@juliemr рд╕рд╛рде @hankduan рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣рд╛рдБ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдм рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

@sjelin , рдХреНрдпрд╛ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА 3.1.1 рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ

рдПрдХ рдмреЗрд╣рддрд░ рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП +1ред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдЪрд╛рд░ рдХреЗ, рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЖрдЬ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рдж!

рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ !!! рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП

рдПрдХ рддрдп рдХреЗ рд▓рд┐рдП +1ред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рддрддреНрд╡ () рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред getText () рдРрдирдХ рдХреЗ рдмрд╛рд╣рд░ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд┐рдирд╛ () рд╣реБрдИ) () рд╣реБрдИ рд╣реИ - рдЪрд╢реНрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ div рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд╕рдм рдареАрдХ рд╣реЛ рдЧрдпрд╛ред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рддрдм рдорд┐рд▓рддреА рд╣реИ рдЬрдм \ рдиреЛрдб_рдореЙрдбрд▓ \ рдкреНрд░реЛрдЯреНрд░реЗрдХреНрдЯрд░ \ рдЙрджрд╛рд╣рд░рдг \ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓ рд░рд╣рд╛ рд╣реЛред

рдПрдВрдЧреБрд▓рд░ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдХреЛрдИ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ?

@Overdrivr рдЖрдк browser.ignoreSynchronization = true рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдгреАрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред

browser.ignoreSynchronization = рдореЗрд░реЗ рд▓рд┐рдП рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реВрдБред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпреВ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ редignoreSynchronization = false;

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЗрд╕ github рдореБрджреНрджреЗ рдХреА рдПрдХ рдХрдбрд╝реА рд╢рд╛рдорд┐рд▓ рд╣реИред

рдпрд╣реА рд╕рдм рдХреБрдЫ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ:

/**
 * Waits for MR job to complete.
 * <strong i="7">@param</strong> {string} url The GET URL to kick off the map reduce job.
 * <strong i="8">@return</strong> {!webdriver.promise.Promise}
 */
function waitForMapReduceJobToComplete(url) {
  browser.ignoreSynchronization = true;
  browser.get(url);
  $('a[href*="/mapreduce"]').click();
  browser.wait(()=> {
    console.log('wait');
    return $('#auto-refresh').isPresent();
  });
  browser.controlFlow().execute(function() {
    console.log('after wait, before click');
  });
  browser.wait(()=> {
    console.log('isDisplayed');
    return $('#auto-refresh').isDisplayed();
  });
  $('#auto-refresh').click();
  browser.controlFlow().execute(function() {
    console.log('after click');
  });

  browser.wait(() => {
    return $('.status-box').isPresent().then((isPresent)=> {
      if(isPresent) {
        return hasClass($('.status-box'), 'status-done')
            .then((containsClass) => {
              if(!containsClass) {
                return browser.refresh().then(() => false);
              }
              return true;
            });
      }
      return browser.sleep(constants.BROWSER_WAIT_MS)
          .then(() => false);
    })
  });

  return browser.controlFlow().execute(function() {
    browser.ignoreSynchronization = false;
  });
}
  fit('mapreduce job is idempotent', function() {
    var subBuildingUrl = '/xyz/#all';
    var mapReduceJob = '/import/xyz/';
    helpers.waitForMapReduceJobToComplete(mapReduceJob);

    browser.get(subBuildingUrl);
    var tableView = new TableView();
    var originalCount = 0;
    tableView.count().then((cnt)=>{
      originalCount = cnt;
    });

    tableView.deleteRowNumber(1);
    browser.sleep(5000);
    browser.controlFlow().execute(function() {
      expect(tableView.count()).toBeLessThan(originalCount);
    });

    helpers.waitForMapReduceJobToComplete(mapReduceJob);
    browser.get(subBuildingUrl);
    browser.controlFlow().execute(function() {
      tableView = new TableView();
      expect(tableView.count()).toEqual(originalCount);
    });
  });

// рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░реЗрдВ
рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХреЛрдгреАрдп рдРрдк рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рдПрдХ URL рдкрд░ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд╛рд░реНрдп рдмрдВрдж рдХрд░рддрд╛ рд╣реИ
рдкрдВрдХреНрддрд┐ рдЧрдгрдирд╛рдУрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ

// рдЕрдзрд┐рдирд┐рдпрдо
1 рд░рд┐рдХреЙрд░реНрдб рд╣рдЯрд╛рддрд╛ рд╣реИ
рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ

// рдЬреЛрд░ рджреЗрдВ
рдПрдХ рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рдПрдХ URL рдкрд░ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд╛рд░реНрдп рдмрдВрдж рдХрд░рддрд╛ рд╣реИ
_fails_ рджреВрд╕рд░реА рдмрд╛рд░ рдЬрдм рд╣рдо рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдкреНрд░реЗрдбрд┐рдХ рдЬреЙрдм рдбреЗрдЯрд╛ рдХреЛ рдкреБрди: рдмрдирд╛рддрд╛ рд╣реИ (рдбрд┐рд▓реАрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдЧрдгрдирд╛)ред

рдпрд╣рд╛рдБ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓реЙрдЧ рд╡рд┐рд╡рд░рдг рд╣реИ:

wait
after wait, before click
isDisplayed
isDisplayed
after click
[17:48:09] W/element - more than one element found for locator By(css selector, .status-box) - the first result will be used
[17:48:24] W/element - more than one element found for locator By(css selector, .status-box) - the first result will be used
[17:48:40] W/element - more than one element found for locator By(css selector, .status-box) - the first result will be used
[17:48:55] W/element - more than one element found for locator By(css selector, .status-box) - the first result will be used
wait
F

Failures:
  Message:
    Failed: Error while waiting for Protractor to sync with the page: "window.angular is undefined.  This could be either because this is a non-angular page or because your test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"
  Stack:

рдпрд╣ рд╣рдореЗрд╢рд╛ 'рд╡реЗрдЯ' рд▓реЙрдЧ рдкрд░ WaitForMapReduceJobToComplete рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдБ "рдкреНрд░рд▓реЗрдЦрд┐рдд" рд╣реИ: https://github.com/angular/protractor/issues/2787

Browser.wait рдХреЗ рдЕрдВрджрд░ рдЖрдкрдХреЛ ignSynchronization рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛ рдерд╛ред рдЬрд╣рд╛рдВ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рддреНрдпрдирд┐рд╖реНрдареАрдХрд░рдг рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

  browser.wait(()=> {
    browser.ignoreSynchronization = true;
    return $('#auto-refresh').isPresent();
  });

рдореЗрд░рд╛ рдЯреЗрд╕реНрдЯ рдЕрдм рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ browser.ExpectedConditions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддреЛ рдкреИрдЪ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

browser.wait(EC.visibilityOf(element), timeout, message);?

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

@azachar рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ:

browser.wait(() => {
  browser.ignoreSynchronization = true;
  return EC.visibilityOf(element);
}, timeout, message);

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ ignoreSynchronization рдЕрднреА рднреА рдЧрд▓рдд рд╣реИ рдЬрдм рддрдХ рдЖрдк рдЗрд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде # 2787 рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ред

рдЕрджреНрдпрддрди: рдпрджрд┐ рдЖрдк ignoreSynchronization рд╕реЗрдЯ / рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░реЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд░ рд╣реЛрддреА рд╣реИрдВред # 4061 рджреЗрдЦреЗрдВред

рдореИрдВ рдЗрд╕реЗ ignoreSynchronization рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ...ред

afterAll(function(){
    adminPage.header.logout();
    // FIXME: WTF why isn't even this working 100% of the time
    setTimeout(function(){
      expect(loginPage.isVisible()).toBeTruthy();
    }, 1000 )
  })

loginPage рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕реЗрдХрдВрдб рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред browser.wait рдереЛрдбрд╝реА рдорджрдж рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

@tassoevan рд╣рд╛рдп рджреЛрд╕реНрдд, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред () рдФрд░ рдЕрдкрдиреЗ рд╡рд┐рд╡рд░рдг рдХреА рддрд░рд╣ рдФрд░ рдЗрд╕реЗ рдХрд╣рд╛рдБ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

(function (expectedUrl, timeout) {
    var loaded = false;

    browser.wait(function () {
        browser.executeScript(function () {
            return {
                url: window.location.href,
                haveAngular: !!window.angular
            };
        }).then(function (obj) {
            loaded = (obj.url == expectedUrl && obj.haveAngular);
        });

        return loaded;
    }, timeout);
})(expectedUrl, timeout);

рдХреЛрдгреАрдп (2) рдореЗрдВ - рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ w / browser.get ('/') рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ;

import { browser, element, by } from 'protractor';

it('should display message saying app works', () => {
    browser.get('/');

    let title = element(by.id('title')).getText();
    expect<any>(title).toEqual('cool');
});

@Tassoevan рдХреЗ рд╢рд╛рдирджрд╛рд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдореЗрд░реЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ Angular2 рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рд░ рдкреГрд╖реНрда рд╡рд░реНрдЧ рдкрд░ рд░рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ browser рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

/**
  Wait for the page to make it to the next URL before continuing.
  A supplement to browser.waitForAngular() because protractor will continue control
  flow before navigation starts.

  Inputs:
    necessaryUrlFragment: a portion of the url that signifies you have successfully navigated
    timeout: the number of ms to wait before throwing an error. Defaults to the browsers default
      page timeout.
 */
waitForRedirect(necessaryUrlFragment: string, timeout: number = browser.getPageTimeout) {
  // Before we tell the browser to wait, assume it has not navigated
  let hasRedirected = false;

  // Passing a function to browser.wait() tells protractor to call that function repeatedly.
  // This function returns the closure variable hasRedirected, which will be set to true once the
  // necessaryUrlFragment has been found in the url
  browser.wait(() => {
    browser.getCurrentUrl()
      // Check to see if necessaryUrlFragment is in the current url
      .then(url => url.includes(necessaryUrlFragment))
      // Update our navigation status
      .then(hasNavigated => {
        hasRedirected = hasNavigated;
      });

    // Return our navigation status every time protractor asks for it - even if navigation is
    // not complete
    return hasRedirected;
  }, timeout);
}

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреИрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

it('Should be able load the preferences page', () => {
  page.navigateToMarketing();
  page.clickButton('Manage Preferences');
  page.waitForRedirect('preferences/preferences');
  expect(page.getPageTitle()).toBe('MY PREFERENCES');
});

рдореЗрд░рд╛ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдЧреИрд░-рдХреЛрдгреАрдп js рдкреГрд╖реНрда рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ рдХреЛрдгреАрдп js рдкреГрд╖реНрда рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдиреАрдЪреЗ рджрд┐рдП рдЕрдиреБрд╕рд╛рд░ рдХрд▓реНрдкрдирд╛ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ:

рд╡рд░реНрдгрди ('рд▓реЙрдЧрдЗрди рдЯреВ рдПрдкреНрд▓реАрдХреЗрд╢рди', рдлрдВрдХреНрд╢рди () {
var userID = element (by.name ('рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо'));
var рдкрд╛рд╕рд╡рд░реНрдб = рдПрд▓рд┐рдореЗрдВрдЯ (by.name ('рдкрд╛рд╕рд╡рд░реНрдб'));
var logInButton = element (by.id ('Submit'));

рдлрдВрдХреНрд╢рди рд▓реЛрдЧрд┐рдиреЛрдЯреЗрдкреЗрд╢рди (stringSSOID, stringPassword) {
userID.sendKeys (stringSSOID);
password.sendKeys (stringPassword);
logInButton.click ();

}

рдкрд╣рд▓реЗ (рдлрд╝рдВрдХреНрд╢рди () {
Browser.ignoreSynchronisation = true;
browser.get (''; // рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдЧрд╛
};

рдпрд╣ ('рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рд╣реИ', рд╕рдорд╛рд░реЛрд╣ () {
loginToApplication ('77777', 'рдкрд░реАрдХреНрд╖рдг')
Browser.ignoreSynchronisation = false
рдЙрдореНрдореАрдж (browser.getTitle ()) .Eququal ('рд╕реЙрдлреНрдЯрд╡реЗрдпрд░');
};
};

рдиреАрдЪреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:
рд╡рд┐рдлрд▓: рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐: "window.an
рдЧреВрд▓рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреИрд░-рдХреЛрдгреАрдп рдкреГрд╖реНрда рд╣реИ рдпрд╛
рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЯреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рд░реИрдХреНрдЯрд░ рдХрд╛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ http://git.io/v4gXM "

рдирдорд╕реНрддреЗ http://www.protractortest.org/#/timeouts # рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдХреИрд╕реЗ-рд╕реЗ-рдЕрдХреНрд╖рдо-рдкреНрд░рддреАрдХреНрд╖рд╛-рдХреЗ рд▓рд┐рдП рдХреЛрдгреАрдп
рдЧреИрд░-рдХреЛрдгреАрдп рдкреГрд╖реНрда рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕ рдПрдХ рд╢реЛ рдХреЛ рдЖрдЬрд╝рдорд╛рдПрдВред
рд╕рд╛рджрд░
рдКрдВрдЯ

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рддрдм рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдкреГрд╖реНрда рдПрдХ рдХреЛрдгреАрдп рдШрдЯрдХ рдореЗрдВ рдЕрдирд╣реЗрд▓реНрдб рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирдГ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реЛред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐

рддреЛ рд╢рд╛рдпрдж рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рддрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓рд╛ 'рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди' рдкреНрд░рддрд┐ рдирд╣реАрдВ рд╣реИ :)

рд╣рд╛рдп @ArnaudPel

рдЖрдкрдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП Tnxред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк PR рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда (рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛) рдХреА рдпрд╛рддреНрд░рд╛ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

Failed: Error while waiting for Protractor to sync with the page: "window.angular is undefined.  This could be either because this is a non-angular page or because your test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"

ignoreSync рдЪрд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рдорджрдж рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИ:

browser.ignoreSynchronization = true;
// do work here with browser.driver 
browser.ignoreSynchronization = false;

рд▓рд┐рдВрдХ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдпрд╣рд╛рдБ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛: 5.2.1, 5.1.1, 5.1.0, 5.0.0

@benjaminapetersen - рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ waitForAngularEnabled рдХреЗ рдмрдЬрд╛рдп ignoreSynchronization ред рдореИрдВ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ v5.1.2 рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрдн рдкреГрд╖реНрда рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдм ignoreSynchronization , рд▓реЗрдХрд┐рди CHANGELOG рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХрдм, рдЕрдЧрд░ рдХрднреА рдирд╣реАрдВ, рддреЛ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдкрджрд╛рд╡рдирдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ ...

рдореИрдВрдиреЗ waitForAngularEnabled рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ @benjaminapetersen рдХреЛ рдорд┐рд▓рддреА рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:

exports.config = {
    rootElement: 'app',
    baseUrl: 'http://localhost:1384/#/',
    framework: 'jasmine',
    seleniumAddress: 'http://localhost:4444/wd/hub',
    specs: ['./tests/e2e/*.js'],
    multiCapabilities: [{
      'browserName': 'firefox',
      //'browserName': 'chrome',
    }, 
  ],
  jasmineNodeOpts: {
    showColors: true
  },
}

//example test: 

describe('Overall navigation', function () {
  it('test link', function () {
     browser.get('http://localhost:1384/#/registrerprodukt');
  });
});

@thompsnm рдзрдиреНрдпрд╡рд╛рдж! рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ waForAngularEnabled рднреА

@benjaminapetersen рдиреЗ рдЬреЛ doc рдЯреИрдЧ ignoreSynchronization рд╕рдВрдкрддреНрддрд┐ рдкрд░ рд╣реИ, waitForAngularEnabled

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

@ seel93 rootElement: 'app' рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдпрд╛ rootElement: '*[ng-app]' рд╕рд╛рде рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рд▓реЗрдЯреЗрд╕реНрдЯ рд╡рд░реНрдЬрди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдПрдХ Angular 1.6.1 рдРрдк рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкреЗрдХреНрд╕ рд▓рд┐рдЦреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

onPrepare: function () {
    browser.driver.manage().timeouts().setScriptTimeout(60000);

    browser.driver.get('http://app.local.dev'+ '/login');
    browser.driver.findElement(by.id('user_login')).sendKeys('d','e','m', 'o');
    browser.driver.findElement(by.id('user_pass')).sendKeys('d','e','m', 'o');
    browser.driver.findElement(by.id('submit')).click();

    // Login takes some time, so wait until it's done.
    return browser.driver.wait(function() {
        return browser.driver.getCurrentUrl().then(function(url) {
            return /students\/agenda/.test(url);
        });
    }, 30000);
}

рдиреЛрдЯ: рдореЗрд░реЗ рдкрд╛рд╕ html рдЯреИрдЧ рдкрд░ ng-app рд╕реЗрдЯ рд╣реИ

rootElement: '*[ng-app]' ? рдЬреЛ рдХреБрдЫ рднреА рдиреЛрдб рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдЕрдкрдирд╛ рдорд╕рд▓рд╛ рд╣рд▓ рдХрд┐рдпрд╛ред Developer рдореВрд▓ рдХрд╛рд░рдг: рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ "^ 5.3.2" рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рд╣реИ рдФрд░ рдлрд┐рд░ рдореИрдВ рдХреЛрдгреАрдп рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдареАрдХ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдпрд╛ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЛрдгреАрдп рдФрд░ рдХреЛрдгреАрдп рдИ 2 рдИ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ browser.waitForAngularEnabled(false); рджреЛ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд▓рд┐рдпрд╛ред

logIn() {
    const email = 'test';
    const password = 'test';

    browser.waitForAngularEnabled(false);
    browser.get('/login');

    element(by.id('username')).sendKeys(email);
    element(by.id('password')).sendKeys(password);
    element(by.css('[type="submit"]')).click();

    return browser.wait(function() {
        browser.waitForAngularEnabled(false);
        return browser.getCurrentUrl().then(function(url) {
            browser.waitForAngularEnabled(true);
            return /dashboard/.test(url);
        });
    }, 5000);
}

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреАред

рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реА:
рддреНрд░реБрдЯрд┐: ECONNREFUSED рдХрдиреЗрдХреНрдЯ рдХрдиреЗрдХреНрдЯ ECONNREFUSED 127.0.0.1:4444 рд╕реЗ: рдХрд╛рд░реНрдп: WebDriver.getCurrentUrl ()

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рддрддреНрд╡ () рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред getText () рдРрдирдХ рдХреЗ рдмрд╛рд╣рд░ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд┐рдирд╛ () рд╣реБрдИ) () рд╣реБрдИ рд╣реИ - рдЪрд╢реНрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ div рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд╕рдм рдареАрдХ рд╣реЛ рдЧрдпрд╛ред

рдпрд╣ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ 'рддрддреНрд╡ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред'
рдпрд╣ рдХрдард┐рди рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЧрдпрд╛ ...

рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рд╣реБрдИ:

рд╡рд┐рдлрд▓: рдкреЗрдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐: "рдХреЛрдгреАрдпрдЬреЗрдПрд╕ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЛрдгреАрдп рдкрд░реАрдХреНрд╖рдг рджреЛрдиреЛрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдпрд╣ рдпрд╛ рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреИрд░-рдХреЛрдгреАрдп рдкреГрд╖реНрда рд╣реИ рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЯреНрд░реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ http://git.io/v4gXM "

рдХреЛрдб рд╣реИ:
var url = browser.params.login.Url;
Browser.get (url + '/ #! / app / manage-users');

рдореБрдЭреЗ рдЕрдЪрд╛рдирдХ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рд▓рдЧреА рдХрд┐ рдореЗрд░рд╛ рд╕реАрдЯреА рдмрдирддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╣реЗрдбрд▓реЗрд╕ рдХреЗ рд╕рд╛рде рд╣реА рд╣реЛрддреА рд╣реИ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХреНрд░реЛрдо рд╣реЗрдбрд▓реЗрд╕ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореИрдВрдиреЗ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ v69 рд╕реЗ рд▓реЗрдЯреЗрд╕реНрдЯ рд╡рди (рдЗрд╕ рд╕рдордп v72.0.2) рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рддрдп рдХрд┐рдпрд╛ред

browser.ignoreSynchronization рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ, browser.get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред

рдЖрдк рдПрдХ рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреА рд╣реИ рдХрд┐ рдЖрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ waitForAngularEnabled рд╣реЛрдЧрд╛ рдкрд░, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ browser.get рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж waitForAngularEnabled(true) ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// do things on your Angular application

waitForAngularEnabled(false)

// do things on non-angular page

waitForAngularEnabled(true)
browser.get('/home') // this is a page from your Angular application

рдХреЛрдгреАрдп рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ browser.get рдмреНрд▓реЙрдХред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВ:

_Exception рдЖрдИ рд╣реИ: рддреНрд░реБрдЯрд┐: рдкреЗрдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐: "рдХреЛрдгреАрдпрдЬреЗрдПрд╕ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЛрдгреАрдп рдкрд░реАрдХреНрд╖рдг рджреЛрдиреЛрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдпрд╣ рдпрд╛ рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреИрд░-рдХреЛрдгреАрдп рдкреГрд╖реНрда рд╣реИ рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЯреЗрдХреНрдЯрд░ рдХреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП http://git.io/v4gXM рджреЗрдЦреЗрдВ "_

рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЬрдм рд╡реАрдПрд╕ рдХреЛрдб рдбрд┐рдмрдЧрд░ рдпрд╛ рдХреНрд░реЛрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдбрд┐рдмрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ (рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ https://www.protractortest.org/#/debugging)ред

рдпрд╣рд╛рдБ VSCode рдореЗрдВ рдореЗрд░рд╛ launch.json рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реИред

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "E2E Test",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${workspaceFolder}\\node_modules\\protractor\\bin\\protractor",
            "args": ["${workspaceFolder}\\e2e\\protractor.conf.js"],
            "outFiles": [
                "${workspaceFolder}/e2e/**/*.js",
                "${workspaceFolder}/src/**/*.js"
            ]
        }
    ]
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЧрд▓рдд рдард╣рд░рд╛рдпрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдареАрдХ рд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

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

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

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

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

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

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

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