2

我有一个使用 NightmareJS 作为 PhantomJS 包装器的小型测试应用程序,我想测试元素上是否存在类。我有这个代码:

new Nightmare()
  .goto(baseURL)
  .evaluate(function() {
    return document.querySelector('body');
  }, function(element) {
    element.className.should.equal(expected)
    callback();
  })
  .run();

如何将参数传递给 querySelector 方法而不是对标签进行硬编码?

我试过了

var tag = body;
new Nightmare()
      .goto(baseURL)
      .evaluate(function() {
        return document.querySelector(tag);
      }, function(element) {
        element.className.should.equal(expected)
        callback();
      })
      .run();

但是 PhantomJS 总是返回一个错误,它找不到变量。

如何完成将变量参数传递给 querySelector 方法?

4

1 回答 1

7

PhantomJS 有两个上下文。DOM 上下文(或页面上下文)是沙盒的,只能通过evaluate(). evaluate()接受在页面中评估的函数,因此内部代码不能引用在其外部定义的任何变量或函数。

Nightmareevaluate()函数的签名如下:

function evaluate(func, callback/**, arg1, arg2...*/)

这意味着可以将附加值作为附加参数直接传递给函数。func, callbackand arg1, arg2, ... 通过phantomjs-node(Nightmare 使用它来实际与 PhantomJS 交互),然后func, arg1, arg2, ... 被传递给PhantomJS 的evaluate().

注意:函数的参数和返回值evaluate必须是简单的原始对象。经验法则:如果它可以通过 JSON 序列化,那就没问题了。

闭包、函数、DOM 节点等将不起作用

正确的用法是:

var tag = "body";
new Nightmare()
  .goto(baseURL)
  .evaluate(function(innertag) {
    return document.querySelector(innertag).className;
  }, function(className) {
    className.should.equal(expected);
    callback();
  }, tag)
  .run();
于 2015-05-28T19:29:55.720 回答