我希望我的测试无论运行顺序如何都能正常工作。因此我创建了一个如果尚未登录就登录测试用户的工具。但是当我使用工具时,量角器行为不端。请继续阅读。 util看起来像这样:
export class E2EUtils {
loginAndGoTo(url: string) {
return browser.get(url).then(() => {
return browser.driver.getCurrentUrl().then(
(currentUrl) => {
if (currentUrl.indexOf('/login') !== -1) {
element(by.css('[name=email]')).sendKeys('user@email.com');
element(by.css('[name=password]')).sendKeys('secret');
element(by.css('login form button')).click();
}
expect(browser.driver.getCurrentUrl()).toMatch('.*' + url + '$');
}, (error) => {
console.error('error in E2EUtil.loginAndGoTo', error);
});
});
};
}
使用util
的测试import { E2EUtils } from '../e2e-utils.e2e-spec';
let utils = new E2EUtils();
describe('Home', () => {
it('should show right profile', (done) => {
utils.loginAndGoTo('home/user').then(() => {
expect(element(by.css('home p')).getText()).toContain('user');
done();
}, (e) => { console.error('error in home.component.e2e-spec.ts', e); });
});
});
它不起作用。它挂起并最终给出错误:
Failed: Timed out waiting for Protractor to synchronize with the page after 11 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md
While waiting for element with locator - Locator: By(css selector, home p)
然而。这种'相同的测试工作'。唯一的区别是我没有使用util。
it('should show right profile-OLD', () => {
browser.get('/home/user');
element(by.css('[name=email]')).sendKeys('user@email.com');
element(by.css('[name=password]')).sendKeys('secret');
element(by.css('login form button')).click();
expect(browser.getCurrentUrl()).toMatch('.*home/user$');
expect(element(by.css('home p')).getText()).toContain('user');
});
我还使用了Element Explorer并自己尝试了元素定位器,它只在不使用util时才有效。即使正确的页面可见。因此,似乎util将量角器设置为奇怪的状态。另外,我不能在util方法中使用browser.getCurrentUrl()
,而是使用browser.driver.getCurrentUrl()
。但是,browser.getCurrentUrl()
适用于不使用util的测试。
答案 0 :(得分:0)
确定。所以我找到了一个解决方法。如果我暂时添加ignoreSynchronization
和sleep
,我可以通过测试。像这样:
it('should show right profile', (done) => {
browser.ignoreSynchronization = true; <--
utils.loginAndGoTo('home/user').then(() => {
sleep(1000); <--
expect(element(by.css('home p')).getText()).toContain('user');
done();
}, (e) => { console.error('error in home.component.e2e-spec.ts', e); });
});
我无法弄清楚为什么这会让它发挥作用。不知怎的,我的util方法(这是异步的)使量角器相信它必须等待角度?此外,我现在可以使用browser.getCurrentUrl
代替browser.driver.getCurrentUrl
。以下是ignoreSynchronization
的文档
/**
* If true, Protractor will not attempt to synchronize with the page before
* performing actions. This can be harmful because Protractor will not wait
* until $timeouts and $http calls have been processed, which can cause
* tests to become flaky. This should be used only when necessary, such as
* when a page continuously polls an API using $timeout.
*
* @type {boolean}
*/