"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[26568],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=s(n),c=a,d=m["".concat(l,".").concat(c)]||m[c]||h[c]||p;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,o=new Array(p);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});n(67294);var r=n(3905);function a(){return a=Object.assign||function(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}const o={sidebar_position:1},i="Puppeteer",l={unversionedId:"index",id:"index",title:"Puppeteer",description:"Build status",source:"@site/../docs/index.md",sourceDirName:".",slug:"/",permalink:"/next/",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"sidebar",next:{title:"FAQ",permalink:"/next/faq"}},s={},u=[{value:"API | FAQ | Contributing | Troubleshooting",id:"api--faq--contributing--troubleshooting",level:4},{value:"What can I do?",id:"what-can-i-do",level:4},{value:"Getting Started",id:"getting-started",level:2},{value:"Installation",id:"installation",level:3},{value:"Environment Variables",id:"environment-variables",level:4},{value:"puppeteer-core",id:"puppeteer-core",level:4},{value:"Usage",id:"usage",level:3},{value:"Example",id:"example",level:4},{value:"Default runtime settings",id:"default-runtime-settings",level:3},{value:"Using Docker",id:"using-docker",level:4},{value:"Using Chrome Extensions",id:"using-chrome-extensions",level:4},{value:"Resources",id:"resources",level:2},{value:"Contributing",id:"contributing",level:2},{value:"FAQ",id:"faq",level:2}],h={toc:u};function m(e){var{components:t}=e,n=p(e,["components"]);return(0,r.kt)("wrapper",a({},h,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",a({},{id:"puppeteer"}),"Puppeteer"),(0,r.kt)("p",null,(0,r.kt)("a",a({parentName:"p"},{href:"https://github.com/puppeteer/puppeteer/actions?query=workflow%3ACI"}),(0,r.kt)("img",a({parentName:"a"},{src:"https://github.com/puppeteer/puppeteer/workflows/CI/badge.svg",alt:"Build status"}))),"\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://npmjs.org/package/puppeteer"}),(0,r.kt)("img",a({parentName:"a"},{src:"https://img.shields.io/npm/v/puppeteer.svg",alt:"npm puppeteer package"})))),(0,r.kt)("img",{src:"https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png",height:"200",align:"right"}),(0,r.kt)("h4",a({},{id:"api--faq--contributing--troubleshooting"}),(0,r.kt)("a",a({parentName:"h4"},{href:"https://pptr.dev/api"}),"API")," | ",(0,r.kt)("a",a({parentName:"h4"},{href:"https://pptr.dev/faq"}),"FAQ")," | ",(0,r.kt)("a",a({parentName:"h4"},{href:"https://pptr.dev/contributing"}),"Contributing")," | ",(0,r.kt)("a",a({parentName:"h4"},{href:"https://pptr.dev/troubleshooting"}),"Troubleshooting")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Puppeteer is a Node.js library which provides a high-level API to control\nChrome/Chromium over the\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://chromedevtools.github.io/devtools-protocol/"}),"DevTools Protocol"),".\nPuppeteer runs in\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://developers.google.com/web/updates/2017/04/headless-chrome"}),"headless"),"\nmode by default, but can be configured to run in full (non-headless)\nChrome/Chromium.")),(0,r.kt)("h4",a({},{id:"what-can-i-do"}),"What can I do?"),(0,r.kt)("p",null,"Most things that you can do manually in the browser can be done using Puppeteer!\nHere are a few examples to get you started:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Generate screenshots and PDFs of pages."),(0,r.kt)("li",{parentName:"ul"},'Crawl a SPA (Single-Page Application) and generate pre-rendered content (i.e.\n"SSR" (Server-Side Rendering)).'),(0,r.kt)("li",{parentName:"ul"},"Automate form submission, UI testing, keyboard input, etc."),(0,r.kt)("li",{parentName:"ul"},"Create an automated testing environment using the latest JavaScript and\nbrowser features."),(0,r.kt)("li",{parentName:"ul"},"Capture a\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference"}),"timeline trace"),"\nof your site to help diagnose performance issues."),(0,r.kt)("li",{parentName:"ul"},"Test Chrome Extensions.")),(0,r.kt)("h2",a({},{id:"getting-started"}),"Getting Started"),(0,r.kt)("h3",a({},{id:"installation"}),"Installation"),(0,r.kt)("p",null,"To use Puppeteer in your project, run:"),(0,r.kt)("pre",null,(0,r.kt)("code",a({parentName:"pre"},{className:"language-bash"}),"npm i puppeteer\n# or `yarn add puppeteer`\n# or `pnpm i puppeteer`\n")),(0,r.kt)("p",null,"When you install Puppeteer, it automatically downloads a recent version of\nChromium (~170MB macOS, ~282MB Linux, ~280MB Windows) that is\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/faq#q-why-doesnt-puppeteer-vxxx-work-with-chromium-vyyy"}),"guaranteed to work"),"\nwith Puppeteer. For a version of Puppeteer without installation, see\n",(0,r.kt)("a",a({parentName:"p"},{href:"#puppeteer-core"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer-core")),"."),(0,r.kt)("h4",a({},{id:"environment-variables"}),"Environment Variables"),(0,r.kt)("p",null,"Puppeteer looks for certain\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://en.wikipedia.org/wiki/Environment_variable"}),"environment variables")," for\ncustomizing behavior. If Puppeteer doesn't find them in the environment during\nthe installation step, a lowercased variant of these variables will be used from\nthe ",(0,r.kt)("a",a({parentName:"p"},{href:"https://docs.npmjs.com/cli/config"}),"npm config"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"HTTP_PROXY"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"HTTPS_PROXY"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"NO_PROXY")," - defines HTTP proxy settings that are\nused to download and run the browser."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_CACHE_DIR")," - defines the directory to be used by Puppeteer for\ncaching. Defaults to\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://nodejs.org/api/os.html#os_os_homedir"}),(0,r.kt)("inlineCode",{parentName:"a"},"os.homedir()/.cache/puppeteer")),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_SKIP_CHROMIUM_DOWNLOAD")," - do not download bundled Chromium during\ninstallation step."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_TMP_DIR")," - defines the directory to be used by Puppeteer for\ncreating temporary files. Defaults to\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://nodejs.org/api/os.html#os_os_tmpdir"}),(0,r.kt)("inlineCode",{parentName:"a"},"os.tmpdir()")),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_DOWNLOAD_HOST")," - specifies the URL prefix that is used to download\nChromium. Note: this includes protocol and might even include path prefix.\nDefaults to ",(0,r.kt)("inlineCode",{parentName:"li"},"https://storage.googleapis.com"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_DOWNLOAD_PATH")," - specifies the path for the downloads folder.\nDefaults to ",(0,r.kt)("inlineCode",{parentName:"li"},"/chromium"),", where ",(0,r.kt)("inlineCode",{parentName:"li"},"")," is Puppeteer's cache\ndirectory."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_BROWSER_REVISION")," - specifies a certain version of the browser\nyou'd like Puppeteer to use. See\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer.launch"))," on\nhow executable path is inferred."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_EXECUTABLE_PATH")," - specifies an executable path to be used in\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer.launch")),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_PRODUCT")," - specifies which browser you'd like Puppeteer to use.\nMust be either ",(0,r.kt)("inlineCode",{parentName:"li"},"chrome")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"firefox"),". This can also be used during\ninstallation to fetch the recommended browser binary. Setting ",(0,r.kt)("inlineCode",{parentName:"li"},"product"),"\nprogrammatically in\n",(0,r.kt)("a",a({parentName:"li"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer.launch")),"\nsupersedes this environment variable."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"PUPPETEER_EXPERIMENTAL_CHROMIUM_MAC_ARM")," \u2014 specify Puppeteer download\nChromium for Apple M1. On Apple M1 devices Puppeteer by default downloads the\nversion for Intel's processor which runs via Rosetta. It works without any\nproblems, however, with this option, you should get more efficient resource\nusage (CPU and RAM) that could lead to a faster execution time.")),(0,r.kt)("p",null,"Environment variables except for ",(0,r.kt)("inlineCode",{parentName:"p"},"PUPPETEER_CACHE_DIR")," are not used for\n",(0,r.kt)("a",a({parentName:"p"},{href:"#puppeteer-core"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer-core"))," since core does not automatically handle\nbrowser downloading."),(0,r.kt)("h4",a({},{id:"puppeteer-core"}),(0,r.kt)("inlineCode",{parentName:"h4"},"puppeteer-core")),(0,r.kt)("p",null,"Every release since v1.7.0 we publish two packages:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://www.npmjs.com/package/puppeteer"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://www.npmjs.com/package/puppeteer-core"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer-core")))),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer")," is a ",(0,r.kt)("em",{parentName:"p"},"product")," for browser automation. When installed, it downloads\na version of Chromium, which it then drives using ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core"),". Being an\nend-user product, ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer")," supports a bunch of convenient ",(0,r.kt)("inlineCode",{parentName:"p"},"PUPPETEER_*")," env\nvariables to tweak its behavior."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core")," is a ",(0,r.kt)("em",{parentName:"p"},"library")," to help drive anything that supports DevTools\nprotocol. ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core")," doesn't download Chromium when installed. Being a\nlibrary, ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core")," is fully driven through its programmatic interface."),(0,r.kt)("p",null,"You should only use ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core")," if you are\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.puppeteer.connect"}),"connecting to a remote browser"),"\nor ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.browserfetcher"}),"managing browsers yourself"),".\nIf you are managing browsers yourself, you will need to call\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),(0,r.kt)("inlineCode",{parentName:"a"},"puppeteer.launch"))," with\nan explicit\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.launchoptions.executablepath"}),(0,r.kt)("inlineCode",{parentName:"a"},"executablePath")),"\nor ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.launchoptions.channel"}),(0,r.kt)("inlineCode",{parentName:"a"},"channel")),"."),(0,r.kt)("p",null,"When using ",(0,r.kt)("inlineCode",{parentName:"p"},"puppeteer-core"),", remember to change the import:"),(0,r.kt)("pre",null,(0,r.kt)("code",a({parentName:"pre"},{className:"language-ts"}),"import puppeteer from 'puppeteer-core';\n")),(0,r.kt)("h3",a({},{id:"usage"}),"Usage"),(0,r.kt)("p",null,"Puppeteer follows the latest\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://github.com/nodejs/Release#release-schedule"}),"maintenance LTS")," version of\nNode."),(0,r.kt)("p",null,"Puppeteer will be familiar to people using other browser testing frameworks. You\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),"launch"),"/",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.connect"}),"connect"),"\na ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.browser"}),"browser"),",\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.browser.newpage"}),"create")," some\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.page"}),"pages"),", and then manipulate them with\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api"}),"Puppeteer's API"),"."),(0,r.kt)("p",null,"For more in-depth usage, check our ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/guides"}),"guides")," and\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://github.com/puppeteer/puppeteer/tree/main/examples"}),"examples"),"."),(0,r.kt)("h4",a({},{id:"example"}),"Example"),(0,r.kt)("p",null,"The following example searches\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://developers.google.com/web"}),"developers.google.com/web"),' for articles\ntagged "Headless Chrome" and scrape results from the results page.'),(0,r.kt)("pre",null,(0,r.kt)("code",a({parentName:"pre"},{className:"language-ts"}),"import puppeteer from 'puppeteer';\n\n(async () => {\n const browser = await puppeteer.launch();\n const page = await browser.newPage();\n\n await page.goto('https://developers.google.com/web/');\n\n // Type into search box.\n await page.type('.devsite-search-field', 'Headless Chrome');\n\n // Wait for suggest overlay to appear and click \"show all results\".\n const allResultsSelector = '.devsite-suggest-all-results';\n await page.waitForSelector(allResultsSelector);\n await page.click(allResultsSelector);\n\n // Wait for the results page to load and display the results.\n const resultsSelector = '.gsc-results .gs-title';\n await page.waitForSelector(resultsSelector);\n\n // Extract the results from the page.\n const links = await page.evaluate(resultsSelector => {\n return [...document.querySelectorAll(resultsSelector)].map(anchor => {\n const title = anchor.textContent.split('|')[0].trim();\n return `${title} - ${anchor.href}`;\n });\n }, resultsSelector);\n\n // Print all the files.\n console.log(links.join('\\n'));\n\n await browser.close();\n})();\n")),(0,r.kt)("h3",a({},{id:"default-runtime-settings"}),"Default runtime settings"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"1. Uses Headless mode")),(0,r.kt)("p",null,"Puppeteer launches Chromium in\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://developers.google.com/web/updates/2017/04/headless-chrome"}),"headless mode"),".\nTo launch a full version of Chromium, set the\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.browserlaunchargumentoptions.headless"}),(0,r.kt)("inlineCode",{parentName:"a"},"headless")),"\noption when launching a browser:"),(0,r.kt)("pre",null,(0,r.kt)("code",a({parentName:"pre"},{className:"language-ts"}),"const browser = await puppeteer.launch({headless: false}); // default is true\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"2. Runs a bundled version of Chromium")),(0,r.kt)("p",null,"By default, Puppeteer downloads and uses a specific version of Chromium so its\nAPI is guaranteed to work out of the box. To use Puppeteer with a different\nversion of Chrome or Chromium, pass in the executable's path when creating a\n",(0,r.kt)("inlineCode",{parentName:"p"},"Browser")," instance:"),(0,r.kt)("pre",null,(0,r.kt)("code",a({parentName:"pre"},{className:"language-ts"}),"const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});\n")),(0,r.kt)("p",null,"You can also use Puppeteer with Firefox Nightly (experimental support). See\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/api/puppeteer.puppeteernode.launch"}),(0,r.kt)("inlineCode",{parentName:"a"},"Puppeteer.launch"))," for\nmore information."),(0,r.kt)("p",null,"See\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/"}),(0,r.kt)("inlineCode",{parentName:"a"},"this article")),"\nfor a description of the differences between Chromium and Chrome.\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/chromium_browser_vs_google_chrome.md"}),(0,r.kt)("inlineCode",{parentName:"a"},"This article")),"\ndescribes some differences for Linux users."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"3. Creates a fresh user profile")),(0,r.kt)("p",null,"Puppeteer creates its own browser user profile which it ",(0,r.kt)("strong",{parentName:"p"},"cleans up on every\nrun"),"."),(0,r.kt)("h4",a({},{id:"using-docker"}),"Using Docker"),(0,r.kt)("p",null,"See our ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/guides/docker"}),"guide on using Docker"),"."),(0,r.kt)("h4",a({},{id:"using-chrome-extensions"}),"Using Chrome Extensions"),(0,r.kt)("p",null,"See our\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/guides/chrome-extensions"}),"guide on using Chrome extensions"),"."),(0,r.kt)("h2",a({},{id:"resources"}),"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://pptr.dev/api"}),"API Documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://pptr.dev/guides"}),"Guides")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://github.com/puppeteer/puppeteer/tree/main/examples"}),"Examples")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",a({parentName:"li"},{href:"https://github.com/transitive-bullshit/awesome-puppeteer"}),"Community list of Puppeteer resources"))),(0,r.kt)("h2",a({},{id:"contributing"}),"Contributing"),(0,r.kt)("p",null,"Check out our ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/contributing"}),"contributing guide")," to get an\noverview of Puppeteer development."),(0,r.kt)("h2",a({},{id:"faq"}),"FAQ"),(0,r.kt)("p",null,"Our ",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/faq"}),"FAQ")," has migrated to\n",(0,r.kt)("a",a({parentName:"p"},{href:"https://pptr.dev/faq"}),"our site"),"."))}m.isMDXComponent=!0}}]);