chore: mark version v5.4.0 (#6542)

This commit is contained in:
Johan Bay 2020-10-23 16:28:38 +02:00 committed by GitHub
parent 8e9970df67
commit 729cdfe98a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 79 additions and 29 deletions

View File

@ -6,7 +6,7 @@
<img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right"> <img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right">
###### [API](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING.md) | [Troubleshooting](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md) ###### [API](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING.md) | [Troubleshooting](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md)
> Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium. > Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium.
@ -37,7 +37,7 @@ npm i puppeteer
# or "yarn add puppeteer" # or "yarn add puppeteer"
``` ```
Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, or to download a different browser, see [Environment variables](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#environment-variables). Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, or to download a different browser, see [Environment variables](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#environment-variables).
### puppeteer-core ### puppeteer-core
@ -63,7 +63,7 @@ Note: Prior to v1.18.1, Puppeteer required at least Node v6.4.0. Versions from v
Node 8.9.0+. Starting from v3.0.0 Puppeteer starts to rely on Node 10.18.1+. All examples below use async/await which is only supported in Node v7.6.0 or greater. Node 8.9.0+. Starting from v3.0.0 Puppeteer starts to rely on Node 10.18.1+. All examples below use async/await which is only supported in Node v7.6.0 or greater.
Puppeteer will be familiar to people using other browser testing frameworks. You create an instance Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#). of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#).
**Example** - navigating to https://example.com and saving a screenshot as *example.png*: **Example** - navigating to https://example.com and saving a screenshot as *example.png*:
@ -88,7 +88,7 @@ Execute script on the command line
node example.js node example.js
``` ```
Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#pagesetviewportviewport). Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#pagesetviewportviewport).
**Example** - create a PDF. **Example** - create a PDF.
@ -113,7 +113,7 @@ Execute script on the command line
node hn.js node hn.js
``` ```
See [`Page.pdf()`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#pagepdfoptions) for more information about creating pdfs. See [`Page.pdf()`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#pagepdfoptions) for more information about creating pdfs.
**Example** - evaluate script in the context of the page **Example** - evaluate script in the context of the page
@ -148,7 +148,7 @@ Execute script on the command line
node get-dimensions.js node get-dimensions.js
``` ```
See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`. See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
<!-- [END getstarted] --> <!-- [END getstarted] -->
@ -157,7 +157,7 @@ See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/
**1. Uses Headless mode** **1. Uses Headless mode**
Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#puppeteerlaunchoptions) when launching a browser: Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#puppeteerlaunchoptions) when launching a browser:
```js ```js
const browser = await puppeteer.launch({headless: false}); // default is true const browser = await puppeteer.launch({headless: false}); // default is true
@ -173,7 +173,7 @@ pass in the executable's path when creating a `Browser` instance:
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'}); const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
``` ```
You can also use Puppeteer with Firefox Nightly (experimental support). See [`Puppeteer.launch()`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#puppeteerlaunchoptions) for more information. You can also use Puppeteer with Firefox Nightly (experimental support). See [`Puppeteer.launch()`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#puppeteerlaunchoptions) for more information.
See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users. See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users.
@ -185,7 +185,7 @@ Puppeteer creates its own browser user profile which it **cleans up on every run
## Resources ## Resources
- [API Documentation](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md) - [API Documentation](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md)
- [Examples](https://github.com/puppeteer/puppeteer/tree/main/examples/) - [Examples](https://github.com/puppeteer/puppeteer/tree/main/examples/)
- [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer) - [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer)
@ -328,7 +328,7 @@ See [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING
Official Firefox support is currently experimental. The ongoing collaboration with Mozilla aims to support common end-to-end testing use cases, for which developers expect cross-browser coverage. The Puppeteer team needs input from users to stabilize Firefox support and to bring missing APIs to our attention. Official Firefox support is currently experimental. The ongoing collaboration with Mozilla aims to support common end-to-end testing use cases, for which developers expect cross-browser coverage. The Puppeteer team needs input from users to stabilize Firefox support and to bring missing APIs to our attention.
From Puppeteer v2.1.0 onwards you can specify [`puppeteer.launch({product: 'firefox'})`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#puppeteerlaunchoptions) to run your Puppeteer scripts in Firefox Nightly, without any additional custom patches. While [an older experiment](https://www.npmjs.com/package/puppeteer-firefox) required a patched version of Firefox, [the current approach](https://wiki.mozilla.org/Remote) works with “stock” Firefox. From Puppeteer v2.1.0 onwards you can specify [`puppeteer.launch({product: 'firefox'})`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#puppeteerlaunchoptions) to run your Puppeteer scripts in Firefox Nightly, without any additional custom patches. While [an older experiment](https://www.npmjs.com/package/puppeteer-firefox) required a patched version of Firefox, [the current approach](https://wiki.mozilla.org/Remote) works with “stock” Firefox.
We will continue to collaborate with other browser vendors to bring Puppeteer support to browsers such as Safari. We will continue to collaborate with other browser vendors to bring Puppeteer support to browsers such as Safari.
This effort includes exploration of a standard for executing cross-browser commands (instead of relying on the non-standard DevTools Protocol used by Chrome). This effort includes exploration of a standard for executing cross-browser commands (instead of relying on the non-standard DevTools Protocol used by Chrome).
@ -424,7 +424,7 @@ await page.evaluate(() => {
You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/puppeteer/puppeteer/issues/291).) There are two reasons for this: You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/puppeteer/puppeteer/issues/291).) There are two reasons for this:
* Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/puppeteer/puppeteer/blob/v5.3.1/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.) * Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
* Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming). * Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming).
#### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help? #### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help?

View File

@ -1,11 +1,12 @@
# Puppeteer API <!-- GEN:version -->Tip-Of-Tree<!-- GEN:stop--> # Puppeteer API <!-- GEN:version -->v5.4.0<!-- GEN:stop-->
<!-- GEN:empty-if-release --><!-- GEN:stop --> <!-- GEN:empty-if-release --><!-- GEN:stop -->
- Interactive Documentation: https://pptr.dev - Interactive Documentation: https://pptr.dev
- API Translations: [中文|Chinese](https://zhaoqize.github.io/puppeteer-api-zh_CN/#/) - API Translations: [中文|Chinese](https://zhaoqize.github.io/puppeteer-api-zh_CN/#/)
- Troubleshooting: [troubleshooting.md](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md) - Troubleshooting: [troubleshooting.md](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md)
- Releases per Chromium Version: - Releases per Chromium Version:
* Chromium 87.0.4272.0 - [Puppeteer v5.4.0](https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md)
* Chromium 86.0.4240.0 - [Puppeteer v5.3.0](https://github.com/puppeteer/puppeteer/blob/v5.3.0/docs/api.md) * Chromium 86.0.4240.0 - [Puppeteer v5.3.0](https://github.com/puppeteer/puppeteer/blob/v5.3.0/docs/api.md)
* Chromium 85.0.4182.0 - [Puppeteer v5.2.1](https://github.com/puppeteer/puppeteer/blob/v5.2.1/docs/api.md) * Chromium 85.0.4182.0 - [Puppeteer v5.2.1](https://github.com/puppeteer/puppeteer/blob/v5.2.1/docs/api.md)
* Chromium 84.0.4147.0 - [Puppeteer v5.1.0](https://github.com/puppeteer/puppeteer/blob/v5.1.0/docs/api.md) * Chromium 84.0.4147.0 - [Puppeteer v5.1.0](https://github.com/puppeteer/puppeteer/blob/v5.1.0/docs/api.md)
@ -30,14 +31,18 @@
- [Environment Variables](#environment-variables) - [Environment Variables](#environment-variables)
- [Working with Chrome Extensions](#working-with-chrome-extensions) - [Working with Chrome Extensions](#working-with-chrome-extensions)
- [class: Puppeteer](#class-puppeteer) - [class: Puppeteer](#class-puppeteer)
* [puppeteer.clearCustomQueryHandlers()](#puppeteerclearcustomqueryhandlers)
* [puppeteer.connect(options)](#puppeteerconnectoptions) * [puppeteer.connect(options)](#puppeteerconnectoptions)
* [puppeteer.createBrowserFetcher([options])](#puppeteercreatebrowserfetcheroptions) * [puppeteer.createBrowserFetcher([options])](#puppeteercreatebrowserfetcheroptions)
* [puppeteer.customQueryHandlerNames()](#puppeteercustomqueryhandlernames)
* [puppeteer.defaultArgs([options])](#puppeteerdefaultargsoptions) * [puppeteer.defaultArgs([options])](#puppeteerdefaultargsoptions)
* [puppeteer.devices](#puppeteerdevices) * [puppeteer.devices](#puppeteerdevices)
* [puppeteer.errors](#puppeteererrors) * [puppeteer.errors](#puppeteererrors)
* [puppeteer.executablePath()](#puppeteerexecutablepath) * [puppeteer.executablePath()](#puppeteerexecutablepath)
* [puppeteer.launch([options])](#puppeteerlaunchoptions) * [puppeteer.launch([options])](#puppeteerlaunchoptions)
* [puppeteer.product](#puppeteerproduct) * [puppeteer.product](#puppeteerproduct)
* [puppeteer.registerCustomQueryHandler(name, queryHandler)](#puppeteerregistercustomqueryhandlername-queryhandler)
* [puppeteer.unregisterCustomQueryHandler(name)](#puppeteerunregistercustomqueryhandlername)
- [class: BrowserFetcher](#class-browserfetcher) - [class: BrowserFetcher](#class-browserfetcher)
* [browserFetcher.canDownload(revision)](#browserfetchercandownloadrevision) * [browserFetcher.canDownload(revision)](#browserfetchercandownloadrevision)
* [browserFetcher.download(revision[, progressCallback])](#browserfetcherdownloadrevision-progresscallback) * [browserFetcher.download(revision[, progressCallback])](#browserfetcherdownloadrevision-progresscallback)
@ -354,6 +359,7 @@
* [eventEmitter.once(event, handler)](#eventemitteronceevent-handler) * [eventEmitter.once(event, handler)](#eventemitteronceevent-handler)
* [eventEmitter.removeAllListeners([event])](#eventemitterremovealllistenersevent) * [eventEmitter.removeAllListeners([event])](#eventemitterremovealllistenersevent)
* [eventEmitter.removeListener(event, handler)](#eventemitterremovelistenerevent-handler) * [eventEmitter.removeListener(event, handler)](#eventemitterremovelistenerevent-handler)
- [interface: CustomQueryHandler](#interface-customqueryhandler)
<!-- GEN:stop --> <!-- GEN:stop -->
### Overview ### Overview
@ -466,6 +472,8 @@ const puppeteer = require('puppeteer');
await browser.close(); await browser.close();
})(); })();
``` ```
#### puppeteer.clearCustomQueryHandlers()
Clears all registered handlers.
#### puppeteer.connect(options) #### puppeteer.connect(options)
- `options` <[Object]> - `options` <[Object]>
@ -494,6 +502,9 @@ This methods attaches Puppeteer to an existing browser instance.
- `product` <"chrome"|"firefox"> [string] for the product to run. Possible values are: `chrome`, `firefox`. Defaults to `chrome`. - `product` <"chrome"|"firefox"> [string] for the product to run. Possible values are: `chrome`, `firefox`. Defaults to `chrome`.
- returns: <[BrowserFetcher]> - returns: <[BrowserFetcher]>
#### puppeteer.customQueryHandlerNames()
- returns: <[[Array]<string>> A list with the names of all registered custom query handlers.
#### puppeteer.defaultArgs([options]) #### puppeteer.defaultArgs([options])
- `options` <[Object]> Set of configurable options to set on the browser. Can have the following fields: - `options` <[Object]> Set of configurable options to set on the browser. Can have the following fields:
- `headless` <[boolean]> Whether to run browser in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). Defaults to `true` unless the `devtools` option is `true`. - `headless` <[boolean]> Whether to run browser in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). Defaults to `true` unless the `devtools` option is `true`.
@ -602,6 +613,22 @@ const browser = await puppeteer.launch({
The product is set by the `PUPPETEER_PRODUCT` environment variable or the `product` option in [puppeteer.launch([options])](#puppeteerlaunchoptions) and defaults to `chrome`. Firefox support is experimental and requires to install Puppeteer via `PUPPETEER_PRODUCT=firefox npm i puppeteer`. The product is set by the `PUPPETEER_PRODUCT` environment variable or the `product` option in [puppeteer.launch([options])](#puppeteerlaunchoptions) and defaults to `chrome`. Firefox support is experimental and requires to install Puppeteer via `PUPPETEER_PRODUCT=firefox npm i puppeteer`.
#### puppeteer.registerCustomQueryHandler(name, queryHandler)
- `name` <[string]> The name that the custom query handler will be registered under.
- `queryHandler` <[CustomQueryHandler]> The [custom query handler](#interface-customqueryhandler) to register.
Registers a [custom query handler](#interface-customqueryhandler). After registration,
the handler can be used everywhere where a selector is expected by prepending
the selection string with `<name>/`. The name is only allowed to consist of
lower- and upper case latin letters.
Example:
```
puppeteer.registerCustomQueryHandler('text', { … });
const aHandle = await page.$('text/…');
```
#### puppeteer.unregisterCustomQueryHandler(name)
- `name` <[string]> The name of the query handler to unregistered.
### class: BrowserFetcher ### class: BrowserFetcher
@ -4144,6 +4171,17 @@ This method is identical to `on` and maintained for compatibility with Node's Ev
This method is identical to `off` and maintained for compatibility with Node's EventEmitter. We recommend using `off` by default. This method is identical to `off` and maintained for compatibility with Node's EventEmitter. We recommend using `off` by default.
### interface: CustomQueryHandler
Contains two functions `queryOne` and `queryAll` that can be
[registered](#puppeteerregistercustomqueryhandler) as
alternative querying strategies. The functions `queryOne` and `queryAll` are
executed in the page context. `queryOne` should take an `Element` and a
selector string as argument and return a single `Element` or `null` if no
element is found. `queryAll` takes the same arguments but should instead return
a `NodeListOf<Element>` or `Array<Element>` with all the elements that match
the given query selector.
[AXNode]: #accessibilitysnapshotoptions "AXNode" [AXNode]: #accessibilitysnapshotoptions "AXNode"
[Accessibility]: #class-accessibility "Accessibility" [Accessibility]: #class-accessibility "Accessibility"
[Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array" [Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array"
@ -4193,3 +4231,4 @@ This method is identical to `off` and maintained for compatibility with Node's E
[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "String" [string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "String"
[symbol]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Symbol_type "Symbol" [symbol]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Symbol_type "Symbol"
[xpath]: https://developer.mozilla.org/en-US/docs/Web/XPath "xpath" [xpath]: https://developer.mozilla.org/en-US/docs/Web/XPath "xpath"
[CustomQueryHandler]: #interface-customqueryhandler "CustomQueryHandler"

View File

@ -1,6 +1,6 @@
{ {
"name": "puppeteer", "name": "puppeteer",
"version": "5.3.1-post", "version": "5.4.0",
"description": "A high-level API to control headless Chrome over the DevTools Protocol", "description": "A high-level API to control headless Chrome over the DevTools Protocol",
"main": "./cjs-entry.js", "main": "./cjs-entry.js",
"repository": "github:puppeteer/puppeteer", "repository": "github:puppeteer/puppeteer",

View File

@ -139,7 +139,7 @@ export class Puppeteer {
* @param queryHandler - The {@link CustomQueryHandler | custom query handler} to * @param queryHandler - The {@link CustomQueryHandler | custom query handler} to
* register. * register.
*/ */
__experimental_registerCustomQueryHandler( registerCustomQueryHandler(
name: string, name: string,
queryHandler: CustomQueryHandler queryHandler: CustomQueryHandler
): void { ): void {
@ -149,21 +149,21 @@ export class Puppeteer {
/** /**
* @param name - The name of the query handler to unregistered. * @param name - The name of the query handler to unregistered.
*/ */
__experimental_unregisterCustomQueryHandler(name: string): void { unregisterCustomQueryHandler(name: string): void {
unregisterCustomQueryHandler(name); unregisterCustomQueryHandler(name);
} }
/** /**
* @returns a list with the names of all registered custom query handlers. * @returns a list with the names of all registered custom query handlers.
*/ */
__experimental_customQueryHandlerNames(): string[] { customQueryHandlerNames(): string[] {
return customQueryHandlerNames(); return customQueryHandlerNames();
} }
/** /**
* Clears all registered handlers. * Clears all registered handlers.
*/ */
__experimental_clearQueryHandlers(): void { clearCustomQueryHandlers(): void {
clearCustomQueryHandlers(); clearCustomQueryHandlers();
} }
} }

View File

@ -43,7 +43,7 @@ export interface InternalQueryHandler {
/** /**
* Contains two functions `queryOne` and `queryAll` that can * Contains two functions `queryOne` and `queryAll` that can
* be {@link Puppeteer.__experimental_registerCustomQueryHandler | registered} * be {@link Puppeteer.registerCustomQueryHandler | registered}
* as alternative querying strategies. The functions `queryOne` and `queryAll` * as alternative querying strategies. The functions `queryOne` and `queryAll`
* are executed in the page context. `queryOne` should take an `Element` and a * are executed in the page context. `queryOne` should take an `Element` and a
* selector string as argument and return a single `Element` or `null` if no * selector string as argument and return a single `Element` or `null` if no

View File

@ -286,14 +286,14 @@ describe('ElementHandle specs', function () {
describe('Custom queries', function () { describe('Custom queries', function () {
this.afterEach(() => { this.afterEach(() => {
const { puppeteer } = getTestState(); const { puppeteer } = getTestState();
puppeteer.__experimental_clearQueryHandlers(); puppeteer.clearCustomQueryHandlers();
}); });
it('should register and unregister', async () => { it('should register and unregister', async () => {
const { page, puppeteer } = getTestState(); const { page, puppeteer } = getTestState();
await page.setContent('<div id="not-foo"></div><div id="foo"></div>'); await page.setContent('<div id="not-foo"></div><div id="foo"></div>');
// Register. // Register.
puppeteer.__experimental_registerCustomQueryHandler('getById', { puppeteer.registerCustomQueryHandler('getById', {
queryOne: (element, selector) => queryOne: (element, selector) =>
document.querySelector(`[id="${selector}"]`), document.querySelector(`[id="${selector}"]`),
}); });
@ -304,9 +304,11 @@ describe('ElementHandle specs', function () {
element element
) )
).toBe('foo'); ).toBe('foo');
const handlerNamesAfterRegistering = puppeteer.customQueryHandlerNames();
expect(handlerNamesAfterRegistering.includes('getById')).toBeTruthy();
// Unregister. // Unregister.
puppeteer.__experimental_unregisterCustomQueryHandler('getById'); puppeteer.unregisterCustomQueryHandler('getById');
try { try {
await page.$('getById/foo'); await page.$('getById/foo');
throw new Error('Custom query handler name not set - throw expected'); throw new Error('Custom query handler name not set - throw expected');
@ -317,11 +319,13 @@ describe('ElementHandle specs', function () {
) )
); );
} }
const handlerNamesAfterUnregistering = puppeteer.customQueryHandlerNames();
expect(handlerNamesAfterUnregistering.includes('getById')).toBeFalsy();
}); });
it('should throw with invalid query names', () => { it('should throw with invalid query names', () => {
try { try {
const { puppeteer } = getTestState(); const { puppeteer } = getTestState();
puppeteer.__experimental_registerCustomQueryHandler('1/2/3', { puppeteer.registerCustomQueryHandler('1/2/3', {
queryOne: () => document.querySelector('foo'), queryOne: () => document.querySelector('foo'),
}); });
throw new Error( throw new Error(
@ -338,7 +342,7 @@ describe('ElementHandle specs', function () {
await page.setContent( await page.setContent(
'<div id="not-foo"></div><div class="foo">Foo1</div><div class="foo baz">Foo2</div>' '<div id="not-foo"></div><div class="foo">Foo1</div><div class="foo baz">Foo2</div>'
); );
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryAll: (element, selector) => queryAll: (element, selector) =>
document.querySelectorAll(`.${selector}`), document.querySelectorAll(`.${selector}`),
}); });
@ -360,7 +364,7 @@ describe('ElementHandle specs', function () {
await page.setContent( await page.setContent(
'<div id="not-foo"></div><div class="foo">Foo1</div><div class="foo baz">Foo2</div>' '<div id="not-foo"></div><div class="foo">Foo1</div><div class="foo baz">Foo2</div>'
); );
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryAll: (element, selector) => queryAll: (element, selector) =>
document.querySelectorAll(`.${selector}`), document.querySelectorAll(`.${selector}`),
}); });
@ -373,7 +377,7 @@ describe('ElementHandle specs', function () {
}); });
it('should wait correctly with waitForSelector', async () => { it('should wait correctly with waitForSelector', async () => {
const { page, puppeteer } = getTestState(); const { page, puppeteer } = getTestState();
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryOne: (element, selector) => element.querySelector(`.${selector}`), queryOne: (element, selector) => element.querySelector(`.${selector}`),
}); });
const waitFor = page.waitForSelector('getByClass/foo'); const waitFor = page.waitForSelector('getByClass/foo');
@ -391,7 +395,7 @@ describe('ElementHandle specs', function () {
/* page.waitFor is deprecated so we silence the warning to avoid test noise */ /* page.waitFor is deprecated so we silence the warning to avoid test noise */
sinon.stub(console, 'warn').callsFake(() => {}); sinon.stub(console, 'warn').callsFake(() => {});
const { page, puppeteer } = getTestState(); const { page, puppeteer } = getTestState();
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryOne: (element, selector) => element.querySelector(`.${selector}`), queryOne: (element, selector) => element.querySelector(`.${selector}`),
}); });
const waitFor = page.waitFor('getByClass/foo'); const waitFor = page.waitFor('getByClass/foo');
@ -409,7 +413,7 @@ describe('ElementHandle specs', function () {
await page.setContent( await page.setContent(
'<div id="not-foo"></div><div class="foo"><div id="nested-foo" class="foo"/></div><div class="foo baz">Foo2</div>' '<div id="not-foo"></div><div class="foo"><div id="nested-foo" class="foo"/></div><div class="foo baz">Foo2</div>'
); );
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryOne: (element, selector) => element.querySelector(`.${selector}`), queryOne: (element, selector) => element.querySelector(`.${selector}`),
queryAll: (element, selector) => queryAll: (element, selector) =>
element.querySelectorAll(`.${selector}`), element.querySelectorAll(`.${selector}`),
@ -426,7 +430,7 @@ describe('ElementHandle specs', function () {
await page.setContent( await page.setContent(
'<div id="not-foo"></div><div class="foo">text</div><div class="foo baz">content</div>' '<div id="not-foo"></div><div class="foo">text</div><div class="foo baz">content</div>'
); );
puppeteer.__experimental_registerCustomQueryHandler('getByClass', { puppeteer.registerCustomQueryHandler('getByClass', {
queryOne: (element, selector) => element.querySelector(`.${selector}`), queryOne: (element, selector) => element.querySelector(`.${selector}`),
queryAll: (element, selector) => queryAll: (element, selector) =>
element.querySelectorAll(`.${selector}`), element.querySelectorAll(`.${selector}`),

View File

@ -411,7 +411,14 @@ describe('querySelector', function () {
}; };
before(() => { before(() => {
const { puppeteer } = getTestState(); const { puppeteer } = getTestState();
puppeteer.__experimental_registerCustomQueryHandler('allArray', handler); puppeteer.registerCustomQueryHandler('allArray', handler);
});
it('should have registered handler', async () => {
const { puppeteer } = getTestState();
expect(
puppeteer.customQueryHandlerNames().includes('allArray')
).toBeTruthy();
}); });
it('$$ should query existing elements', async () => { it('$$ should query existing elements', async () => {
const { page } = getTestState(); const { page } = getTestState();