Passing a variable to PhantomJS via exec

2019-02-12 20:34发布

问题:

I'm getting started with Grunt and wanting to pass a variable to a PhantomJS script I'm running via exec. What I want to be able to do is pass a url in for the script to take the screen capture from. Any help would be greatly appreciated, thanks!

Darren

Grunt script

exec('phantomjs screenshot.js',
    function (error, stdout, stderr) {
        // Handle output
    }
);

screenshot.js

var page = require('webpage').create();
page.open('http://google.com', function () {
    page.render('google.png');
    phantom.exit();
});

回答1:

Command-line arguments are accessible via module require('system').args (Module System). The first one is always the script name, which is then followed by the subsequent arguments

This script will enumerate all arguments and write out to console.

var args = require('system').args;
if (args.length === 1) {
    console.log('Try to pass some arguments when invoking this script!');
}
else {
    args.forEach(function(arg, i) {
        console.log(i + ': ' + arg);
    });
}

In your case, the solution is

Grunt

exec('phantomjs screenshot.js http://www.google.fr',
    function (error, stdout, stderr) {
        // Handle output
    }
);

screenshot.js

var page = require('webpage').create();
var address = system.args[1];
page.open(address , function () {
    page.render('google.png');
    phantom.exit();
});


回答2:

Here is an easy way to pass and pick args that are applicable. Very flexible and easy to maintain.


Use like:

phantomjs tests/script.js --test-id=457 --log-dir=somedir/

OR

phantomjs tests/script.js --log-dir=somedir/ --test-id=457

OR

phantomjs tests/script.js --test-id=457 --log-dir=somedir/

OR

phantomjs tests/script.js --test-id=457

Script:

var system = require('system');
// process args
var args = system.args;

// these args will be processed
var argsApplicable = ['--test-id', '--log-dir'];
// populated with the valid args provided in availableArgs but like argsValid.test_id
var argsValid = {};

if (args.length === 1) {
  console.log('Try to pass some arguments when invoking this script!');
} else {
  args.forEach(function(arg, i) {
    // skip first arg which is script name
    if(i != 0) {
      var bits = arg.split('=');
      //console.log(i + ': ' + arg);
      if(bits.length !=2) {
        console.log('Arguement has wrong format: '+arg);
      }
      if(argsApplicable.indexOf(bits[0]) != -1) {
        var argVar = bits[0].replace(/\-/g, '_');
        argVar = argVar.replace(/__/, '');
        argsValid[argVar] = bits[1];
      }
    }
  });
}
// enable below to test args
//require('utils').dump(argsValid);
//phantom.exit();