【问题标题】:Pass local variable to evaluate() within waitFor() in CasperJS在 CasperJS 的 waitFor() 中将局部变量传递给 evaluate()
【发布时间】:2014-03-20 23:34:05
【问题描述】:

我想用 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 的值为空或未定义。这个问题怎么解决?

【问题讨论】:

    标签: javascript automated-tests phantomjs casperjs


    【解决方案1】:

    waitFor的签名是

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

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

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

    【讨论】:

    • testFx 实际上在 OP 的代码中没有任何参数。回调后有 baz 参数的是 evaluate
    • @ArtjomB。他正在传递他的baz 变量而不是then() 函数,因为他认为waitFor() 的语法类似于evaluate(),这是错误的。语法不同,没有直接的方法将变量传递给waitFor()调用的测试函数
    • 缩进是错误的,但在我看来,baz 被传递到了this.evaluate。除了baz 之外,testFx 是自包含的,来自更高的范围。我想说的是语法看起来正确,这是casper.waitFor的正确用法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多