Passing a variable to PhantomJS via exec

11,941

Solution 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();
});

Solution 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();
Share:
11,941
M. Nejat Aydin
Author by

M. Nejat Aydin

Developer of HTML, CSS and JS. Lifter of heavy things. He/Him. 🏳️‍🌈 🦄

Updated on July 28, 2022

Comments

  • M. Nejat Aydin
    M. Nejat Aydin almost 2 years

    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();
    });