Javascript PhantomJS传递参数进行求值

Javascript PhantomJS传递参数进行求值,javascript,node.js,phantomjs,nightmare,Javascript,Node.js,Phantomjs,Nightmare,我有一个小的测试应用程序,它使用梦魇ejs作为PhantomJS的包装,我想测试元素上是否存在类。我有以下代码: new Nightmare() .goto(baseURL) .evaluate(function() { return document.querySelector('body'); }, function(element) { element.className.should.equal(expected) callback(); })

我有一个小的测试应用程序,它使用梦魇ejs作为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方法?

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

详情如下:

function evaluate(func, callback/**, arg1, arg2...*/)
这意味着附加值可以作为附加参数直接传递到函数中<代码>函数,
回调
arg1
arg2
。。。通过(噩梦用来实际与PhantomJS接口)和
func
arg1
arg2
。。。然后传递给

注意:参数和
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();