Home

Awesome

WebExtensions GeckoDriver

When testing WebExtensions you might want to automatically load them into Firefox and do functional testing with geckodriver.

Installation

npm install --save-dev webextensions-geckodriver

Usage

const webExtensionsGeckoDriver = require('webextensions-geckodriver');
const webExtension = await webExtensionsGeckoDriver('/absolute/path/to/manifest.json');

Loads the WebExtension as Temporary Add-on into a new Firefox instance. See API docs for more details.

Example

manifest.json includes

  "browser_action": {
    "default_title": "Visit Example.com"
  },
  "applications": {
    "gecko": {
      "id": "@examplewebextension",
      "strict_min_version": "57.0"
    }
  }

Test could look like this (using mocha):

const path = require('path');
const assert = require('assert');

const webExtensionsGeckoDriver = require('webextensions-geckodriver');
const {webdriver} = webExtensionsGeckoDriver;

const manifestPath = path.resolve(path.join(__dirname, './path/to/manifest.json'));

describe('Example', () => {
  let geckodriver;

  before(async () => {
    const webExtension = await webExtensionsGeckoDriver(manifestPath);
    geckodriver = webExtension.geckodriver;
  });

  it('should have a Toolbar Button', async () => {
    const button = await geckodriver.wait(webdriver.until.elementLocated(
      // browser_actions automatically have applications.gecko.id as prefix
      // special chars in the id are replaced with _
      webdriver.By.id('_examplewebextension-browser-action')
    ), 1000);
    assert.equal(await button.getAttribute('tooltiptext'), 'Visit Example.com');
  });

  after(() => {
    geckodriver.quit();
  });
});

Full executable example is in the example directory.

API

Exported default function(path[, options])

Returns a Promise that resolves with an initialized WebExtensionsGeckodriver instance in case of success, notably with the following properties:

Exported property: webdriver

Return value of require('selenium-webdriver')

Exported property: firefox

Return value of require('selenium-webdriver/firefox')

Travis Configuration

dist: xenial
services:
  - xvfb

language: node_js
addons:
  firefox: latest

node_js:
  - 'lts/*'

Headless Example

const webExtensionsGeckoDriver = require('webextensions-geckodriver');

const {firefox} = webExtensionsGeckoDriver;
// or equivalently:
//   const firefox = require('selenium-webdriver/firefox')

const fxOptions = new firefox.Options()
  .headless()
  .windowSize({height: 1080, width: 1920}) // If you rely on viewport size

webExtensionsGeckoDriver(manifestPath, {fxOptions})

JSDOM

If you're looking for a way to test WebExtensions with JSDOM then webextensions-jsdom might be for you.

Credits

Thanks to Standard8 for the original work in example-webextension.