puppeteer/next/troubleshooting/index.html

160 lines
122 KiB
HTML
Raw Normal View History

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-troubleshooting">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.3.1">
<title data-rh="true">Troubleshooting | Puppeteer</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pptr.dev/next/troubleshooting"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:counter" content="3"><meta data-rh="true" property="og:title" content="Troubleshooting | Puppeteer"><meta data-rh="true" name="description" content="Chromium currently does not provide arm64 binaries for Linux. There are only"><meta data-rh="true" property="og:description" content="Chromium currently does not provide arm64 binaries for Linux. There are only"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pptr.dev/next/troubleshooting"><link data-rh="true" rel="alternate" href="https://pptr.dev/next/troubleshooting" hreflang="en"><link data-rh="true" rel="alternate" href="https://pptr.dev/next/troubleshooting" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://DVKY664LG7-dsn.algolia.net" crossorigin="anonymous"><link rel="search" type="application/opensearchdescription+xml" title="Puppeteer" href="/opensearch.xml">
<script src="/fix-location.js"></script><link rel="stylesheet" href="/assets/css/styles.7578944d.css">
<link rel="preload" href="/assets/js/runtime~main.50910380.js" as="script">
<link rel="preload" href="/assets/js/main.4c57d60b.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" alt="Puppeteer Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" alt="Puppeteer Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Puppeteer</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/next/">Docs</a><a class="navbar__item navbar__link" href="/next/api/puppeteer.puppeteernode">API</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class="navbar__link" aria-haspopup="true" aria-expanded="false" role="button" href="/next/">Next</a><ul class="dropdown__menu"><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/next/troubleshooting">Next</a></li><li><a class="dropdown__link" href="/troubleshooting">19.8.0</a></li><li><hr class="dropdown-separator"></li><li class="dropdown-archived-versions"><b>Archived versions</b></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.5/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.5<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.4/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.4<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.3/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.2/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.1/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.1<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://github.com/puppeteer/puppeteer/blob/v19.7.0/docs/api/index.md" target="_blank" rel="noopener noreferrer" class="dropdown__link">19.7.0<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24
binaries for
<a href="https://pptr.dev/contributing#macos-arm-and-custom-executables" target="_blank" rel="noopener noreferrer">Mac ARM with experimental support from Puppeteer</a>.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="cannot-find-module-puppeteer-coreinternal"><code>Cannot find module &#x27;puppeteer-core/internal/...&#x27;</code><a href="#cannot-find-module-puppeteer-coreinternal" class="hash-link" aria-label="Direct link to cannot-find-module-puppeteer-coreinternal" title="Direct link to cannot-find-module-puppeteer-coreinternal"></a></h2><p>This can occur is your Node.js version is lower than 14 or you are using a
custom resolver (such as
<a href="https://www.npmjs.com/package/jest-resolve" target="_blank" rel="noopener noreferrer"><code>jest-resolve</code></a>). For the former,
we do not support deprecated versions of Node.js. For the latter, usually
upgrading the resolver (or its parent module such as <code>jest</code>) will work (e.g.
<a href="https://github.com/puppeteer/puppeteer/issues/9121" target="_blank" rel="noopener noreferrer">https://github.com/puppeteer/puppeteer/issues/9121</a>)</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="could-not-find-expected-browser-locally"><code>Could not find expected browser locally</code><a href="#could-not-find-expected-browser-locally" class="hash-link" aria-label="Direct link to could-not-find-expected-browser-locally" title="Direct link to could-not-find-expected-browser-locally"></a></h2><p>Starting from v19.0.0, Puppeteer will download browsers into
<code>~/.cache/puppeteer</code> using
<a href="https://nodejs.org/api/os.html#oshomedir" target="_blank" rel="noopener noreferrer"><code>os.homedir</code></a> for better caching
between Puppeteer upgrades. Generally the home directory is well-defined (even
on Windows), but occasionally the home directory may not be available. In this
case, we provide the <code>PUPPETEER_CACHE_DIR</code> variable which allows you to change
the installation directory.</p><p>For example,</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PUPPETEER_CACHE_DIR=$(pwd) npm install puppeteer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PUPPETEER_CACHE_DIR=$(pwd) node &lt;script-path&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can also create a configuration file named <code>.puppeteerrc.cjs</code> (or
<code>puppeteer.config.cjs</code>) at the root of your application with the contents</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">join</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">&#x27;path&#x27;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * @type {import(&quot;puppeteer&quot;).Configuration}</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">cacheDirectory</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;.cache&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;puppeteer&#x27;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You will need to reinstall <code>puppeteer</code> in order for the configuration to take
effect. See <a href="/next/guides/configuration">Configuring Puppeteer</a> for more
information.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chrome-headless-doesnt-launch-on-windows">Chrome headless doesn&#x27;t launch on Windows<a href="#chrome-headless-doesnt-launch-on-windows" class="hash-link" aria-label="Direct link to Chrome headless doesn&#x27;t launch on Windows" title="Direct link to Chrome headless doesn&#x27;t launch on Windows"></a></h2><p>Some <a href="https://support.google.com/chrome/a/answer/7532015" target="_blank" rel="noopener noreferrer">chrome policies</a> might
enforce running Chrome/Chromium 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><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> browser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> puppeteer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">launch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ignoreDefaultArgs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;--disable-extensions&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="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:
<a href="https://github.com/puppeteer/puppeteer/issues/3681#issuecomment-447865342" target="_blank" rel="noopener noreferrer">issue 3681</a>.</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chrome-headless-doesnt-launch-on-unix">Chrome headless doesn&#x27;t launch on UNIX<a href="#chrome-headless-doesnt-launch-on-unix" class="hash-link" aria-label="Direct link to Chrome headless doesn&#x27;t launch on UNIX" title="Direct link to Chrome headless doesn&#x27;t launch on UNIX"></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><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Debian (e.g. Ubuntu) Dependencies</summary><div><div class="collapsibleContent_i85q"><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ca-certificates</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fonts-liberation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libasound2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libatk-bridge2.0-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libatk1.0-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libc6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libcairo2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libcups2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libdbus-1-3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libexpat1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libfontconfig1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libgbm1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libgcc1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libglib2.0-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libgtk-3-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libnspr4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libnss3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libpango-1.0-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libpangocairo-1.0-0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libstdc++6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libx11-6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libx11-xcb1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxcb1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxcomposite1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxcursor1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxdamage1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxext6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxfixes3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxi6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxrandr2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxrender1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxss1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">libxtst6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lsb-release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">wget</span><br></span><span class="token-line" style="color:#393A34"><span class="t
command</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">yum update nss -y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Check out discussions</summary><div><div class="collapsibleContent_i85q"><ul><li><a href="https://github.com/puppeteer/puppeteer/issues/290" target="_blank" rel="noopener noreferrer">#290</a> - Debian
troubleshooting <br></li><li><a href="https://github.com/puppeteer/puppeteer/issues/391" target="_blank" rel="noopener noreferrer">#391</a> - CentOS
troubleshooting <br></li><li><a href="https://github.com/puppeteer/puppeteer/issues/379" target="_blank" rel="noopener noreferrer">#379</a> - Alpine
troubleshooting <br></li></ul></div></div></details><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chrome-headless-disables-gpu-compositing">Chrome headless disables GPU compositing<a href="#chrome-headless-disables-gpu-compositing" class="hash-link" aria-label="Direct link to Chrome headless disables GPU compositing" title="Direct link to Chrome headless disables GPU compositing"></a></h2><p>Chrome/Chromium requires <code>--use-gl=egl</code> to
<a href="https://github.com/chromium/chromium/commit/19671359ae25aa1e30bde90f8ff92453eeaac2ba" target="_blank" rel="noopener noreferrer">enable GPU acceleration in headless mode</a>.</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> browser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> puppeteer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">launch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> headless</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;--use-gl=egl&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chrome-is-downloaded-but-fails-to-launch-on-nodejs-14">Chrome is downloaded but fails to launch on Node.js 14<a href="#chrome-is-downloaded-but-fails-to-launch-on-nodejs-14" class="hash-link" aria-label="Direct link to Chrome is downloaded but fails to launch on Node.js 14" title="Direct link to Chrome is downloaded but fails to launch on Node.js 14"></a></h2><p>If you get an error that looks like this when trying to launch Chromium:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">(node:15505) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">spawn /Users/.../node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium ENOENT</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcon
The most common cause is a bug in Node.js v14.0.0 which broke <code>extract-zip</code>, the
module Puppeteer uses to extract browser downloads into the right place. The bug
was fixed in Node.js v14.1.0, so please make sure you&#x27;re running that version or
higher.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-chrome-linux-sandbox">Setting Up Chrome Linux Sandbox<a href="#setting-up-chrome-linux-sandbox" class="hash-link" aria-label="Direct link to Setting Up Chrome Linux Sandbox" title="Direct link to Setting Up Chrome Linux Sandbox"></a></h2><p>In order to protect the host environment from untrusted web content, Chrome uses
<a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux/sandboxing.md" target="_blank" rel="noopener noreferrer">multiple layers of sandboxing</a>.
For this to work properly, the host should be configured first. If there&#x27;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><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> browser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> puppeteer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">launch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;--no-sandbox&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;--disable-setuid-sandbox&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-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</div><div class="admonitionContent_S0QG"><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><h3 class="anchor anchorWithStickyNavbar_LWe7" id="recommended-enable-user-namespace-cloning">[recommended]<!-- --> Enable <a href="http://man7.org/linux/man-pages/man7/user_namespaces.7.html" target="_blank" rel="noopener noreferrer">user namespace cloning</a><a href="#recommended-enable-user-namespace-cloning" class="hash-link" aria-label="Direct link to recommended-enable-user-namespace-cloning" title="Direct link to recommended-enable-user-namespace-cloning"></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><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> sysctl -w kernel.unprivileged_userns_clone</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="alternative-setup-setuid-sandbox">[alternative]<!-- --> Setup <a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux/suid_sandbox_development.md" target="_blank" rel="noopener noreferrer">setuid sandbox</a><a href="#alternative-setup-setuid-sandbox" class="hash-link" aria-label="Direct link to alternative-setup-setuid-sandbox" title="Direct link to alternative-setup-setuid-sandbox"></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><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># cd to the downloaded instance</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">project-dir-path</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/node_modules/puppeteer/.local-chromium/linux-</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">revision</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/chrome-linux/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> root:root chrome_sandbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4755</span><span class="token plain"> chrome_sandbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># copy sandbox executable to a shared location</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> -p chrome_sandbox /usr/local/sbin/chrome-devel-sandbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># export CHROME_DEVEL_SANDBOX env variable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">CHROME_DEVEL_SANDBOX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/local/sbin/chrome-devel-sandbox</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="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><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">CHROME_DEVEL_SANDBOX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/local/sbin/chrome-devel-sandbox</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-travis-ci">Running Puppeteer on Travis CI<a href="#running-puppeteer-on-travis-ci" class="hash-link" aria-label="Direct link to Running Puppeteer on Travis CI" title="Direct link to Running Puppeteer on Travis CI"></a></h2><blockquote><p>👋 We ran our tests for Puppeteer on Travis CI until v6.0.0 (when we&#x27;ve
migrated to GitHub Actions) - see our historical
<a href="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><a href="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><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">language</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> node_js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">node_js</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xvfb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> npm test</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-wsl-windows-subsystem-for-linux">Running Puppeteer on WSL (Windows subsystem for Linux)<a href="#running-puppeteer-on-wsl-windows-subsystem-for-linux" class="hash-link" aria-label="Direct link to Running Puppeteer on WSL (Windows subsystem for Linux)" title="Direct link to Running Puppeteer on WSL (Windows subsystem for Linux)"></a></h2><p>See <a href="https://github.com/puppeteer/puppeteer/issues/1837" target="_blank" rel="noopener noreferrer">this thread</a> with some
tips specific to WSL. In a nutshell, you need to install missing dependencies by
either:</p><ol><li><a href="https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps#install-google-chrome-for-linux" target="_blank" rel="noopener noreferrer">Installing Chrome on WSL to install all dependencies</a></li><li>Installing required dependencies manually:
<code>sudo apt install libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2</code>.</li></ol><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-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</div><div class="admonitionContent_S0QG"><p>The list of required dependencies might get outdated and depend on what you
already have installed.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-circleci">Running Puppeteer on CircleCI<a href="#running-puppeteer-on-circleci" class="hash-link" aria-label="Direct link to Running Puppeteer on CircleCI" title="Direct link to Running Puppeteer on CircleCI"></a></h2><p>Running Puppeteer smoothly on CircleCI requires the following steps:</p><ol><li>Start with a
<a href="https://circleci.com/docs/2.0/circleci-images/#nodejs" target="_blank" rel="noopener noreferrer">NodeJS image</a> in your
config like so:<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">docker</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> circleci/node</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">14</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Use your desired version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">NODE_ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development </span><span class="token comment" style="color:#999988;font-style:italic"># Only needed if puppeteer is in `devDependencies`</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="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>, so
use the
<a href="https://circleci.com/orbs/registry/orb/threetreeslight/puppeteer" target="_blank" rel="noopener noreferrer">threetreeslight/puppeteer</a>
orb
(<a href="https://circleci.com/orbs/registry/orb/threetreeslight/puppeteer#quick-start" target="_blank" rel="noopener noreferrer">instructions</a>),
or paste parts of its
<a href="https://circleci.com/orbs/registry/orb/threetreeslight/puppeteer#orb-source" target="_blank" rel="noopener noreferrer">source</a>
into your own config.</li><li>Lastly, if youre using Puppeteer through Jest, then you may encounter an
error spawning child processes:<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[00:00.0] jest args: --e2e --spec --max-workers=36</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error: spawn ENOMEM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> at ChildProcess.spawn (internal/child_process.js:394:11)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="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><h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-in-docker">Running Puppeteer in Docker<a href="#running-puppeteer-in-docker" class="hash-link" aria-label="Direct link to Running Puppeteer in Docker" title="Direct link to Running Puppeteer in Docker"></a></h2><blockquote><p>👋 We used <a href="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
<a href="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. Starting from v16.0.0 we are shipping a Docker image via the
GitHub registry. The Dockerfile is located
<a href="https://github.com/puppeteer/puppeteer/blob/main/docker/Dockerfile" target="_blank" rel="noopener noreferrer">here</a> and
the usage instructions are in the
<a href="https://github.com/puppeteer/puppeteer#running-in-docker" target="_blank" rel="noopener noreferrer">README.md</a>. The
instructions below might be still helpful if you are building your own image.</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&#x27;ll need to install the missing dependencies and the latest Chromium
package in your Dockerfile:</p><div class="language-Dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-Dockerfile codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM node:14-slim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="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><span class="token-line" style="color:#393A34"><span class="token plain"># Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># installs, work.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; apt-get install -y wget gnupg \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; sh -c &#x27;echo &quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&quot; &gt;&gt; /etc/apt/sources.list.d/google.list&#x27; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; apt-get update \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; 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><span class="token-line" style="color:#393A34"><span class="token plain"> --no-install-recommends \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; rm -rf /var/lib/apt/lists/*</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># If running Docker &gt;= 1.13.0 use docker run&#x27;s --init arg to reap zombie processes, otherwise</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># uncomment the following lines to have `dumb-init` as PID 1</span><br></span><span class="token-line" style="color:#393A34"><span class="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><span class="token-line" style="color:#393A34"><span class="token plain"># RUN chmod +x /usr/local/bin/dumb-init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ENTRYPOINT [&quot;dumb-init&quot;, &quot;--&quot;]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Uncomment to skip the chromium download when installing puppeteer. If you do,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># you&#x27;ll need to launch puppeteer with:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># browser.launch({executablePath: &#x27;google-chrome-stable&#x27;})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true</span><br></span><span class="token-line" style="color:#393A34"><span clas
the command:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run -i --init --rm --cap-add</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">SYS_ADMIN </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> --name puppeteer-chrome puppeteer-chrome-linux </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> -e </span><span class="token string" style="color:#e3116c">&quot;</span><span class="token string variable" style="color:#36acaa">`</span><span class="token string variable function" style="color:#d73a49">cat</span><span class="token string variable" style="color:#36acaa"> yourscript.js</span><span class="token string variable" style="color:#36acaa">`</span><span class="token string" style="color:#e3116c">&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>There&#x27;s a full example at <a href="https://github.com/ebidel/try-puppeteer" target="_blank" rel="noopener noreferrer">https://github.com/ebidel/try-puppeteer</a> that shows how
to run this Dockerfile from a webserver running on App Engine Flex (Node).</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-on-alpine">Running on Alpine<a href="#running-on-alpine" class="hash-link" aria-label="Direct link to Running on Alpine" title="Direct link to Running on Alpine"></a></h3><p>The
<a href="https://pkgs.alpinelinux.org/package/edge/community/x86_64/chromium" target="_blank" rel="noopener noreferrer">newest Chromium package</a>
supported on Alpine is 100, which corresponds to
<a href="https://github.com/puppeteer/puppeteer/releases/tag/v13.5.0" target="_blank" rel="noopener noreferrer">Puppeteer v13.5.0</a>.</p><p>Example Dockerfile:</p><div class="language-Dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-Dockerfile codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM alpine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Installs latest Chromium (100) package.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apk add --no-cache \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> chromium \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> nss \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> freetype \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> harfbuzz \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ca-certificates \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ttf-freefont \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> nodejs \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> yarn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Tell Puppeteer to skip installing Chrome. We&#x27;ll be using the installed package.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Puppeteer v13.5.0 works with Chromium 100.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN yarn add puppeteer@13.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Add user so we don&#x27;t need --no-sandbox.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN addgroup -S pptruser &amp;&amp; adduser -S -G pptruser pptruser \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; mkdir -p /home/pptruser/Downloads /app \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; chown -R pptruser:pptruser /home/pptruser \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &amp;&amp; chown -R pptruser:pptruser /app</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Run everything after as non-privileged user.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER pptruser</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"
different configuration to finally achieve success.</p><p>Usually the issue looks like this:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Error: Failed to launch chrome</span><span class="token operator" style="color:#393A34">!</span><span class="token plain"> spawn /usr/bin/chromium-browser ENOENT</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You need to patch two places:</p><ol><li>Your <code>gitlab-ci.yml</code> config</li><li>Arguments&#x27; list when launching pupepeteer</li></ol><p>In <code>gitlab-ci.yml</code> we need to install some packages to make it possible to
launch headless Chrome in your docker env:</p><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">before_script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">get update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">get install </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">yq gconf</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service libasound2 libatk1.0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 libc6 libcairo2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> libcups2 libdbus</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">3 libexpat1 libfontconfig1 libgcc1 libgconf</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> libgdk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pixbuf2.0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 libglib2.0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 libgtk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">3</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 libnspr4 libpango</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> libpangocairo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 libstdc++6 libx11</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">6 libx11</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">xcb1 libxcb1 libxcomposite1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> libxss1 libxtst6 ca</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">certificates fonts</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">liberation libnss3 lsb</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">release<
<code>&#x27;--disable-setuid-sandbox&#x27;</code> when launching Puppeteer. This can be done by
passing them as an arguments to your <code>.launch()</code> call:
<code>puppeteer.launch({ args: [&#x27;--no-sandbox&#x27;, &#x27;--disable-setuid-sandbox&#x27;] });</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="tips">Tips<a href="#tips" class="hash-link" aria-label="Direct link to Tips" title="Direct link to Tips"></a></h4><p>By default, Docker runs a container with a <code>/dev/shm</code> shared memory space 64MB.
This is <a href="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><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> browser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> puppeteer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">launch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;--disable-dev-shm-usage&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="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
<a href="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><a href="https://github.com/Yelp/dumb-init" target="_blank" rel="noopener noreferrer">dumb-init</a> is worth checking out if you&#x27;re
experiencing a lot of zombies Chrome processes sticking around. There&#x27;s special
treatment for processes with PID=1, which makes it hard to terminate Chrome
properly in some cases (e.g. in Docker).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-in-the-cloud">Running Puppeteer in the cloud<a href="#running-puppeteer-in-the-cloud" class="hash-link" aria-label="Direct link to Running Puppeteer in the cloud" title="Direct link to Running Puppeteer in the cloud"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-google-app-engine">Running Puppeteer on Google App Engine<a href="#running-puppeteer-on-google-app-engine" class="hash-link" aria-label="Direct link to Running Puppeteer on Google App Engine" title="Direct link to Running Puppeteer on Google App Engine"></a></h3><p>The Node.js runtime of the
<a href="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
<a href="https://cloud.google.com/appengine/docs/standard/nodejs/using-headless-chrome-with-puppeteer" target="_blank" rel="noopener noreferrer">the official tutorial</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-google-cloud-functions">Running Puppeteer on Google Cloud Functions<a href="#running-puppeteer-on-google-cloud-functions" class="hash-link" aria-label="Direct link to Running Puppeteer on Google Cloud Functions" title="Direct link to Running Puppeteer on Google Cloud Functions"></a></h3><p>You can try running Puppeteer on
<a href="https://cloud.google.com/functions/docs/" target="_blank" rel="noopener noreferrer">Google Cloud Functions</a> but we have
been getting reports that newest runtimes don&#x27;t have all dependencies to run
Chromium.</p><p>If you encounter problems due to missing Chromium dependencies, consider using
Google Cloud Run instead where you can provide a custom Dockerfile with all
dependencies. Also, see our
<a href="https://github.com/puppeteer/puppeteer/pkgs/container/puppeteer" target="_blank" rel="noopener noreferrer">official Docker image</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-google-cloud-run">Running Puppeteer on Google Cloud Run<a href="#running-puppeteer-on-google-cloud-run" class="hash-link" aria-label="Direct link to Running Puppeteer on Google Cloud Run" title="Direct link to Running Puppeteer on Google Cloud Run"></a></h3><p>The default Node.js runtime of
<a href="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
<a href="#chrome-headless-doesnt-launch-on-unix">include the missing dependencies</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-heroku">Running Puppeteer on Heroku<a href="#running-puppeteer-on-heroku" class="hash-link" aria-label="Direct link to Running Puppeteer on Heroku" title="Direct link to Running Puppeteer on Heroku"></a></h3><p>Running Puppeteer on Heroku requires some additional dependencies that aren&#x27;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 &gt; Buildpacks.</p><p>The url for the buildpack is
<a href="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&#x27;re using <code>&#x27;--no-sandbox&#x27;</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: [&#x27;--no-sandbox&#x27;] });</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
<a href="https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack" target="_blank" rel="noopener noreferrer">https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack</a></p><p>There&#x27;s also another
<a href="https://timleland.com/headless-chrome-on-heroku/" target="_blank" rel="noopener noreferrer">simple guide</a> from @timleland
that includes a sample project:
<a href="https://timleland.com/headless-chrome-on-heroku/" target="_blank" rel="noopener noreferrer">https://timleland.com/headless-chrome-on-heroku/</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-aws-lambda">Running Puppeteer on AWS Lambda<a href="#running-puppeteer-on-aws-lambda" class="hash-link" aria-label="Direct link to Running Puppeteer on AWS Lambda" title="Direct link to Running Puppeteer on AWS Lambda"></a></h3><p>AWS Lambda <a href="https://docs.aws.amazon.com/lambda/latest/dg/limits.html" target="_blank" rel="noopener noreferrer">limits</a>
deployment package sizes to ~50MB. This presents challenges for running headless
Chrome (and therefore Puppeteer) on Lambda. The community has put together a few
resources that work around the issues:</p><ul><li><a href="https://github.com/sparticuz/chromium" target="_blank" rel="noopener noreferrer">https://github.com/sparticuz/chromium</a> (a vendor and framework agnostic library that supports modern versions of <code>chromium</code>)</li><li><a href="https://github.com/alixaxel/chrome-aws-lambda" target="_blank" rel="noopener noreferrer">https://github.com/alixaxel/chrome-aws-lambda</a> (supports up to puppeteer 10.1 - outdated)</li><li><a href="https://github.com/adieuadieu/serverless-chrome/blob/HEAD/docs/chrome.md" target="_blank" rel="noopener noreferrer">https://github.com/adieuadieu/serverless-chrome/blob/HEAD/docs/chrome.md</a>
(serverless plugin - outdated)</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-puppeteer-on-aws-ec2-instance-running-amazon-linux">Running Puppeteer on AWS EC2 instance running Amazon-Linux<a href="#running-puppeteer-on-aws-ec2-instance-running-amazon-linux" class="hash-link" aria-label="Direct link to Running Puppeteer on AWS EC2 instance running Amazon-Linux" title="Direct link to Running Puppeteer on AWS EC2 instance running Amazon-Linux"></a></h3><p>If you are using an EC2 instance running amazon-linux in your CI/CD pipeline,
and if you want to run Puppeteer tests in amazon-linux, follow these steps.</p><ol><li><p>To install Chromium, you have to first enable <code>amazon-linux-extras</code> which
comes as part of
<a href="https://aws.amazon.com/premiumsupport/knowledge-center/ec2-enable-epel/" target="_blank" rel="noopener noreferrer">EPEL (Extra Packages for Enterprise Linux)</a>:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo amazon-linux-extras install epel -y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Next, install Chromium:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo yum install -y chromium</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li></ol><p>Now Puppeteer can launch Chromium to run your tests. If you do not enable EPEL
and if you continue installing chromium as part of <code>npm install</code>, Puppeteer
cannot launch Chromium due to unavailablity of <code>libatk-1.0.so.0</code> and many more
packages.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="code-transpilation-issues">Code Transpilation Issues<a href="#code-transpilation-issues" class="hash-link" aria-label="Direct link to Code Transpilation Issues" title="Direct link to Code Transpilation Issues"></a></h2><p>If you are using a JavaScript transpiler like babel or TypeScript, calling
<code>evaluate()</code> with an async function might not work. This is because while
<code>puppeteer</code> uses <code>Function.prototype.toString()</code> to serialize functions while
transpilers could be changing the output code in such a way it&#x27;s incompatible
with <code>puppeteer</code>.</p><p>Some workarounds to this problem would be to instruct the transpiler not to mess
up with the code, for example, configure TypeScript to use latest ecma version
(<code>&quot;target&quot;: &quot;es2018&quot;</code>). Another workaround could be using string templates
instead of functions:</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">evaluate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">(async() =&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"> console.log(&#x27;1&#x27;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">})()</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="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><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/next/chromium-support"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Chromium Support</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/next/contributing"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Contributing</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#cannot-find-module-puppeteer-coreinternal" class="table-of-contents__link toc-highlight"><code>Cannot find module &#39;puppeteer-core/internal/...&#39;</code></a></li><li><a href="#could-not-find-expected-browser-locally" class="table-of-contents__link toc-highlight"><code>Could not find expected browser locally</code></a></li><li><a href="#chrome-headless-doesnt-launch-on-windows" class="table-of-contents__link toc-highlight">Chrome headless doesn&#39;t launch on Windows</a></li><li><a href="#chrome-headless-doesnt-launch-on-unix" class="table-of-contents__link toc-highlight">Chrome headless doesn&#39;t launch on UNIX</a></li><li><a href="#chrome-headless-disables-gpu-compositing" class="table-of-contents__link toc-highlight">Chrome headless disables GPU compositing</a></li><li><a href="#chrome-is-downloaded-but-fails-to-launch-on-nodejs-14" class="table-of-contents__link toc-highlight">Chrome is downloaded but fails to launch on Node.js 14</a></li><li><a href="#setting-up-chrome-linux-sandbox" class="table-of-contents__link toc-highlight">Setting Up Chrome Linux Sandbox</a><ul><li><a href="#recommended-enable-user-namespace-cloning" class="table-of-contents__link toc-highlight">recommended Enable user namespace cloning</a></li><li><a href="#alternative-setup-setuid-sandbox" class="table-of-contents__link toc-highlight">alternative Setup setuid sandbox</a></li></ul></li><li><a href="#running-puppeteer-on-travis-ci" class="table-of-contents__link toc-highlight">Running Puppeteer on Travis CI<
<script src="/assets/js/runtime~main.50910380.js"></script>
<script src="/assets/js/main.4c57d60b.js"></script>
</body>
</html>