量角器 - 如果element.getAttribute('class')发生更改,则退出嵌套for循环

时间:2016-09-12 18:31:16

标签: javascript selenium protractor

我一般都是新的量角器,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。 我知道这有问题,因为量角器的异步性质,但经过几个小时的搜索和尝试解决方案,我似乎无法弄清楚我的正确解决方案是什么。

1 个答案:

答案 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();
                }
            })
           }
    }
};