我不熟悉JavaScript,并且正在Angular2中针对单页Web应用程序进行E2E测试。 基本上,页面上有很多可点击的标签(未重定向到其他页面,但在单击时具有一些CSS效果),并且它们之间具有一些逻辑。我想做的是,{随机单击一个标签,检查页面的响应是否正确(需要从Web上获取许多组件才能执行此操作),然后取消单击它}。
因此,我将两个const设置为totalRound和ITER,这将加载网页totalRound时间,然后在每个加载页面中,我会随机选择并单击按钮ITER次。
我的代码结构如下:
==
所以我想从加载页面检查完每个ITER按钮后得到结果。在for循环内,该代码嵌套了诸如getText()等异步函数。
在大多数情况下,代码可以正常执行(看起来按钮检查是顺序进行的)。但是仍然有时,似乎2个迭代的信息有冲突。我猜我的异步代码结构有问题。
我认为JS是单线程的。 (没有操作系统,如果有错请纠正我)所以在for循环中,毕竟是异步的。函数完成初始化,全部嵌套异步。函数(每个循环一个)仍然必须一个接一个地运行,如我所愿?因此,在大多数情况下,代码仍能按我希望的那样执行?
我试图在for循环中添加一个锁, 喜欢:
let totalRound: number = 10;
let ITER: number = 100;
describe('XX Test', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
describe('Simulate User\'s Click & Unclick',() => {
for(let round = 0; round < totalRound; round++){
it('Click Simulation Round ' + round, () =>{
page.navigateTo('');
let allTagFinder = element.all(by.css('someCSS'));
allTagFinder.getText().then(function(tags){
let isMatched: boolean = True;
let innerTurn = 0;
for(let i = 0; i < ITER; i++){
/* Randomly select a button from allTagFinder,
using async func. eg. getText() to get more info
about the page, then check if the logic is correct or not.
If not correct, set isMatchTemp, a local variable to False*/
isMatched = isMatched && isMatchTemp;
innerTurn += 1;
if(innerTurn == ITER - 1){
expect(isMatched).toEqual(true);
}
}
});
});
}
});
});
我希望这可以强制循环按顺序运行。因此对于异步。从索引1〜ITER-1开始的func,它必须等待第一个异步。完成其工作并将innerTurn增大1。但是它甚至无法获得第一个异步。(i = 0)返回...
非常感谢您提出任何建议。
答案 0 :(得分:0)
最后我用了诺言来解决这个问题。
基本上,我将每个小型同步/异步函数放入单独的Promise中,然后使用链接确保仅在解决前一个函数之后才调用后一个函数。
对于ITER for循环问题,我使用了递归加承诺方法:
var clickTest = function(prefix, numLeft, ITER, tagList, tagGsLen){
if(numLeft == 0){
return Promise.resolve();
}
return singleClickTest(prefix, numLeft, ITER, tagList, tagGsLen).then(function(){
clickTest(prefix, numLeft - 1, ITER, tagList, tagGsLen);
}).catch((hasError) => { expect(hasError).toEqual(false); });
}
因此,每次单击测试都将在完成后返回解析信号。只有这样,才会运行下一轮,并且numLeft将减少1。当numLeft变为0时,整个测试将结束。
此外,我尝试使用Python重写整个程序。看起来代码可以轻松地按顺序运行。我没有遇到量角器中的问题,并且一切正常。我需要测试的应用程序具有相对简单的逻辑,因此本机Selenium对我来说似乎是一个更好的选择,因为它不需要运行Frond端代码(只需访问webapp url并获取数据并进行处理)即可,对Python更自信。