页面对象中的 For 循环不正确 运行

For Loop in a Page Object Not Running Properly

我正在尝试检查是否存在模态。如果模态不存在,那么它将把计时器的值放入 browser.sleep()。这将为模态的出现留出时间。我在页面对象中遇到 for 循环问题。当我 运行 下面的代码时,当我通过更改对象强制失败时,我没有收到 if 下的警报和 console.log 消息。另外,我没有收到计时器过期消息。

来自page_object文件(相关代码)

editVinModal: { get: function () {
    return browser.element({id: 'editableVINPart'});
}},

doEditVIN: { value: function () {
    modalFailedToAppear = true;
    console.log('In doEditVIN');

    for(modal_timer = 0 ; modal_timer <= 30; modal_timer++) {

       if (!(this.editVinModal)) {
            alert('In If');
            console.log('Modal failed to appear');
           console.log('Under if - modalFailedToAppear: ', modalFailedToAppear);
            browser.sleep(modal_timer);
           console.log('under if - modal_timer: ',modal_timer);
       }
  else {
            console.log('In else  if else loop');
            //  console.log(browser.isElementPresent(this.editVinModal));
           console.log('modalFailedToAppear: ',modalFailedToAppear);
            modalFailedToAppear = false;
           console.log('modalFailedToAppear: ',modalFailedToAppear);
           console.log('modal_timer: ',modal_timer);
           break;
        }
    }
    if (modalFailedToAppear){
        console.log("Modal is not present within the given time period. Timer has expired.");
    }
    this.editVinLink.click();

    }},

提前感谢

看来你是新来的。欢迎!

browser.sleep(),一般来说,不属于你的 Protractor 测试(调试目的除外)。这是坏消息。好消息是 Protractor 实际上提供了一个函数,它可以完全(我认为)完成您想要做的事情。它叫做 browser.wait(),它的工作原理是这样的:

browser.wait( function() {  
  return element(by.id('editableVINpart')).isPresent().then( function(present) { 
    return present;
  });
}, 5000)
.then(function() { 
  element(by.id('editableVINpart')).click();
}, function() { 
  console.log('Element not found. :( ');
});

browser.wait() 有两个参数:第一个是匿名函数,它将重复执行直到 returns true;其次,以毫秒为单位的等待时间(顺便说一句,browser.sleep() 也需要毫秒的等待时间,所以你的 for 循环如果一直迭代,只等待 465 毫秒,或者大约半秒——不是很长)。

然后,因为 browser.wait() returns 一个承诺,就像所有 Protractor 函数一样,我们可以在它的末尾附加一个 .then() 语句,它将执行第一个传递的 -如果 promise 成功则在函数中,如果不成功则在第二个传入函数中。

如果您经常需要等待某个元素出现(并且由于某种原因它与 Angular 页面加载不同步),那么拥有一个可重用的形式可能对您有用函数,像这样:

var waitThenClick = function(el) {
  browser.wait( function() {
    return el.isPresent().then( function(present) { 
       return present;
    });
  }, 5000)
  .then(function() { 
    el.click();
  }, function() { 
    console.log('Element with locator: ' + el.locator + ' was not found. :( ');
  });
};

然后你可以这样称呼它,无论你需要什么元素:

waitThenClick(element(by.id('editableVINpart')));

祝你好运!确保对此类问题的异步内容(尤其是承诺)变得精通和聪明。量角器承诺会绊倒我们中最好的人。