从无角登录页面测试量角器



我正在尝试从我的网站测试一个基本的登录/注销。我的angular应用的入口点来自一个非angular的登录页面(oauth),该页面会在凭证验证后为应用提供服务。我的测试将在本地运行,但不在Circle Ci上运行;我的错误是:

Message:
    Failed: Error while waiting for Protractor to sync with the page: "angular could not be found on the window"
  Stack:
Error: Failed: Error while waiting for Protractor to sync with the page: "angular could not be found on the window"
下面是我的测试函数:
    it('Log into Webapp', function() {
     browser.ignoreSynchronization = true;
        browser.manage().timeouts().pageLoadTimeout(40000);
        browser.manage().timeouts().implicitlyWait(25000);
        browser.get('http://localhost:8000/login');
        element(by.id('username')).sendKeys('x..');
        element(by.id('password')).sendKeys('...');
        element(by.name('Login')).click();
        setTimeout(function(){}, 15000);
        element(by.name('save')).click();
        setTimeout(function(){}, 10000);
        //browser.waitForAngular();
        //browser.ignoreSynchronization = false;
        //browser.ignoreSynchronization = false;
        // Angular app should be served, Logout is on this
        browser.ignoreSynchronization = false;
        element(by.name('logoutBtn')).click();
});

尝试将ignoreSynchronization移动到beforeEachafterEach:

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

帮助我解决:非角度页面打开后点击。

用browser.sleep(10000)代替setTimeout;

setTimeout在超时后执行回调函数,但主"线程"继续其执行流程。所以你并不是真的在等。

同样,你也可以在最后一次注销之前使用browser.waitForAngular()。

像这样:

it('Log into Webapp', function() {
    browser.ignoreSynchronization = true;
    browser.manage().timeouts().pageLoadTimeout(40000);
    browser.manage().timeouts().implicitlyWait(25000);
    browser.get('http://localhost:8000/login');
    element(by.id('username')).sendKeys('x..');
    element(by.id('password')).sendKeys('...');
    element(by.name('Login')).click();
    browser.sleep(15000);
    element(by.name('save')).click();
    browser.sleep(10000);
    browser.waitForAngular();        
    element(by.name('logoutBtn')).click();
    // Angular app should be served, Logout is on this
    browser.ignoreSynchronization = false;

});

最新更新