PhantomJS传递参数来评估

时间:2015-05-28 18:34:01

标签: javascript node.js phantomjs nightmare

我有一个小型测试应用程序使用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方法?

1 个答案:

答案 0 :(得分:7)

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

signature of Nightmare's evaluate() function如下:

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

这意味着其他值可以作为附加参数直接传递给函数。 funccallbackarg1arg2,...通过phantomjs-node(Nightmare用来实际与PhantomJS交互)和{{然后将1}},funcarg1,...传递给PhantomJS's evaluate()

  

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

     

闭包,函数,DOM节点等将工作!

正确用法是:

evaluate