casperjs 5.05 KB
#!/usr/bin/env python

import os
import shlex
import sys
import logging

# Setup logger
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def resolve(path):
    if os.path.islink(path):
        path = os.path.join(os.path.dirname(path), os.readlink(path))
        return resolve(path)
    return path

SUPPORTED_ENGINES = {
    'phantomjs' : {
        'native_args': [
            'cookies-file',
            'config',
            'debug',
            'disk-cache',
            'disk-cache-path',
            'ignore-ssl-errors',
            'load-images',
            'load-plugins',
            'local-url-access',
            'local-storage-path',
            'local-storage-quota',
            'offline-storage-path',
            'offline-storage-quota',
            'local-to-remote-url-access',
            'max-disk-cache-size',
            'output-encoding',
            'proxy',
            'proxy-auth',
            'proxy-type',
            'remote-debugger-port',
            'remote-debugger-autorun',
            'script-encoding',
            'script-language',
            'ssl-protocol',
            'ssl-ciphers',
            'ssl-certificates-path',
            'ssl-client-certificate-file',
            'ssl-client-key-file',
            'ssl-client-key-passphrase',
            'web-security',
            'webdriver',
            'webdriver-logfile',
            'webdriver-loglevel',
            'webdriver-selenium-grid-hub',
            'wd',
            'w',
        ],
        'env_varname': 'PHANTOMJS_EXECUTABLE',
        'default_exec' : 'phantomjs'
    },
    'slimerjs': {
        'native_args': [
            '-P',
            '-jsconsole',
            '-CreateProfile',
            '-profile',
            'error-log-file',
            'user-agent',
            'viewport-width',
            'viewport-height',
            #phantomjs options
            'cookies-file',
            'config',
            'debug',
            'disk-cache',
            'ignore-ssl-errors',
            'load-images',
            'load-plugins',
            'local-storage-path',
            'local-storage-quota',
            'local-to-remote-url-access',
            'max-disk-cache-size',
            'output-encoding',
            'proxy',
            'proxy-auth',
            'proxy-type',
            'remote-debugger-port',
            'remote-debugger-autorun',
            'script-encoding',
            'ssl-protocol',
            'ssl-certificates-path',
            'web-security',
            'webdriver',
            'webdriver-logfile',
            'webdriver-loglevel'
            'webdriver-selenium-grid-hub',
            'wd',
            'w',
        ],
        'env_varname': 'SLIMERJS_EXECUTABLE',
        'default_exec' : 'slimerjs',
        'native_args_with_space': [
            '-P',
            '-CreateProfile',
            '-profile'
        ]

    },
}

ENGINE = os.environ.get('CASPERJS_ENGINE', 'phantomjs')
ENGINE_ARGS = shlex.split(os.environ.get('ENGINE_FLAGS', ''))
ENGINE_NATIVE_ARGS = []
ENGINE_EXECUTABLE = ''

CASPER_ARGS = []
CASPER_PATH = os.path.abspath(os.path.join(os.path.dirname(resolve(__file__)),
                                           '..'))
SYS_ARGS = sys.argv[1:]

# retrieve the engine name
for arg in SYS_ARGS:
    if arg.startswith('--engine='):
        ENGINE = arg[9:].lower()
        break

if not ENGINE in SUPPORTED_ENGINES:
    logger.error('Bad engine name. Only phantomjs and slimerjs are supported')
    sys.exit(1)

ENGINE_NATIVE_ARGS = SUPPORTED_ENGINES[ENGINE]['native_args']
ENGINE_NATIVE_ARGS_WITH_SPACE = SUPPORTED_ENGINES[ENGINE].get('native_args_with_space') or []
ENGINE_EXECUTABLE = os.environ.get(SUPPORTED_ENGINES[ENGINE]['env_varname'],
                                   os.environ.get('ENGINE_EXECUTABLE',
                                       SUPPORTED_ENGINES[ENGINE]['default_exec']))

def extract_arg_name(arg):
    "parse out any option name"
    try:
        return arg.split('=', 1)[0].replace('--', '', 1)
    except IndexError:
        return arg

arg_iter = iter(SYS_ARGS)

for arg in arg_iter:
    arg_name = extract_arg_name(arg)
    found = False
    if arg_name in ENGINE_NATIVE_ARGS:
        ENGINE_ARGS.append(arg)
        if arg_name in ENGINE_NATIVE_ARGS_WITH_SPACE:
            nextArg = next(arg_iter, '')
            if nextArg == '' or nextArg.startswith('--'):
                logger.error('Fatal: Missing expected value for parameter %s' % (arg_name))
                sys.exit(1)
            else:
                ENGINE_ARGS.append(nextArg)
        found = True

    if not found and arg_name != 'engine':
        CASPER_ARGS.append(arg)

CASPER_COMMAND = [ENGINE_EXECUTABLE]
CASPER_COMMAND.extend(ENGINE_ARGS)
CASPER_COMMAND.extend([
    os.path.join(CASPER_PATH, 'bin', 'bootstrap.js'),
    '--casper-path=%s' % CASPER_PATH,
    '--cli'
])
CASPER_COMMAND.extend(CASPER_ARGS)

try:
    os.execvp(CASPER_COMMAND[0], CASPER_COMMAND)
except OSError:
    err = os.strerror(2)
    logger.error('Fatal: %s; did you install %s?' % (err, ENGINE))
    sys.exit(1)