Narcissistic Preening Monarch


    1.6.1 • Public • Published


    Run your own tests in a real browser with selenium then stream the results out. Uses leadfoot under the hood.



    npm install lightfoot --save-dev


    Install and run a Selenium Server.

    Add a test target to your scripts of your package.json:

      "name": "myapp",
      "version": "0.1.0",
      "scripts": {
        "test": "lightfoot --url=http://localhost:3000/test.html"
      "devDependencies": {
        "lightfoot": "^1.0.0"

    Then run the command npm test to run your test URL in a real browser via selenium.

    notifying lightfoot

    Your test suite can communicate with lightfoot using a global variable stack: window.NOTIFY_LIGHTFOOT

    When your tests are done, push an object to the stack:

    window.NOTIFY_LIGHTFOOT.push({ type: 'done', passed: 2, failed: 1 })

    An example adapter if you're using QUnit:

    window.NOTIFY_LIGHTFOOT = []
    function notifyLightfoot(type, payload) {
      payload.type = type
    QUnit.begin(function(data) { notifyLightfoot('begin', data) })
    QUnit.done(function(data) { notifyLightfoot('done', data) })
    QUnit.testDone(function(data) { notifyLightfoot('testDone', data) })
    QUnit.log(function(data) { notifyLightfoot('assertion', data) })

    and now lightfoot will know and report more info about the lifecycle of your test suite.

    api usage

    // Create an instance of lightfoot
    var lightfoot = require('lightfoot')({
      url: 'http://localhost:3000/test.html',
      browserName: 'firefox',
      varName: 'window.NOTIFY_LIGHTFOOT',
    // Open a session and run the tests {
      process.exit(code || 0)
    // Pipe to built in tap reporter or your own reporter

    running multiple sessions concurrently

    There is a built in helper to run mutliple sessions concurrently:

    var runAll = require('lightfoot').runAll
    // Run each of these sessions with 2 at a time concurrently
      { url: 'http://localhost:3000/test.html?module=one.js', browserName: 'chrome' },
      { url: 'http://localhost:3000/test.html?module=two.js', browserName: 'chrome' },
      { url: 'http://localhost:3000/test.html?module=one.js', browserName: 'firefox' },
      { url: 'http://localhost:3000/test.html?module=two.js', browserName: 'firefox' },
    ], 2, function(codes) {
      // Exit with the greatest exit code
      process.exit(codes.reduce(function(code, last) {
        return (code > last) ? code : last;
      }, 0))

    using with sauce labs

    Install and run Sauce Connect

    Specify the Sauce Labs Selenium web driver URL with your username and access key:

      url: 'http://localhost:3000/test.html',
      seleniumUrl: '',
    }).run(function(code) {
      process.exit(code || 0)

    Now through all kinds of mad science, your tests served locally are ran in a real browser at Sauce Labs and reported to your terminal.

    Release History

    • 1.6.1 - Fix for running a single test runner.
    • 1.6.0 - Add pollInterval option to delay how often we poll the console.
    • 1.5.0 - Rename log event to assertion. log is now used to track console.log messages in the browser.
    • 1.4.0 - Ability to specify capabilities. Helper for running multiple sessions concurrently. Pipe errors to reporter when they occur.
    • 1.3.1 - Add repository field to package.json. Ensure assertions on pretty reporter go on their own line.
    • 1.3.0 - Add pretty reporter
    • 1.2.1 - Avoid multiple done() calls on finish
    • 1.2.0 - Do not call quit() automatically any more to allow for async clean up. User must call quit()
    • 1.1.1 - Ensure quit is called before runCallback
    • 1.1.0 - Fixes to prevent runner from hanging. id is no longer required. Fixes to tap reporter. session and sessionId is exposed. quit is called upon the end automatically now.
    • 1.0.0 - Initial release


    Copyright (c) 2014 Licensed under the MIT license.


    npm i lightfoot

    DownloadsWeekly Downloads






    Last publish


    • shama
    • taytay
    • bclinkinbeard