如果element.getAttribute('class')发生变化,则退出嵌套for循环

Protractor - exiting nested for loop if element.getAttribute('class') changes

本文关键字:退出 循环 变化 for 嵌套 getAttribute element class 如果      更新时间:2023-09-26

我对量角器、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();
                }
            })
           }
    }
};