Chrome Launcher
Launch Google Chrome with ease from node.
- Disables many Chrome services that add noise to automated scenarios
- Opens up the browser's
remote-debugging-port
on an available port - Automagically locates a Chrome binary to launch
- Uses a fresh Chrome profile for each launch, and cleans itself up on
kill()
- Binds
Ctrl-C
(by default) to terminate the Chrome process - Exposes a small set of options for configurability over these details
Once launched, interacting with the browser must be done over the devtools protocol, typically via chrome-remote-interface. For many cases Puppeteer is recommended, though it has its own chrome launching mechanism.
Installing
yarn add chrome-launcher
npm install chrome-launcher
API
.launch([opts])
Launch options
{
port: number;
portStrictMode: boolean;
chromeFlags: Array<string>;
prefs: {[key: string]: Object};
handleSIGINT: boolean;
chromePath: string;
userDataDir: string | boolean;
startingUrl: string;
logLevel: 'verbose'|'info'|'error'|'silent';
ignoreDefaultFlags: boolean;
connectionPollInterval: number;
maxConnectionRetries: number;
envVars: {[key: string]: string};
};
Launched chrome interface
.launch().then(chrome => ...
chrome.port: number;
chrome.kill: () => Promise<void>;
chrome.pid: number;
chrome.process: childProcess
ChromeLauncher.Launcher.defaultFlags()
Returns an Array<string>
of the default flags Chrome is launched with. Typically used along with the ignoreDefaultFlags
and chromeFlags
options.
Note: This array will exclude the following flags: --remote-debugging-port
--disable-setuid-sandbox
--user-data-dir
.
ChromeLauncher.Launcher.getInstallations()
Returns an Array<string>
of paths to available Chrome installations. When chromePath
is not provided to .launch()
, the first installation returned from this method is used instead.
Note: This method performs synchronous I/O operations.
.killAll()
Attempts to kill all Chrome instances created with .launch([opts])
. Returns a Promise that resolves to an array of errors that occurred while killing instances. If all instances were killed successfully, the array will be empty.
import * as ChromeLauncher from 'chrome-launcher';
async function cleanup() {
await ChromeLauncher.killAll();
}
Examples
Launching chrome:
import * as ChromeLauncher from 'chrome-launcher';
ChromeLauncher.launch({
startingUrl: 'https://google.com'
}).then(chrome => {
console.log(`Chrome debugging port running on ${chrome.port}`);
});
Launching headless chrome:
import * as ChromeLauncher from 'chrome-launcher';
ChromeLauncher.launch({
startingUrl: 'https://google.com',
chromeFlags: ['--headless', '--disable-gpu']
}).then(chrome => {
console.log(`Chrome debugging port running on ${chrome.port}`);
});
Launching with support for extensions and audio:
import * as ChromeLauncher from 'chrome-launcher';
const newFlags = ChromeLauncher.Launcher.defaultFlags().filter(flag => flag !== '--disable-extensions' && flag !== '--mute-audio');
ChromeLauncher.launch({
ignoreDefaultFlags: true,
chromeFlags: newFlags,
}).then(chrome => { ... });
Continuous Integration
In a CI environment like Travis, Chrome may not be installed. If you want to use chrome-launcher
, Travis can install Chrome at run time with an addon. Alternatively, you can also install Chrome using the download-chrome.sh
script.
Then in .travis.yml
, use it like so:
language: node_js
install:
- yarn install
before_script:
- export DISPLAY=:99.0
- export CHROME_PATH="$(pwd)/chrome-linux/chrome"
- sh -e /etc/init.d/xvfb start
- sleep 3
addons:
chrome: stable