Run your WebExtension with GeckoDriver
npm install webextensions-geckodriverWhen testing WebExtensions you might want to automatically load them into Firefox and do functional testing with geckodriver.
```
npm install --save-dev webextensions-geckodriver
`js`
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.
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):`js
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.
#### Exported default function(path[, options])
path* , required, absolute path to the manifest.json file
options*
Returns a Promise that resolves with an initialized WebExtensionsGeckodriver instance in case of success, notably with the following properties:
geckodriver*, , a new selenium-webdriver/firefox instance with previously loaded geckodriver
install*, , returns a Promise that resolves when installing is finished, accepts an options :
extensionPath*, , optional, path to something that installAddon can handle. Defaults to the web-ext build extensionPath.
temporary*, , optional, whether the WebExt should be installed temporary. Defaults to true.
internalUUID*, , returns a Promise that resolves to the Internal UUID of the installed extension
uninstall*, , returns a Promise that resolves when uninstalling is finished, accepts an optional extensions id as
#### Exported property: webdriver
Return value of require('selenium-webdriver')
#### Exported property: firefox
Return value of require('selenium-webdriver/firefox')
`
dist: xenial
services:
- xvfb
language: node_js
addons:
firefox: latest
node_js:
- 'lts/*'
`
`js
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})
`
If you're looking for a way to test WebExtensions with JSDOM then webextensions-jsdom` might be for you.
Thanks to Standard8 for the original work in example-webextension.