在继续操作之前,如何让量角器等待登录?

时间:2017-04-13 16:17:34

标签: angularjs protractor

我的应用程序有一个非角度的输入页面,我尝试首次登录:

describe('Authentication', function() {
  it('should authenticate a user', function() {
    browser.driver.get('https://example.com')

    browser.driver.findElement(by.id('username')).sendKeys("user");
    browser.driver.findElement(by.id('password')).sendKeys("mypass");
    browser.driver.findElement(by.tagName('input')).click()
    var url = browser.getLocationAbsUrl()
    browser.driver.sleep(1)
    browser.waitForAngular()

    return
  })
})

然而,这会产生错误:

 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 bec
ause your test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

我会说等待登录页面,直到显示正确并且执行操作。例如,

  • 在登录页面中定位一些元素并等待它。
  • 等待网址更改等
  

登录 - > browser.sleep(500)/等待登录页面的元素/ URL更改 - >   其他行动

 browser.driver.wait(function(){
     expectedElement.isDisplayed().then(function (isVisible){
            return isVisible === true;
          },50000, 'Element not present ');
 },50000);
  

如果该元素在指定时间内不存在,则超时错误   会显示&你会知道它没有登录的时间。

答案 1 :(得分:1)

我过去曾写过一些帮助,以便在我的e2e测试中完成这项工作:

waitForUrlToChangeTo: function (urlToMatch) {
    var currentUrl;
    return browser.getCurrentUrl().then(function storeCurrentUrl(url) {
            currentUrl = url;
        })
       .then(function waitForUrlToChangeTo() {
            browser.ignoreSynchronization = true;
            return browser.wait(function waitForUrlToChangeTo() {
                return browser.getCurrentUrl().then(function compareCurrentUrl(url) {
                    browser.ignoreSynchronization = false;
                    return url.indexOf(urlToMatch) !== -1;
                });
            });
        }
    );
},
login : function (username, password, url) {
    browser.get('#/login');
    element(by.model('username')).sendKeys(username);
    element(by.model('password')).sendKeys(password);
    element(by.buttonText('LOGIN')).click();
    return this.waitForUrlToChangeTo(url);
}

然后在测试中:

describe('when I login with valid credentials', function() {
    it('should redirect to dashboard', function() {
        helper.login('user', 'pass', '#/dashboard').then(function() {
            expect(browser.getTitle()).toMatch('Dashboard');
        });
    });
});