Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing a variable to PhantomJS via exec

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();
});
like image 802
frontendbeast Avatar asked May 25 '13 18:05

frontendbeast


2 Answers

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();
});
like image 186
Cybermaxs Avatar answered Nov 03 '22 20:11

Cybermaxs


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();
like image 30
DynamicDan Avatar answered Nov 03 '22 21:11

DynamicDan