如何不忘记将量角器再次打开 Angular 同步?
How to not forget to turn the Protractor to Angular sync on again?
我们有一个相当庞大的测试代码库(大约 10000 行 javascript 代码),在某些情况下,我们需要关闭 Protractor-to-Angular 同步:
browser.ignoreSynchronization = true;
但是,问题是,我们有时会忘记再次开启同步,导致所有后续测试都以不明原因失败,需要花费时间和精力进行调试。
有没有办法确保在测试中重新打开同步?
我们确实有基于 ESLint
的静态代码分析并执行代码审查。
有一次,当我遇到同样的情况时,我创建了一个辅助函数并在导航到新页面之前调用了它。您仍然需要 "remember" 来调用该函数,但至少这让您在代码中只有一个地方可以处理该更改。
isAngularSite(flag) {
browser.ignoreSynchronization = !flag;
}
在我的代码中,我这样称呼它 utils.isAngularSite(false);
我只是做 afterTest 挂钩(取决于你的测试运行器),我把所有东西都设置回它的起始状态,所以如果我什至忘记在测试中切换回来,或者测试在任何时候由于某种原因崩溃 - 下一步测试不会受到影响:
我的茉莉花代码。量角器配置:
onPrepare() {
...
afterEach(function () {
// Setting ignoreSychronization back to true, in case it was changed in tests
browser.waitForAngularEnabled(true);
// Setting back to default frame. In case test was working in iframe
browser.switchTo().defaultContent();
// This depends on your architecture. We do clean run for each test.
browser.manage().deleteAllCookies();
browser.executeScript('window.sessionStorage.clear(); window.localStorage.clear();').then(
undefined,
function (err) {
// Errors will be thrown when browser is on default data URL.
// Session and Local storage is disabled for data URLs
// This callback is needed to not crash test, and just ignore error.
});
browser.manage().timeouts().implicitlyWait(5000); // I even rewrite implicit wait back to default value, in case i touched it in tests
// Also you might want to clear indexdb storage after tests.
})
在实际代码中,我会将其包装到名为 resetBrowser
或类似名称的函数中。您也可以 return 从它承诺,然后 return 从钩子承诺 - 所以新测试不会开始,直到承诺解决
我们有一个相当庞大的测试代码库(大约 10000 行 javascript 代码),在某些情况下,我们需要关闭 Protractor-to-Angular 同步:
browser.ignoreSynchronization = true;
但是,问题是,我们有时会忘记再次开启同步,导致所有后续测试都以不明原因失败,需要花费时间和精力进行调试。
有没有办法确保在测试中重新打开同步?
我们确实有基于 ESLint
的静态代码分析并执行代码审查。
有一次,当我遇到同样的情况时,我创建了一个辅助函数并在导航到新页面之前调用了它。您仍然需要 "remember" 来调用该函数,但至少这让您在代码中只有一个地方可以处理该更改。
isAngularSite(flag) {
browser.ignoreSynchronization = !flag;
}
在我的代码中,我这样称呼它 utils.isAngularSite(false);
我只是做 afterTest 挂钩(取决于你的测试运行器),我把所有东西都设置回它的起始状态,所以如果我什至忘记在测试中切换回来,或者测试在任何时候由于某种原因崩溃 - 下一步测试不会受到影响:
我的茉莉花代码。量角器配置:
onPrepare() {
...
afterEach(function () {
// Setting ignoreSychronization back to true, in case it was changed in tests
browser.waitForAngularEnabled(true);
// Setting back to default frame. In case test was working in iframe
browser.switchTo().defaultContent();
// This depends on your architecture. We do clean run for each test.
browser.manage().deleteAllCookies();
browser.executeScript('window.sessionStorage.clear(); window.localStorage.clear();').then(
undefined,
function (err) {
// Errors will be thrown when browser is on default data URL.
// Session and Local storage is disabled for data URLs
// This callback is needed to not crash test, and just ignore error.
});
browser.manage().timeouts().implicitlyWait(5000); // I even rewrite implicit wait back to default value, in case i touched it in tests
// Also you might want to clear indexdb storage after tests.
})
在实际代码中,我会将其包装到名为 resetBrowser
或类似名称的函数中。您也可以 return 从它承诺,然后 return 从钩子承诺 - 所以新测试不会开始,直到承诺解决