Protractor 等待完成页面加载在量角器中无法按预期工作

Protractor 等待完成页面加载在量角器中无法按预期工作,protractor,Protractor,我正在编写一个登录到非角度应用程序的测试 describe('login Test for App', function () { beforeEach(function () { browser.ignoreSynchronization=true; browser.get(loginPageURL,2000); }); it('It should Login a User', function () { eleme

我正在编写一个登录到非角度应用程序的测试

describe('login Test for App', function () {

    beforeEach(function () {
        browser.ignoreSynchronization=true;
        browser.get(loginPageURL,2000);
    });


    it('It should Login a User', function () {
        element(by.id('username')).sendKeys(constants.userName);
        element(by.id('password')).sendKeys(constants.password);
        element(by.id('Login')).click().then(function () {
            // Waiting to open modal
            browser.wait(function () {
                return browser.getCurrentUrl().then(function (url) {
                    return url==dashboardUrl;
                });
            });
        });
    });
});
登录后,我想检查currentUrl。但在单击登录按钮后,它会等待仪表板url出现。 但当登录按钮点击后,它会转到不同的url,然后它还会等待仪表板url无限。 我想在登录事件后检查当前url,若它不是仪表板url,那个么它应该失败,并且不要运行下一个测试套件案例,因为登录测试失败了

像-

当点击登录按钮时

  • 等待页面加载完成

  • 2.然后检查当前url,如果它不是仪表板url,则测试应该失败,并且不继续任何测试用例。

    等待页面url加载以了解页面是否已加载不是最佳做法,因为可能存在重定向或其他问题

    最佳做法是在下一页(登录后)等待特定元素。下面是经过重构的代码,使用自定义的wait()函数,该函数将在继续检索当前url之前等待元素出现:

        describe('login Test for App', function () {
        browser.ignoreSynchronization = true;
    
        it('should load the log-in page', function(done) {
            browser.driver.get(loginPageURL).then(function() {
                browser.driver.sleep(2000);
                wait('#username', 10000);
                done();
            });
        });
    
        it('It should Login a User', function (done) {
            element(by.id('username')).sendKeys(constants.userName);
            element(by.id('password')).sendKeys(constants.password);
            element(by.id('Login')).click().then(function () {
                // Waiting to open modal
                wait('#element_on_the_next_page', 10000);
    
                browser.getCurrentUrl().then(function (url) {
                  // do anything with the url
                  done();
                });
            });
        });
    
        function wait(selector, timeout) {
          browser.driver.wait(function() {
            return browser.driver.isElementPresent(by.css(selector)).then(function(present) {
              return present;
            });
          }, timeout);
          browser.driver.wait(function() {
            return browser.driver.findElement(by.css(selector)).isDisplayed().then(function(displayed) {
              return displayed;
            });
          }, timeout).then(function() {
            return;
          });
        }
    });
    

    希望这有帮助

    等待页面url加载以了解页面是否已加载不是最佳做法,因为可能存在重定向或其他问题

    最佳做法是在下一页(登录后)等待特定元素。下面是经过重构的代码,使用自定义的wait()函数,该函数将在继续检索当前url之前等待元素出现:

        describe('login Test for App', function () {
        browser.ignoreSynchronization = true;
    
        it('should load the log-in page', function(done) {
            browser.driver.get(loginPageURL).then(function() {
                browser.driver.sleep(2000);
                wait('#username', 10000);
                done();
            });
        });
    
        it('It should Login a User', function (done) {
            element(by.id('username')).sendKeys(constants.userName);
            element(by.id('password')).sendKeys(constants.password);
            element(by.id('Login')).click().then(function () {
                // Waiting to open modal
                wait('#element_on_the_next_page', 10000);
    
                browser.getCurrentUrl().then(function (url) {
                  // do anything with the url
                  done();
                });
            });
        });
    
        function wait(selector, timeout) {
          browser.driver.wait(function() {
            return browser.driver.isElementPresent(by.css(selector)).then(function(present) {
              return present;
            });
          }, timeout);
          browser.driver.wait(function() {
            return browser.driver.findElement(by.css(selector)).isDisplayed().then(function(displayed) {
              return displayed;
            });
          }, timeout).then(function() {
            return;
          });
        }
    });
    

    希望这有帮助

    足够接近,但超时后,如果该元素不显示或不存在,我不想继续测试套件。因为我的登录测试失败了。怎么做?现在,当我的登录测试失败时,它也会继续进行进一步的测试套件,我已经在conf.js的spec属性中定义了这些测试套件。如果您希望的话,请在这里查看这个答案,以在初始失败后使套件失败:足够接近,但超时后,如果该元素不显示或不存在,我不想继续进行进一步的测试套件。因为我的登录测试失败了。怎么做?现在,当我的登录测试失败时,它还将继续进行进一步的测试套件,我在conf.js的spec属性中定义了这些测试套件。如果您希望这样做,请在这里查看此答案,以在初始失败后使套件失败: