Launch Google Chrome with ease from node.
Launch Google Chrome with ease from node.
remote-debugging-port on an available portkill()Ctrl-C (by default) to terminate the Chrome processOnce 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.
yarn add chrome-launcher
# or with npm:
npm install chrome-launcher.launch([opts])….launch().then(chrome => ...// The remote debugging port exposed by the launched chrome
chrome.port: number;
// Method to kill Chrome (and cleanup the profile folder)
chrome.kill: () => Promise<void>;
// The process id
chrome.pid: number;
// The childProcess object for the launched Chrome
chrome.process: childProcess
// If chromeFlags contains --remote-debugging-pipe. Otherwise remoteDebuggingPipes is null.
chrome.remoteDebuggingPipes.incoming: ReadableStream
chrome.remoteDebuggingPipes.outgoing: WritableStreamWhen --remote-debugging-pipe is passed via chromeFlags, then port will be
unusable (0) by default. Instead, debugging messages are exchanged via
remoteDebuggingPipes.incoming and remoteDebuggingPipes.outgoing. The data
in these pipes are JSON values terminated by a NULL byte (\x00).
Data written to remoteDebuggingPipes.outgoing are sent to Chrome,
data read from remoteDebuggingPipes.incoming are received from Chrome.
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();
}import * as ChromeLauncher from 'chrome-launcher';
ChromeLauncher.launch({
startingUrl: 'https://google.com'
}).then(chrome => {
console.log(`Chrome debugging port running on ${chrome.port}`);
});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}`);
});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 => { ... });To programatically load an extension at runtime, use --remote-debugging-pipe
as shown in test/load-extension-test.ts.
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 # wait for xvfb to boot
addons:
chrome: stableNo open issues yet, or sync has not completed.