我正在尝试从我的网站测试一个基本的登录/注销。我的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
移动到beforeEach
和afterEach
:
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;
});