PhantomJS传递参数进行评估

Jas*_*ost 2 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();
Run Code Online (Sandbox Code Playgroud)

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

我试过了

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

但是,PhantomJS始终返回一个无法找到变量的错误.

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

Art*_* B. 7

PhantomJS有两种情境.DOM上下文(或页面上下文)是沙箱,只能通过evaluate().evaluate()采用在页面中计算的函数,因此内部代码不能引用在其外部定义的任何变量或函数.

梦魇evaluate()功能签名如下:

function evaluate(func, callback/**, arg1, arg2...*/)
Run Code Online (Sandbox Code Playgroud)

这意味着可以将其他值作为附加参数直接传递给函数.func,callbackarg1,arg2...被穿过phantomjs节点(其用于通过梦魇实际上与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();
Run Code Online (Sandbox Code Playgroud)