对于页面对象中的循环未正确运行

时间:2015-03-13 18:55:50

标签: javascript for-loop protractor pageobjects

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

来自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();

    }},

提前致谢

1 个答案:

答案 0 :(得分:3)

看起来你在这里很新。欢迎!

一般来说,

browser.sleep()不属于您的量角器测试(除了调试目的)。这是个坏消息。好消息是,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()有两个参数:第一个是匿名函数,它将重复执行,直到它返回true;第二,等待的时间以毫秒为单位(顺便说一句,browser.sleep()也需要一毫秒的等待时间,所以你的for循环只等待465毫秒,如果它一直迭代,或者约半秒 - 不是很长。)

然后,由于browser.wait()返回一个promise,就像所有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')));
祝你好运!确保通过这样的问题获得异步(尤其是承诺)的好处和聪明。量角器承诺最好的旅行。