with certain extensions.</p><p>Puppeteer passes <code>--disable-extensions</code> flag by default and will fail to launch when such policies are active.</p><p>To work around this, try running without the flag:</p><divclass="language-ts codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token keyword"style="color:#00009f">const</span><spanclass="token plain"> browser </span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token plain"></span><spanclass="token keyword"style="color:#00009f">await</span><spanclass="token plain"> puppeteer</span><spanclass="token punctuation"style="color:#393A34">.</span><spanclass="token function"style="color:#d73a49">launch</span><spanclass="token punctuation"style="color:#393A34">(</span><spanclass="token punctuation"style="color:#393A34">{</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"> ignoreDefaultArgs</span><spanclass="token operator"style="color:#393A34">:</span><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">[</span><spanclass="token string"style="color:#e3116c">'--disable-extensions'</span><spanclass="token punctuation"style="color:#393A34">]</span><spanclass="token punctuation"style="color:#393A34">,</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">}</span><spanclass="token punctuation"style="color:#393A34">)</span><spanclass="token punctuation"style="color:#393A34">;</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Context: <ahref="https://github.com/puppeteer/puppeteer/issues/3681#issuecomment-447865342"target="_blank"rel="noopener noreferrer">issue 3681</a>.</p></blockquote><h2class="anchor anchorWithStickyNavbar_LWe7"id="chrome-headless-doesnt-launch-on-unix">Chrome headless doesn't launch on UNIX<aclass="hash-link"href="#chrome-headless-doesnt-launch-on-unix"title="Direct link to heading"></a></h2><p>Make sure all the necessary dependencies are installed. You can run <code>ldd chrome | grep not</code> on a Linux
machine to check which dependencies are missing. The common ones are provided below.</p><detailsclass="details_lb9f alert alert--info details_b_Ee"data-collapsed="true"><summary>Debian (e.g. Ubuntu) Dependencies</summary><div><divclass="collapsibleContent_i85q"><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token plain">ca-certificates</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">fonts-liberation</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libappindicator3-1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libasound2</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libatk-bridge2.0-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libatk1.0-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libc6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libcairo2</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libcups2</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libdbus-1-3</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libexpat1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libfontconfig1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libgbm1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libgcc1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libglib2.0-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libgtk-3-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libnspr4</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libnss3</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libpango-1.0-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libpangocairo-1.0-0</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libstdc++6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libx11-6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libx11-xcb1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxcb1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxcomposite1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxcursor1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxdamage1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxext6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxfixes3</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxi6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxrandr2</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxrender1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxss1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">libxtst6</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">lsb-release</span><br></span><spanc
the host should be configured first. If there's no good sandbox for Chrome to use, it will crash
with the error <code>No usable sandbox!</code>.</p><p>If you <strong>absolutely trust</strong> the content you open in Chrome, you can launch Chrome
with the <code>--no-sandbox</code> argument:</p><divclass="language-ts codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token keyword"style="color:#00009f">const</span><spanclass="token plain"> browser </span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token plain"></span><spanclass="token keyword"style="color:#00009f">await</span><spanclass="token plain"> puppeteer</span><spanclass="token punctuation"style="color:#393A34">.</span><spanclass="token function"style="color:#d73a49">launch</span><spanclass="token punctuation"style="color:#393A34">(</span><spanclass="token punctuation"style="color:#393A34">{</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"> args</span><spanclass="token operator"style="color:#393A34">:</span><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">[</span><spanclass="token string"style="color:#e3116c">'--no-sandbox'</span><spanclass="token punctuation"style="color:#393A34">,</span><spanclass="token plain"></span><spanclass="token string"style="color:#e3116c">'--disable-setuid-sandbox'</span><spanclass="token punctuation"style="color:#393A34">]</span><spanclass="token punctuation"style="color:#393A34">,</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">}</span><spanclass="token punctuation"style="color:#393A34">)</span><spanclass="token punctuation"style="color:#393A34">;</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><divclass="admonition admonition-caution alert alert--warning"><divclass="admonition-heading"><h5><spanclass="admonition-icon"><svgxmlns="http://www.w3.org/2000/svg"width="16"height="16"viewBox="0 0 16 16"><pathfill-rule="evenodd"d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</h5></div><divclass="admonition-content"><p>Running without a sandbox is <strong>strongly discouraged</strong>. Consider configuring a sandbox instead.</p></div></div><p>There are 2 ways to configure a sandbox in Chromium.</p><h3class="anchor anchorWithStickyNavbar_LWe7"id="recommended-enable-user-namespace-cloning">[recommended]<!----> Enable <ahref="http://man7.org/linux/man-pages/man7/user_namespaces.7.html"target="_blank"rel="noopener noreferrer">user namespace cloning</a><aclass="hash-link"href="#recommended-enable-user-namespace-cloning"title="Direct link to heading"></a></h3><p>User namespace cloning is only supported by modern kernels. Unprivileged user namespaces are generally fine to enable,
but in some cases they open up more kernel attack surface for (unsandboxed) non-root processes to elevate to
kernel privileges.</p><divclass="language-bash codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token function"style="color:#d73a49">sudo</span><spanclass="token plain"> sysctl -w kernel.unprivileged_userns_clone</span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token number"style="color:#36acaa">1</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3class="anchor anchorWithStickyNavbar_LWe7"id="alternative-setup-setuid-sandbox">[alternative]<!----> Setup <ahref="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux/suid_sandbox_development.md"target="_blank"rel="noopener noreferrer">setuid sandbox</a><aclass="hash-link"href="#alternative-setup-setuid-sandbox"title="Direct link to heading"></a></h3><p>The setuid sandbox comes as a standalone executable and is located next to the Chromium that Puppeteer downloads. It is
fine to re-use the same sandbox executable for different Chromium versions, so the following could be
done only once per host environment:</p><divclass="language-bash codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token comment"style="color:#999988;font-style:italic"># cd to the downloaded instance</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token builtin class-name">cd</span><spanclass="token plain"></span><spanclass="token operator"style="color:#393A34"><</span><spanclass="token plain">project-dir-path</span><spanclass="token operator"style="color:#393A34">></span><spanclass="token plain">/node_modules/puppeteer/.local-chromium/linux-</span><spanclass="token operator"style="color:#393A34"><</span><spanclass="token plain">revision</span><spanclass="token operator"style="color:#393A34">></span><spanclass="token plain">/chrome-linux/</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">sudo</span><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">chown</span><spanclass="token plain"> root:root chrome_sandbox</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">sudo</span><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">chmod</span><spanclass="token plain"></span><spanclass="token number"style="color:#36acaa">4755</span><spanclass="token plain"> chrome_sandbox</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token comment"style="color:#999988;font-style:italic"># copy sandbox executable to a shared location</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">sudo</span><spanclass="token plain"></span><spanclass="token function"style="color:#d73a49">cp</span><spanclass="token plain"> -p chrome_sandbox /usr/local/sbin/chrome-devel-sandbox</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token comment"style="color:#999988;font-style:italic"># export CHROME_DEVEL_SANDBOX env variable</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token builtin class-name">export</span><spanclass="token plain"></span><spanclass="token assign-left variable"style="color:#36acaa">CHROME_DEVEL_SANDBOX</span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token plain">/usr/local/sbin/chrome-devel-sandbox</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You might want to export the <code>CHROME_DEVEL_SANDBOX</code> env variable by default. In this case, add the following to the <code>~/.bashrc</code>
or <code>.zshenv</code>:</p><divclass="language-bash codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token builtin class-name">export</span><spanclass="token plain"></span><spanclass="token assign-left variable"style="color:#36acaa">CHROME_DEVEL_SANDBOX</span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token plain">/usr/local/sbin/chrome-devel-sandbox</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-on-travis-ci">Running Puppeteer on Travis CI<aclass="hash-link"href="#running-puppeteer-on-travis-ci"title="Direct link to heading"></a></h2><blockquote><p>👋 We ran our tests for Puppeteer on Travis CI until v6.0.0 (when we've migrated to GitHub Actions) - see our historical <ahref="https://github.com/puppeteer/puppeteer/blob/v5.5.0/.travis.yml"target="_blank"rel="noopener noreferrer"><code>.travis.yml</code> (v5.5.0)</a> for reference.</p></blockquote><p>Tips-n-tricks:</p><ul><li><ahref="https://en.wikipedia.org/wiki/Xvfb"target="_blank"rel="noopener noreferrer">xvfb</a> service should be launched in order to run Chromium in non-headless mode</li><li>Runs on Xenial Linux on Travis by default</li><li>Runs <code>npm install</code> by default</li><li><code>node_modules</code> is cached by default</li></ul><p><code>.travis.yml</code> might look like this:</p><divclass="language-yml codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token key atrule"style="color:#00a4db">language</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"> node_js</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">node_js</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"> node</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">services</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"> xvfb</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">script</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">-</span><spanclass="token plain"> npm test</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0
image</a> in your config
like so:<divclass="language-yaml codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-yaml codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token key atrule"style="color:#00a4db">docker</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">-</span><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">image</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"> circleci/node</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token number"style="color:#36acaa">14</span><spanclass="token plain"></span><spanclass="token comment"style="color:#999988;font-style:italic"># Use your desired version</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">environment</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token key atrule"style="color:#00a4db">NODE_ENV</span><spanclass="token punctuation"style="color:#393A34">:</span><spanclass="token plain"> development </span><spanclass="token comment"style="color:#999988;font-style:italic"># Only needed if puppeteer is in `devDependencies`</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li>Dependencies like <code>libXtst6</code> probably need to be installed via <code>apt-get</code>,
into your own config.</li><li>Lastly, if you’re using Puppeteer through Jest, then you may encounter an
error spawning child processes:<divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token plain">[00:00.0] jest args: --e2e --spec --max-workers=36</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">Error: spawn ENOMEM</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"> at ChildProcess.spawn (internal/child_process.js:394:11)</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>This is likely caused by Jest autodetecting the number of processes on the
entire machine (<code>36</code>) rather than the number allowed to your container
(<code>2</code>). To fix this, set <code>jest --maxWorkers=2</code> in your test command.</li></ol><h2class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-in-docker">Running Puppeteer in Docker<aclass="hash-link"href="#running-puppeteer-in-docker"title="Direct link to heading"></a></h2><blockquote><p>👋 We used <ahref="https://cirrus-ci.org/"target="_blank"rel="noopener noreferrer">Cirrus Ci</a> to run our tests for Puppeteer in a Docker container until v3.0.x - see our historical <ahref="https://github.com/puppeteer/puppeteer/blob/v3.0.1/.ci/node12/Dockerfile.linux"target="_blank"rel="noopener noreferrer"><code>Dockerfile.linux</code> (v3.0.1)</a> for reference.</p></blockquote><p>Getting headless Chrome up and running in Docker can be tricky.
The bundled Chromium that Puppeteer installs is missing the necessary
shared library dependencies.</p><p>To fix, you'll need to install the missing dependencies and the
latest Chromium package in your Dockerfile:</p><divclass="language-Dockerfile codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-Dockerfile codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token plain">FROM node:14-slim</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># installs, work.</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">RUN apt-get update \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& apt-get install -y wget gnupg \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main">> /etc/apt/sources.list.d/google.list' \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& apt-get update \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"> --no-install-recommends \</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain">&& rm -rf /var/lib/apt/lists/*</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># If running Docker >= 1.13.0 use docker run's --init arg to reap zombie processes, otherwise</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># uncomment the following lines to have `dumb-init` as PID 1</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_x86_64 /usr/local/bin/dumb-init</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># RUN chmod +x /usr/local/bin/dumb-init</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># ENTRYPOINT ["dumb-init", "--"]</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># Uncomment to skip the chromium download when installing puppeteer. If you do,</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># you'll need to launch puppeteer with:</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># browser.launch({executablePath: 'google-chrome-stable'})</span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"># ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true</span><br></span><spanclass="token-line"style="color:#39
This is <ahref="https://github.com/c0b/chrome-in-docker/issues/1"target="_blank"rel="noopener noreferrer">typically too small</a> for Chrome
and will cause Chrome to crash when rendering large pages. To fix, run the container with
<code>docker run --shm-size=1gb</code> to increase the size of <code>/dev/shm</code>. Since Chrome 65, this is no
longer necessary. Instead, launch the browser with the <code>--disable-dev-shm-usage</code> flag:</p><divclass="language-ts codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#393A34"><spanclass="token keyword"style="color:#00009f">const</span><spanclass="token plain"> browser </span><spanclass="token operator"style="color:#393A34">=</span><spanclass="token plain"></span><spanclass="token keyword"style="color:#00009f">await</span><spanclass="token plain"> puppeteer</span><spanclass="token punctuation"style="color:#393A34">.</span><spanclass="token function"style="color:#d73a49">launch</span><spanclass="token punctuation"style="color:#393A34">(</span><spanclass="token punctuation"style="color:#393A34">{</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"> args</span><spanclass="token operator"style="color:#393A34">:</span><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">[</span><spanclass="token string"style="color:#e3116c">'--disable-dev-shm-usage'</span><spanclass="token punctuation"style="color:#393A34">]</span><spanclass="token punctuation"style="color:#393A34">,</span><spanclass="token plain"></span><br></span><spanclass="token-line"style="color:#393A34"><spanclass="token plain"></span><spanclass="token punctuation"style="color:#393A34">}</span><spanclass="token punctuation"style="color:#393A34">)</span><spanclass="token punctuation"style="color:#393A34">;</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgclass="copyButtonIcon_y97N"viewBox="0 0 24 24"><pathd="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgclass="copyButtonSuccessIcon_LjdS"viewBox="0 0 24 24"><pathd="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This will write shared memory files into <code>/tmp</code> instead of <code>/dev/shm</code>. See <ahref="https://bugs.chromium.org/p/chromium/issues/detail?id=736452"target="_blank"rel="noopener noreferrer">crbug.com/736452</a> for more details.</p><p>Seeing other weird errors when launching Chrome? Try running your container
with <code>docker run --cap-add=SYS_ADMIN</code> when developing locally. Since the Dockerfile
adds a <code>pptr</code> user as a non-privileged user, it may not have all the necessary privileges.</p><p><ahref="https://github.com/Yelp/dumb-init"target="_blank"rel="noopener noreferrer">dumb-init</a> is worth checking out if you're
experiencing a lot of zombies Chrome processes sticking around. There's special
treatment for processes with PID=1, which makes it hard to terminate Chrome
properly in some cases (e.g. in Docker).</p><h2class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-in-the-cloud">Running Puppeteer in the cloud<aclass="hash-link"href="#running-puppeteer-in-the-cloud"title="Direct link to heading"></a></h2><h3class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-on-google-app-engine">Running Puppeteer on Google App Engine<aclass="hash-link"href="#running-puppeteer-on-google-app-engine"title="Direct link to heading"></a></h3><p>The Node.js runtime of the <ahref="https://cloud.google.com/appengine/docs/standard/nodejs/"target="_blank"rel="noopener noreferrer">App Engine standard environment</a> comes with all system packages needed to run Headless Chrome.</p><p>To use <code>puppeteer</code>, simply list the module as a dependency in your <code>package.json</code> and deploy to Google App Engine. Read more about using <code>puppeteer</code> on App Engine by following <ahref="https://cloud.google.com/appengine/docs/standard/nodejs/using-headless-chrome-with-puppeteer"target="_blank"rel="noopener noreferrer">the official tutorial</a>.</p><h3class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-on-google-cloud-functions">Running Puppeteer on Google Cloud Functions<aclass="hash-link"href="#running-puppeteer-on-google-cloud-functions"title="Direct link to heading"></a></h3><p>The Node.js 10 runtime of <ahref="https://cloud.google.com/functions/docs/"target="_blank"rel="noopener noreferrer">Google Cloud Functions</a> comes with all system packages needed to run Headless Chrome.</p><p>To use <code>puppeteer</code>, simply list the module as a dependency in your <code>package.json</code> and deploy your function to Google Cloud Functions using the <code>nodejs10</code> runtime.</p><h3class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-on-google-cloud-run">Running Puppeteer on Google Cloud Run<aclass="hash-link"href="#running-puppeteer-on-google-cloud-run"title="Direct link to heading"></a></h3><p>The default Node.js runtime of <ahref="https://cloud.google.com/run/docs/"target="_blank"rel="noopener noreferrer">Google Cloud Run</a> does not come with the system packages needed to run Headless Chrome. You will need to set up your own <code>Dockerfile</code> and <ahref="#chrome-headless-doesnt-launch-on-unix">include the missing dependencies</a>.</p><h3class="anchor anchorWithStickyNavbar_LWe7"id="running-puppeteer-on-heroku">Running Puppeteer on Heroku<aclass="hash-link"href="#running-puppeteer-on-heroku"title="Direct link to heading"></a></h3><p>Running Puppeteer on Heroku requires some additional dependencies that aren't included on the Linux box that Heroku spins up for you. To add the dependencies on deploy, add the Puppeteer Heroku buildpack to the list of buildpacks for your app under Settings > Buildpacks.</p><p>The url for the buildpack is <ahref="https://github.com/jontewks/puppeteer-heroku-buildpack"target="_blank"rel="noopener noreferrer">https://github.com/jontewks/puppeteer-heroku-buildpack</a></p><p>Ensure that you're using <code>'--no-sandbox'</code> mode when launching Puppeteer. This can be done by passing it as an argument to your <code>.launch()</code> call: <code>puppeteer.launch({ args: ['--no-sandbox'] });</code>.</p><p>When you click add buildpack, simply paste that url into the input, and click save. On the next deploy, your app will also install the dependencies that Puppeteer needs to run.</p><p>If you need to render Chinese, Japanese, or Korean characters you may need to use a buildpack with additional font files like <ahref="https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack"target="_blank"rel="noopener noreferrer">https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack</a></p><p>There's also another <ahref="https://timleland.com/headless-chrome-on-heroku/"target="_blank"rel="noopener noreferrer">simple guide</a> from @timleland that includes a sample project: <ahref="https://timleland.com/headless-chrome-on-heroku/"