在CasperJS中的waitFor()中将局部变量传递给evaluate()

时间:2014-03-20 23:34:06

标签: javascript automated-tests phantomjs casperjs

我想用CasperJS测试一个网站。如果在某个输入字段上触发onBlur事件,则会在一段时间后更新页面上其他位置的属性。我想等到这个属性更新并编写以下代码才能这样做:

Foo.prototype.setBar = function ( baz ) {
  casper.then( function () {

    // local variable baz can be passed to evaluate
    casper.evaluate( function ( arg1 ) {
      var $inputField = $( 'section.xyz input' );
      $inputField.val( arg1 );
      $inputField.blur();
    }, baz ); // this works just fine

    // local variable baz can not be passed to evaluate within waitFor()
    casper.waitFor( function () {
      return this.evaluate(function ( arg1 ) {
        return __utils__.findOne('mySelector').getAttribute('data-xyz') === arg1;
      }, baz);
    }, function then() {
      casper.log('Attribute with given value was found', 'info');
    }, function timeOut() {
      casper.test.fail('Attribute with given value could not be found');
    }, 10000); // this doesn't work
  });
};

显然,waitFor方法中传递的变量baz的值为null或未定义。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

waitFor的签名是

waitFor(Function testFx[, Function then, Function onTimeout, Number timeout, Object details])

如您所见,无法将任何参数传递给testFx()函数。

你可以解决这个问题的方法是:在你之前的evaluate()调用中创建一个DOM节点(例如一个隐藏字段)并将baz变量的值放在那里。然后在testFx()函数中从该DOM节点获取它。