我一般都是新的量角器,javascript和异步编程。一旦我发现页面上的某个特定元素改变了它的类,我就无法退出嵌套的for循环。
不幸的是我在页面上有一个flash对象我正在自动化,我必须与之交互。我正在使用直接鼠标移动和点击这样做,我发现这是令人满意的。我想点击10x10网格模式,直到我点击网格中的某些内容,这将改变页面上另一个元素的类。这是我的代码:
var selectSeat = function() {
var xCoord = 157;
var yCoord = 57;
var breakLoop = false;
for (var i=0; i<10; i++) {
for (var j=0; j<10; j++) {
browser.actions().mouseMove(flashElement, {x: xCoord+(15*i), y: yCoord+(15*j)}).click().perform();
browser.sleep(500);
buttonElement.getAttribute('class').then(function(attribute) {
if(attribute === 'black-button') {
breakLoop = true;
}
})
if (breakLoop) {
return;
}
}
}
};
我已将属性和breakLoop的值记录到控制台,以确保它们按预期更改,并且它们是。问题来自'if(breakLoop){return; ''阻止不运行,即使breakLoop为true。 我知道这有问题,因为量角器的异步性质,但经过几个小时的搜索和尝试解决方案,我似乎无法弄清楚我的正确解决方案是什么。
答案 0 :(得分:0)
让我先从here
中引用一句名言掌握异步编程的第一秘诀:无需编程 循环。 JavaScript的循环只能同步运行,而不能运行 用于重复异步函数
如上所述,代码中的问题是条件
if (breakLoop) {
return;
}
将在breakloop的getAttribute()比较和值赋值之前执行。当您在上一次迭代中实际检查条件时,第一次迭代的protractor-Webdriver命令仍然可以运行
我会建议这样的事情。在同一http://metaduck.com/01-asynchronous-iteration-patterns.html
上查看精彩的文章var selectSeat = function(callback) {
var xCoord = 157;
var yCoord = 57;
for (var i=0; i<10; i++) {
for (var j=0; j<10; j++) {
browser.actions().mouseMove(flashElement, {x: xCoord+(15*i), y: yCoord+(15*j)}).click().perform();
browser.sleep(500);
buttonElement.getAttribute('class').then(function(attribute) {
if(attribute === 'black-button') {
callback();
}
})
}
}
};