我们有一个带有行网格的应用程序,具有每页SELECT和Pagination,并且想要执行导航和PP选择的e2e测试然后通过将其与DB的结果(伪代码)进行比较来检查显示的结果):
it('should check navigation and pp', function() {
for(i=0;i<SELECT.options;i++) {
element(by.repeater('SELECTOR HERE(i)')).click();
browser.wait(function which checks URL contains a segment(i));
browser.wait(function which checks if a 'loading div is displayed');
for(j=0;j<PagesForPP(i);j++) {
runExpects('for pp=i'); //contains a couple expect(someElement.text).toContain(asynResult());
element(by.css('SELECTOR(j)').click();
browser.wait(function which checks URL contains a segment(j));
browser.wait(function which checks 'loading div is displayed');
}
}
});
其中function(i)是依赖于当前Perpage和函数(j)的调用
我的问题是:如何使用protractor.promise.controlFlow()或更好的方法(如果可用)以量角器理解(可能同步执行)的方式嵌套这两个循环。
目前,量角器忽略了browser.wait(检查URL包含段(i)的函数)等函数; 看起来像这样:
waitForPageChange: function (urlSegment) {
console.log('>> Waiting for URL to contain: ', urlSegment);
var currentUrl;
return browser.getCurrentUrl().then(function (url) {
currentUrl = url;
}).then(function () {
browser.wait(function () {
return browser.getCurrentUrl().then(function (url) {
if (urlSegment) {
return url.indexOf(urlSegment) >= 0;
}
return url !== currentUrl;
});
});
});
}
e2e测试在预期有效之前完成(例如:我们已经在第1页,我们已经达到2页和3页检查=&gt;所有测试都失败了,因为他们已经检查错误的值。
答案 0 :(得分:1)
我认为你的waitForPageChange
方法应该有效。我相信你错过了一个“return”(来自browser.wait),所以函数中的最后then
(这是整个函数的返回值)不是正确的承诺。试试这个:
waitForPageChange: function (urlSegment) {
console.log('>> Waiting for URL to contain: ', urlSegment);
var originalUrl;
return browser.getCurrentUrl().then(function (url) {
originalUrl = url; // XXX this is racy, the page may have changed already
}).then(function () {
return browser.wait(function () { // this line was missing a 'return'
return browser.getCurrentUrl().then(function (url) {
if (urlSegment) {
return url.indexOf(urlSegment) >= 0;
}
return url !== originalUrl;
});
});
});
}
请注意,执行return muble.then(...).then(function() {return x; })
的代码最终会从链中的 last then
返回承诺。
另外,请注意未提供urlSegment的默认情况。您无法确定“originalUrl”是否足够快地初始化。浏览器可能会在您加载之前继续前进。为了可靠,您可能需要一个单独的“waitForPageToLeave(x)”等待URL更改远离提供的URL,并且您应该期望调用者在进行任何更改之前查找该“原始”URL。 (这将与等待URL成为给定URL的“waitForPageToGoTo(x)”函数分开。)