PhantomJS 传递参数来评估

PhantomJS pass argument to evaluate

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

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 总是 returns 找不到变量的错误。

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

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

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

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

这意味着附加值可以作为附加参数直接传递给函数。 func, callbackarg1, arg2, ... 通过 phantomjs-node (which is used by Nightmare to actually interface with PhantomJS) and func, arg1, arg2, ... are then passed to PhantomJS's evaluate().

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

正确的用法是:

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