如果element.getAttribute('class')发生变化,则退出嵌套for循环
Protractor - exiting nested for loop if element.getAttribute('class') changes
我对量角器、javascript和异步编程都是新手。一旦我发现页面上的特定元素改变了它的类,我就会遇到退出嵌套循环的麻烦。
不幸的是,我在自动化的页面上有一个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;
}
}
}
};
我已经将attribute和breakLoop的值记录到控制台,以确保它们按预期更改,并且它们确实更改了。问题来自if (breakLoop) {return;}’块不会运行,即使breakLoop为true。我知道这是由于量角器的异步特性造成的问题,但经过数小时的搜索和尝试解决方案后,我似乎无法找出正确的解决方案。
让我从这里引用一句名言开始
掌握异步编程的第一个秘密:编程没有循环。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();
}
})
}
}
};
相关文章:
- 基于两个条件退出While循环
- 试图使循环退出,但它目前只是继续循环100次
- Waypoint的循环,退出循环后属性未定义
- 强循环自定义脚本不会退出
- 我需要找到素数索引,但我的 while 循环正在退出
- JavaScript 退出 for 循环而不返回
- 对于循环提前退出
- 当循环退出而不是返回到循环 -Javascript
- 鼠标退出时的jquery停止循环
- 运行 for 循环.递增值;退出并使用新值再次开始循环
- Javascript 提前退出循环
- 如何在循环中出现错误后退出函数
- 如何在javascript中退出回调循环
- 为什么 for 循环计数器在 javascript 中退出循环后不会被销毁
- 在数组中循环,并在匹配正确值时退出
- jQuery()在for循环内部加载方法,如何在出现错误时退出
- 如何退出each()循环并提前从外部函数返回
- Javascript递减值和退出循环的问题
- 如何在退出循环之前等待循环内的异步进程完成
- 按下Enter键后,使用preventdefault退出循环