2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Browser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
A Browser is created when Playwright connects to a browser instance, either through [browserType.launch()]() or
|
|
|
|
|
|
[browserType.connect()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of using a [Browser] to create a [Page]:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await firefox.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
See [ChromiumBrowser], [FirefoxBrowser] and [WebKitBrowser] for browser-specific features. Note that
|
2020-12-04 20:09:20 +01:00
|
|
|
|
[browserType.connect()]() and [browserType.launch()]() always return a specific browser instance, based on the browser
|
|
|
|
|
|
being connected to or launched.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Browser.disconnected
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
Emitted when Browser gets disconnected from the browser application. This might happen because of one of the following:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* Browser application is closed or crashed.
|
2020-12-04 18:03:33 +01:00
|
|
|
|
* The [browser.close()]() method was called.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Browser.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
In case this browser is obtained using [browserType.launch()](), closes the browser and all of its pages (if any were
|
|
|
|
|
|
opened).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
In case this browser is obtained using [browserType.connect()](), clears all created contexts belonging to this browser
|
|
|
|
|
|
and disconnects from the browser server.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The [Browser] object itself is considered to be disposed and cannot be used anymore.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Browser.contexts
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[BrowserContext]>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Returns an array of all open browser contexts. In a newly created browser, this will return zero browser contexts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const browser = await pw.webkit.launch();
|
|
|
|
|
|
console.log(browser.contexts().length); // prints `0`
|
|
|
|
|
|
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
console.log(browser.contexts().length); // prints `1`
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Browser.isConnected
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Indicates that the browser is connected.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Browser.newContext
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[BrowserContext]>>
|
|
|
|
|
|
|
|
|
|
|
|
Creates a new browser context. It won't share cookies/cache with other browser contexts.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await playwright.firefox.launch(); // Or 'chromium' or 'webkit'.
|
|
|
|
|
|
// Create a new incognito browser context.
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
// Create a new page in a pristine context.
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Browser.newContext.-inline- = %%-shared-context-params-list-%%
|
|
|
|
|
|
### option: Browser.newContext.proxy = %%-context-option-proxy-%%
|
|
|
|
|
|
### option: Browser.newContext.storageState = %%-context-option-storage-state-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Browser.newPage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Page]>>
|
|
|
|
|
|
|
|
|
|
|
|
Creates a new page in a new browser context. Closing this page will close the context as well.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This is a convenience API that should only be used for the single-page scenarios and short snippets. Production code and
|
2020-12-04 20:09:20 +01:00
|
|
|
|
testing frameworks should explicitly create [browser.newContext()]() followed by the [browserContext.newPage()]() to
|
|
|
|
|
|
control their exact life times.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Browser.newPage.-inline- = %%-shared-context-params-list-%%
|
|
|
|
|
|
### option: Browser.newPage.proxy = %%-context-option-proxy-%%
|
|
|
|
|
|
### option: Browser.newPage.storageState = %%-context-option-storage-state-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Browser.version
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns the browser version.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: BrowserContext
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
|
|
|
|
|
|
|
|
|
|
|
BrowserContexts provide a way to operate multiple independent browser sessions.
|
|
|
|
|
|
|
|
|
|
|
|
If a page opens another page, e.g. with a `window.open` call, the popup will belong to the parent page's browser
|
|
|
|
|
|
context.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Playwright allows creation of "incognito" browser contexts with `browser.newContext()` method. "Incognito" browser
|
|
|
|
|
|
contexts don't write any browsing data to disk.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Create a new incognito browser context
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
// Create a new page inside context.
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
// Dispose context once it's no longer needed.
|
|
|
|
|
|
await context.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: BrowserContext.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Emitted when Browser context gets closed. This might happen because of one of the following:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* Browser context is closed.
|
|
|
|
|
|
* Browser application is closed or crashed.
|
2020-12-04 18:03:33 +01:00
|
|
|
|
* The [browser.close()]() method was called.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: BrowserContext.page
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Page]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The event is emitted when a new Page is created in the BrowserContext. The page may still be loading. The event will
|
2020-12-04 20:09:20 +01:00
|
|
|
|
also fire for popup pages. See also [page.on('popup')]() to receive events about popups relevant to a specific page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The earliest moment that page is available is when it has navigated to the initial url. For example, when opening a
|
|
|
|
|
|
popup with `window.open('http://example.com')`, this event will fire when the network request to "http://example.com" is
|
|
|
|
|
|
done and its response has started loading in the popup.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [page] = await Promise.all([
|
|
|
|
|
|
context.waitForEvent('page'),
|
|
|
|
|
|
page.click('a[target=_blank]'),
|
|
|
|
|
|
]);
|
|
|
|
|
|
console.log(await page.evaluate('location.href'));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** Use [page.waitForLoadState()]() to wait until the page gets to a particular state (you should not need it in
|
|
|
|
|
|
most cases).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.addCookies
|
|
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await browserContext.addCookies([cookieObject1, cookieObject2]);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.addCookies.cookies
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `cookies` <[Array]<[Object]>>
|
|
|
|
|
|
- `name` <[string]> **required**
|
|
|
|
|
|
- `value` <[string]> **required**
|
|
|
|
|
|
- `url` <[string]> either url or domain / path are required
|
|
|
|
|
|
- `domain` <[string]> either url or domain / path are required
|
|
|
|
|
|
- `path` <[string]> either url or domain / path are required
|
|
|
|
|
|
- `expires` <[number]> Unix time in seconds.
|
|
|
|
|
|
- `httpOnly` <[boolean]>
|
|
|
|
|
|
- `secure` <[boolean]>
|
|
|
|
|
|
- `sameSite` <"Strict"|"Lax"|"None">
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.addInitScript
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Adds a script which would be evaluated in one of the following scenarios:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* Whenever a page is created in the browser context or is navigated.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
* Whenever a child frame is attached or navigated in any page in the browser context. In this case, the script is
|
|
|
|
|
|
evaluated in the context of the newly attached frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The script is evaluated after the document was created but before any of its scripts were run. This is useful to amend
|
|
|
|
|
|
the JavaScript environment, e.g. to seed `Math.random`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of overriding `Math.random` before the page loads:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// preload.js
|
|
|
|
|
|
Math.random = () => 42;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// In your playwright script, assuming the preload.js file is in same directory.
|
|
|
|
|
|
await browserContext.addInitScript({
|
|
|
|
|
|
path: 'preload.js'
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** The order of evaluation of multiple scripts installed via [browserContext.addInitScript()]() and
|
|
|
|
|
|
[page.addInitScript()]() is not defined.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.addInitScript.script
|
|
|
|
|
|
- `script` <[function]|[string]|[Object]>
|
|
|
|
|
|
- `path` <[string]> Path to the JavaScript file. If `path` is a relative path, then it is resolved relative to
|
|
|
|
|
|
[current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
- `content` <[string]> Raw script content.
|
|
|
|
|
|
|
|
|
|
|
|
Script to be evaluated in all pages in the browser context.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.addInitScript.arg
|
|
|
|
|
|
- `arg` <[Serializable]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `script` (only supported when passing a function).
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.browser
|
|
|
|
|
|
- returns: <[null]|[Browser]> Returns the browser instance of the context. If it was launched as a persistent context
|
|
|
|
|
|
null gets returned.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.clearCookies
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Clears context cookies.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.clearPermissions
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Clears all permission overrides for the browser context.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.grantPermissions(['clipboard-read']);
|
|
|
|
|
|
// do stuff ..
|
|
|
|
|
|
context.clearPermissions();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Closes the browser context. All the pages that belong to the browser context will be closed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** the default browser context cannot be closed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.cookies
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[Object]>>>
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
- `domain` <[string]>
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
- `expires` <[number]> Unix time in seconds.
|
|
|
|
|
|
- `httpOnly` <[boolean]>
|
|
|
|
|
|
- `secure` <[boolean]>
|
|
|
|
|
|
- `sameSite` <"Strict"|"Lax"|"None">
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If no URLs are specified, this method returns all cookies. If URLs are specified, only cookies that affect those URLs
|
|
|
|
|
|
are returned.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.cookies.urls
|
|
|
|
|
|
- `urls` <[string]|[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Optional list of URLs.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.exposeBinding
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method adds a function called `name` on the `window` object of every frame in every page in the context. When
|
|
|
|
|
|
called, the function executes `playwrightBinding` in Node.js and returns a [Promise] which resolves to the return value
|
|
|
|
|
|
of `playwrightBinding`. If the `playwrightBinding` returns a [Promise], it will be awaited.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The first argument of the `playwrightBinding` function contains information about the caller: `{ browserContext:
|
|
|
|
|
|
BrowserContext, page: Page, frame: Frame }`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
See [page.exposeBinding()]() for page-only version.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of exposing page URL to all frames in all pages in the context:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch({ headless: false });
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.exposeBinding('pageURL', ({ page }) => page.url());
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
async function onClick() {
|
|
|
|
|
|
document.querySelector('div').textContent = await window.pageURL();
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<button onclick="onClick()">Click me</button>
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
await page.click('button');
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of passing an element handle:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
await context.exposeBinding('clicked', async (source, element) => {
|
|
|
|
|
|
console.log(await element.textContent());
|
|
|
|
|
|
}, { handle: true });
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
document.addEventListener('click', event => window.clicked(event.target));
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<div>Click me</div>
|
|
|
|
|
|
<div>Or click me</div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.exposeBinding.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the function on the window object.
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.exposeBinding.playwrightBinding
|
|
|
|
|
|
- `playwrightBinding` <[function]>
|
|
|
|
|
|
|
|
|
|
|
|
Callback function that will be called in the Playwright's context.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserContext.exposeBinding.handle
|
|
|
|
|
|
- `handle` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to pass the argument as a handle, instead of passing by value. When passing a handle, only one argument is
|
|
|
|
|
|
supported. When passing by value, multiple arguments are supported.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.exposeFunction
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method adds a function called `name` on the `window` object of every frame in every page in the context. When
|
|
|
|
|
|
called, the function executes `playwrightFunction` in Node.js and returns a [Promise] which resolves to the return value
|
|
|
|
|
|
of `playwrightFunction`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If the `playwrightFunction` returns a [Promise], it will be awaited.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
See [page.exposeFunction()]() for page-only version.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of adding an `md5` function to all pages in the context:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch({ headless: false });
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.exposeFunction('md5', text => crypto.createHash('md5').update(text).digest('hex'));
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
async function onClick() {
|
|
|
|
|
|
document.querySelector('div').textContent = await window.md5('PLAYWRIGHT');
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<button onclick="onClick()">Click me</button>
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
await page.click('button');
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.exposeFunction.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the function on the window object.
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.exposeFunction.playwrightFunction
|
|
|
|
|
|
- `playwrightFunction` <[function]>
|
|
|
|
|
|
|
|
|
|
|
|
Callback function that will be called in the Playwright's context.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.grantPermissions
|
|
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Grants specified permissions to the browser context. Only grants corresponding permissions to the given origin if
|
|
|
|
|
|
specified.
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.grantPermissions.permissions
|
|
|
|
|
|
- `permissions` <[Array]<[string]>>
|
2020-12-04 03:05:36 +01:00
|
|
|
|
- `'geolocation'`
|
|
|
|
|
|
- `'midi'`
|
|
|
|
|
|
- `'midi-sysex'` (system-exclusive midi)
|
|
|
|
|
|
- `'notifications'`
|
|
|
|
|
|
- `'push'`
|
|
|
|
|
|
- `'camera'`
|
|
|
|
|
|
- `'microphone'`
|
|
|
|
|
|
- `'background-sync'`
|
|
|
|
|
|
- `'ambient-light-sensor'`
|
|
|
|
|
|
- `'accelerometer'`
|
|
|
|
|
|
- `'gyroscope'`
|
|
|
|
|
|
- `'magnetometer'`
|
|
|
|
|
|
- `'accessibility-events'`
|
|
|
|
|
|
- `'clipboard-read'`
|
|
|
|
|
|
- `'clipboard-write'`
|
|
|
|
|
|
- `'payment-handler'`
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
A permission or an array of permissions to grant. Permissions can be one of the following values:
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserContext.grantPermissions.origin
|
|
|
|
|
|
- `origin` <[string]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
The [origin] to grant permissions to, e.g. "https://example.com".
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.newPage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Page]>>
|
|
|
|
|
|
|
|
|
|
|
|
Creates a new page in the browser context.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.pages
|
|
|
|
|
|
- returns: <[Array]<[Page]>> All open pages in the context. Non visible pages, such as `"background_page"`, will not be
|
|
|
|
|
|
listed here. You can find them using [chromiumBrowserContext.backgroundPages()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.route
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Routing provides the capability to modify network requests that are made by any page in the browser context. Once route
|
|
|
|
|
|
is enabled, every request matching the url pattern will stall unless it's continued, fulfilled or aborted.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of a naïve handler that aborts all image requests:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.route('**/*.{png,jpg,jpeg}', route => route.abort());
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
or the same snippet using a regex pattern instead:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.route(/(\.png$)|(\.jpg$)/, route => route.abort());
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Page routes (set up with [page.route()]()) take precedence over browser context routes when request matches both
|
|
|
|
|
|
handlers.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** Enabling routing disables http cache.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.route.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[function]\([URL]\):[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
A glob pattern, regex pattern or predicate receiving [URL] to match while routing.
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.route.handler
|
|
|
|
|
|
- `handler` <[function]\([Route], [Request]\)>
|
|
|
|
|
|
|
|
|
|
|
|
handler function to route the request.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setDefaultNavigationTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This setting will change the default maximum navigation time for the following methods and related shortcuts:
|
2020-12-04 18:03:33 +01:00
|
|
|
|
* [page.goBack()]()
|
|
|
|
|
|
* [page.goForward()]()
|
|
|
|
|
|
* [page.goto()]()
|
|
|
|
|
|
* [page.reload()]()
|
|
|
|
|
|
* [page.setContent()]()
|
|
|
|
|
|
* [page.waitForNavigation()]()
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** [page.setDefaultNavigationTimeout()]() and [page.setDefaultTimeout()]() take priority over
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[browserContext.setDefaultNavigationTimeout()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setDefaultNavigationTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum navigation time in milliseconds
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setDefaultTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This setting will change the default maximum time for all the methods accepting `timeout` option.
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** [page.setDefaultNavigationTimeout()](), [page.setDefaultTimeout()]() and
|
|
|
|
|
|
[browserContext.setDefaultNavigationTimeout()]() take priority over [browserContext.setDefaultTimeout()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setDefaultTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum time in milliseconds
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setExtraHTTPHeaders
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The extra HTTP headers will be sent with every request initiated by any page in the context. These headers are merged
|
2020-12-04 20:09:20 +01:00
|
|
|
|
with page-specific extra HTTP headers set with [page.setExtraHTTPHeaders()](). If page overrides a particular header,
|
|
|
|
|
|
page-specific header value will be used instead of the browser context header value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `browserContext.setExtraHTTPHeaders` does not guarantee the order of headers in the outgoing requests.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setExtraHTTPHeaders.headers
|
|
|
|
|
|
- `headers` <[Object]<[string], [string]>>
|
|
|
|
|
|
|
|
|
|
|
|
An object containing additional HTTP headers to be sent with every request. All header values must be strings.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setGeolocation
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Sets the context's geolocation. Passing `null` or `undefined` emulates position unavailable.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await browserContext.setGeolocation({latitude: 59.95, longitude: 30.31667});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** Consider using [browserContext.grantPermissions()]() to grant permissions for the browser context pages to
|
|
|
|
|
|
read its geolocation.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setGeolocation.geolocation
|
|
|
|
|
|
- `geolocation` <[null]|[Object]>
|
|
|
|
|
|
- `latitude` <[number]> Latitude between -90 and 90. **required**
|
|
|
|
|
|
- `longitude` <[number]> Longitude between -180 and 180. **required**
|
|
|
|
|
|
- `accuracy` <[number]> Non-negative accuracy value. Defaults to `0`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setHTTPCredentials
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Provide credentials for [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication).
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** Browsers may cache credentials after successful authentication. Passing different credentials or passing
|
|
|
|
|
|
`null` to disable authentication will be unreliable. To remove or replace credentials, create a new browser context
|
|
|
|
|
|
instead.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setHTTPCredentials.httpCredentials
|
|
|
|
|
|
- `httpCredentials` <[null]|[Object]>
|
|
|
|
|
|
- `username` <[string]> **required**
|
|
|
|
|
|
- `password` <[string]> **required**
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.setOffline
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.setOffline.offline
|
|
|
|
|
|
- `offline` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to emulate network being offline for the browser context.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.storageState
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Object]>>
|
|
|
|
|
|
- `cookies` <[Array]<[Object]>>
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
- `domain` <[string]>
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
- `expires` <[number]> Unix time in seconds.
|
|
|
|
|
|
- `httpOnly` <[boolean]>
|
|
|
|
|
|
- `secure` <[boolean]>
|
|
|
|
|
|
- `sameSite` <"Strict"|"Lax"|"None">
|
|
|
|
|
|
- `origins` <[Array]<[Object]>>
|
|
|
|
|
|
- `origin` <[string]>
|
|
|
|
|
|
- `localStorage` <[Array]<[Object]>>
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns storage state for this browser context, contains current cookies and local storage snapshot.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserContext.unroute
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Removes a route created with [browserContext.route()](). When `handler` is not specified, removes all routes for the
|
|
|
|
|
|
`url`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.unroute.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[function]\([URL]\):[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
A glob pattern, regex pattern or predicate receiving [URL] used to register a routing with [browserContext.route()]().
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.unroute.handler
|
|
|
|
|
|
- `handler` <[function]\([Route], [Request]\)>
|
|
|
|
|
|
|
|
|
|
|
|
Optional handler function used to register a routing with [browserContext.route()]().
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserContext.waitForEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Object]>> Promise which resolves to the event data value.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Waits for event to fire and passes its value into the predicate function. Resolves when the predicate returns truthy
|
|
|
|
|
|
value. Will throw an error if the context closes before the event is fired.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
await context.grantPermissions(['geolocation']);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserContext.waitForEvent.event
|
|
|
|
|
|
- `event` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Event name, same one would pass into `browserContext.on(event)`.
|
|
|
|
|
|
|
|
|
|
|
|
### param: BrowserContext.waitForEvent.optionsOrPredicate
|
|
|
|
|
|
- `optionsOrPredicate` <[Function]|[Object]>
|
|
|
|
|
|
- `predicate` <[Function]> receives the event data and resolves to truthy value when the waiting should resolve.
|
|
|
|
|
|
- `timeout` <[number]> maximum time to wait for in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable
|
|
|
|
|
|
timeout. The default value can be changed by using the
|
|
|
|
|
|
[browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout).
|
|
|
|
|
|
|
|
|
|
|
|
Either a predicate that receives an event or an options object. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
# class: Page
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Page provides methods to interact with a single tab in a [Browser], or an [extension background
|
|
|
|
|
|
page](https://developer.chrome.com/extensions/background_pages) in Chromium. One [Browser] instance might have multiple
|
|
|
|
|
|
[Page] instances.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This example creates a page, navigates it to a URL, and then saves a screenshot:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch();
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await page.screenshot({path: 'screenshot.png'});
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The Page class emits various events (described below) which can be handled using any of Node's native
|
|
|
|
|
|
[`EventEmitter`](https://nodejs.org/api/events.html#events_class_eventemitter) methods, such as `on`, `once` or
|
|
|
|
|
|
`removeListener`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This example logs a message for a single page `load` event:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
page.once('load', () => console.log('Page loaded!'));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
To unsubscribe from events use the `removeListener` method:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
function logRequest(interceptedRequest) {
|
|
|
|
|
|
console.log('A request was made:', interceptedRequest.url());
|
|
|
|
|
|
}
|
|
|
|
|
|
page.on('request', logRequest);
|
|
|
|
|
|
// Sometime later...
|
|
|
|
|
|
page.removeListener('request', logRequest);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Emitted when the page closes.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.console
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[ConsoleMessage]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when JavaScript within the page calls one of console API methods, e.g. `console.log` or `console.dir`. Also
|
|
|
|
|
|
emitted if the page throws an error or a warning.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The arguments passed into `console.log` appear as arguments on the event handler.
|
|
|
|
|
|
|
|
|
|
|
|
An example of handling `console` event:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
page.on('console', msg => {
|
|
|
|
|
|
for (let i = 0; i < msg.args().length; ++i)
|
|
|
|
|
|
console.log(`${i}: ${msg.args()[i]}`);
|
|
|
|
|
|
});
|
|
|
|
|
|
page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.crash
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when the page crashes. Browser pages might crash if they try to allocate too much memory. When the page crashes,
|
|
|
|
|
|
ongoing and subsequent operations will throw.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The most common way to deal with crashes is to catch an exception:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
try {
|
|
|
|
|
|
// Crash might happen during a click.
|
|
|
|
|
|
await page.click('button');
|
|
|
|
|
|
// Or while waiting for an event.
|
|
|
|
|
|
await page.waitForEvent('popup');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
// When the page crashes, exception message contains 'crash'.
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
However, when manually listening to events, it might be useful to avoid stalling when the page crashes. In this case,
|
|
|
|
|
|
handling `crash` event helps:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
|
|
page.on('requestfinished', async request => {
|
|
|
|
|
|
if (await someProcessing(request))
|
|
|
|
|
|
resolve(request);
|
|
|
|
|
|
});
|
|
|
|
|
|
page.on('crash', error => reject(error));
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.dialog
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Dialog]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when a JavaScript dialog appears, such as `alert`, `prompt`, `confirm` or `beforeunload`. Playwright can respond
|
2020-12-04 18:03:33 +01:00
|
|
|
|
to the dialog via [dialog.accept()]() or [dialog.dismiss()]() methods.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.domcontentloaded
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when the JavaScript [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded)
|
|
|
|
|
|
event is dispatched.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.download
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Download]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when attachment download started. User can access basic file operations on downloaded content via the passed
|
|
|
|
|
|
[Download] instance.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
|
|
|
|
|
|
downloaded content. If `acceptDownloads` is not set or set to `false`, download events are emitted, but the actual
|
|
|
|
|
|
download is not performed and user has no access to the downloaded files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.filechooser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[FileChooser]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when a file chooser is supposed to appear, such as after clicking the `<input type=file>`. Playwright can
|
2020-12-04 20:09:20 +01:00
|
|
|
|
respond to it via setting the input files using [fileChooser.setFiles()]() that can be uploaded after that.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
page.on('filechooser', async (fileChooser) => {
|
|
|
|
|
|
await fileChooser.setFiles('/tmp/myfile.pdf');
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.frameattached
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Frame]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when a frame is attached.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.framedetached
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Frame]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when a frame is detached.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.framenavigated
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Frame]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when a frame is navigated to a new url.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.load
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Emitted when the JavaScript [`load`](https://developer.mozilla.org/en-US/docs/Web/Events/load) event is dispatched.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.pageerror
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Error]> The exception message
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when an uncaught exception happens within the page.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.popup
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Page]> Page corresponding to "popup" window
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Emitted when the page opens a new tab or window. This event is emitted in addition to the [browserContext.on('page')](),
|
|
|
|
|
|
but only for popups relevant to this page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The earliest moment that page is available is when it has navigated to the initial url. For example, when opening a
|
|
|
|
|
|
popup with `window.open('http://example.com')`, this event will fire when the network request to "http://example.com" is
|
|
|
|
|
|
done and its response has started loading in the popup.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [popup] = await Promise.all([
|
|
|
|
|
|
page.waitForEvent('popup'),
|
|
|
|
|
|
page.evaluate(() => window.open('https://example.com')),
|
|
|
|
|
|
]);
|
|
|
|
|
|
console.log(await popup.evaluate('location.href'));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** Use [page.waitForLoadState()]() to wait until the page gets to a particular state (you should not need it in
|
|
|
|
|
|
most cases).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.request
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Request]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when a page issues a request. The [request] object is read-only. In order to intercept and mutate requests, see
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[page.route()]() or [browserContext.route()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.requestfailed
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Request]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when a request fails, for example by timing out.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** HTTP Error responses, such as 404 or 503, are still successful responses from HTTP standpoint, so request
|
2020-12-04 20:09:20 +01:00
|
|
|
|
will complete with [page.on('requestfinished')]() event and not with [page.on('requestfailed')]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.requestfinished
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Request]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when a request finishes successfully after downloading the response body. For a successful response, the
|
|
|
|
|
|
sequence of events is `request`, `response` and `requestfinished`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.response
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Response]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when [response] status and headers are received for a request. For a successful response, the sequence of events
|
|
|
|
|
|
is `request`, `response` and `requestfinished`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.websocket
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[WebSocket]> websocket
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when <[WebSocket]> request is sent.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Page.worker
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Worker]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Emitted when a dedicated [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is spawned by the
|
|
|
|
|
|
page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.$
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector within the page. If no elements match the selector, the
|
|
|
|
|
|
return value resolves to `null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.$()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.$$
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[ElementHandle]>>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector within the page. If no elements match the selector, the
|
|
|
|
|
|
return value resolves to `[]`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.$$()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.$$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector within the page and passes it as a first argument to
|
|
|
|
|
|
`pageFunction`. If no elements match the selector, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `page.$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const searchValue = await page.$eval('#search', el => el.value);
|
|
|
|
|
|
const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
|
|
|
|
|
|
const html = await page.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.$eval()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Element]\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.$$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector within the page and passes an array of matched elements as
|
|
|
|
|
|
a first argument to `pageFunction`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `page.$$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const divsCounts = await page.$$eval('div', (divs, min) => divs.length >= min, 10);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.$$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.$$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Array]<[Element]>\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.$$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## namespace: Page.accessibility
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Accessibility]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.addInitScript
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Adds a script which would be evaluated in one of the following scenarios:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* Whenever the page is navigated.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
* Whenever the child frame is attached or navigated. In this case, the script is evaluated in the context of the newly
|
|
|
|
|
|
attached frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The script is evaluated after the document was created but before any of its scripts were run. This is useful to amend
|
|
|
|
|
|
the JavaScript environment, e.g. to seed `Math.random`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of overriding `Math.random` before the page loads:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// preload.js
|
|
|
|
|
|
Math.random = () => 42;
|
|
|
|
|
|
|
|
|
|
|
|
// In your playwright script, assuming the preload.js file is in same directory
|
|
|
|
|
|
const preloadFile = fs.readFileSync('./preload.js', 'utf8');
|
|
|
|
|
|
await page.addInitScript(preloadFile);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** The order of evaluation of multiple scripts installed via [browserContext.addInitScript()]() and
|
|
|
|
|
|
[page.addInitScript()]() is not defined.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.addInitScript.script
|
|
|
|
|
|
- `script` <[function]|[string]|[Object]>
|
|
|
|
|
|
- `path` <[string]> Path to the JavaScript file. If `path` is a relative path, then it is resolved relative to
|
|
|
|
|
|
[current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
- `content` <[string]> Raw script content.
|
|
|
|
|
|
|
|
|
|
|
|
Script to be evaluated in the page.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.addInitScript.arg
|
|
|
|
|
|
- `arg` <[Serializable]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `script` (only supported when passing a function).
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.addScriptTag
|
|
|
|
|
|
- returns: <[Promise]<[ElementHandle]>> which resolves to the added tag when the script's onload fires or when the
|
|
|
|
|
|
script content was injected into frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Adds a `<script>` tag into the page with the desired url or content.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.addScriptTag()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.addScriptTag.script
|
|
|
|
|
|
- `script` <[Object]>
|
|
|
|
|
|
- `url` <[string]> URL of a script to be added.
|
|
|
|
|
|
- `path` <[string]> Path to the JavaScript file to be injected into frame. If `path` is a relative path, then it is
|
|
|
|
|
|
resolved relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
- `content` <[string]> Raw JavaScript content to be injected into frame.
|
|
|
|
|
|
- `type` <[string]> Script type. Use 'module' in order to load a Javascript ES6 module. See
|
|
|
|
|
|
[script](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script) for more details.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.addStyleTag
|
|
|
|
|
|
- returns: <[Promise]<[ElementHandle]>> which resolves to the added tag when the stylesheet's onload fires or when the
|
|
|
|
|
|
CSS content was injected into frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Adds a `<link rel="stylesheet">` tag into the page with the desired url or a `<style type="text/css">` tag with the
|
|
|
|
|
|
content.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.addStyleTag()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.addStyleTag.style
|
|
|
|
|
|
- `style` <[Object]>
|
|
|
|
|
|
- `url` <[string]> URL of the `<link>` tag.
|
|
|
|
|
|
- `path` <[string]> Path to the CSS file to be injected into frame. If `path` is a relative path, then it is resolved
|
|
|
|
|
|
relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
- `content` <[string]> Raw CSS content to be injected into frame.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.bringToFront
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Brings page to front (activates tab).
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.check
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully checked.
|
|
|
|
|
|
|
|
|
|
|
|
This method checks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
|
|
|
|
|
|
checked, this method returns immediately.
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now checked. If not, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.check()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.check.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.check.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.check.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.check.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.click
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method clicks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.click()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.click.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.click.button = %%-input-button-%%
|
|
|
|
|
|
### option: Page.click.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
### option: Page.click.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: Page.click.position = %%-input-position-%%
|
|
|
|
|
|
### option: Page.click.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Page.click.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.click.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.click.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `runBeforeUnload` is `false` the result will resolve only after the page has been closed. If `runBeforeUnload` is
|
|
|
|
|
|
`true` the method will **not** wait for the page to close. By default, `page.close()` **does not** run beforeunload
|
|
|
|
|
|
handlers.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** if `runBeforeUnload` is passed as true, a `beforeunload` dialog might be summoned
|
2020-12-04 18:03:33 +01:00
|
|
|
|
> and should be handled manually via [page.on('dialog')]() event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.close.runBeforeUnload
|
|
|
|
|
|
- `runBeforeUnload` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Defaults to `false`. Whether to run the [before
|
|
|
|
|
|
unload](https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload) page handlers.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.content
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Gets the full HTML contents of the page, including the doctype.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.context
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[BrowserContext]>
|
|
|
|
|
|
|
|
|
|
|
|
Get the browser context that the page belongs to.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## namespace: Page.coverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[ChromiumCoverage]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Browser-specific Coverage implementation, only available for Chromium atm. See
|
|
|
|
|
|
[ChromiumCoverage](#class-chromiumcoverage) for more details.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.dblclick
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully double clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method double clicks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to double click in the center of the element, or the specified `position`.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the first
|
|
|
|
|
|
click of the `dblclick()` triggers a navigation event, this method will reject.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `page.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.dblclick()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.dblclick.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.dblclick.button = %%-input-button-%%
|
|
|
|
|
|
### option: Page.dblclick.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: Page.dblclick.position = %%-input-position-%%
|
|
|
|
|
|
### option: Page.dblclick.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Page.dblclick.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.dblclick.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.dblclick.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.dispatchEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the elment, `click`
|
|
|
|
|
|
is dispatched. This is equivalend to calling
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.dispatchEvent('button#submit', 'click');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
|
|
|
|
|
and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Since `eventInit` is event-specific, please refer to the events documentation for the lists of initial properties:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* [DragEvent](https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/DragEvent)
|
|
|
|
|
|
* [FocusEvent](https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/FocusEvent)
|
|
|
|
|
|
* [KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent)
|
|
|
|
|
|
* [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent)
|
|
|
|
|
|
* [PointerEvent](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/PointerEvent)
|
|
|
|
|
|
* [TouchEvent](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/TouchEvent)
|
|
|
|
|
|
* [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event/Event)
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
You can also specify `JSHandle` as the property value if you want live objects to be passed into the event:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Note you can only create DataTransfer in Chromium and Firefox
|
|
|
|
|
|
const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
|
|
|
|
|
|
await page.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.dispatchEvent.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.dispatchEvent.type
|
|
|
|
|
|
- `type` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
DOM event type: `"click"`, `"dragstart"`, etc.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.dispatchEvent.eventInit
|
|
|
|
|
|
- `eventInit` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional event-specific initialization properties.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.dispatchEvent.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.emulateMedia
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.evaluate(() => matchMedia('screen').matches);
|
|
|
|
|
|
// → true
|
|
|
|
|
|
await page.evaluate(() => matchMedia('print').matches);
|
|
|
|
|
|
// → false
|
|
|
|
|
|
|
|
|
|
|
|
await page.emulateMedia({ media: 'print' });
|
|
|
|
|
|
await page.evaluate(() => matchMedia('screen').matches);
|
|
|
|
|
|
// → false
|
|
|
|
|
|
await page.evaluate(() => matchMedia('print').matches);
|
|
|
|
|
|
// → true
|
|
|
|
|
|
|
|
|
|
|
|
await page.emulateMedia({});
|
|
|
|
|
|
await page.evaluate(() => matchMedia('screen').matches);
|
|
|
|
|
|
// → true
|
|
|
|
|
|
await page.evaluate(() => matchMedia('print').matches);
|
|
|
|
|
|
// → false
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
2020-12-04 18:03:33 +01:00
|
|
|
|
await page.emulateMedia({ colorScheme: 'dark' });
|
2020-12-02 22:50:10 +01:00
|
|
|
|
await page.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches);
|
|
|
|
|
|
// → true
|
|
|
|
|
|
await page.evaluate(() => matchMedia('(prefers-color-scheme: light)').matches);
|
|
|
|
|
|
// → false
|
|
|
|
|
|
await page.evaluate(() => matchMedia('(prefers-color-scheme: no-preference)').matches);
|
|
|
|
|
|
// → false
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.emulateMedia.params
|
|
|
|
|
|
- `params` <[Object]>
|
|
|
|
|
|
- `media` <[null]|"screen"|"print"> Changes the CSS media type of the page. The only allowed values are `'screen'`,
|
|
|
|
|
|
`'print'` and `null`. Passing `null` disables CSS media emulation. Omitting `media` or passing `undefined` does not
|
|
|
|
|
|
change the emulated value.
|
|
|
|
|
|
- `colorScheme` <[null]|"light"|"dark"|"no-preference"> Emulates `'prefers-colors-scheme'` media feature, supported
|
|
|
|
|
|
values are `'light'`, `'dark'`, `'no-preference'`. Passing `null` disables color scheme emulation. Omitting
|
|
|
|
|
|
`colorScheme` or passing `undefined` does not change the emulated value.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.evaluate
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `page.evaluate` returns a [Promise], then `page.evaluate` would wait for the promise to
|
|
|
|
|
|
resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `page.evaluate` returns a non-[Serializable] value, then `page.evaluate` resolves to
|
|
|
|
|
|
`undefined`. DevTools Protocol also supports transferring some additional values that are not serializable by `JSON`:
|
|
|
|
|
|
`-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Passing argument to `pageFunction`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const result = await page.evaluate(([x, y]) => {
|
|
|
|
|
|
return Promise.resolve(x * y);
|
|
|
|
|
|
}, [7, 8]);
|
|
|
|
|
|
console.log(result); // prints "56"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
A string can also be passed in instead of a function:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
console.log(await page.evaluate('1 + 2')); // prints "3"
|
|
|
|
|
|
const x = 10;
|
|
|
|
|
|
console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
[ElementHandle] instances can be passed as an argument to the `page.evaluate`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const bodyHandle = await page.$('body');
|
|
|
|
|
|
const html = await page.evaluate(([body, suffix]) => body.innerHTML + suffix, [bodyHandle, 'hello']);
|
|
|
|
|
|
await bodyHandle.dispose();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.evaluate()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.evaluate.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in the page context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.evaluate.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.evaluateHandle
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object
|
|
|
|
|
|
(JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The only difference between `page.evaluate` and `page.evaluateHandle` is that `page.evaluateHandle` returns in-page
|
|
|
|
|
|
object (JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `page.evaluateHandle` returns a [Promise], then `page.evaluateHandle` would wait for the
|
|
|
|
|
|
promise to resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
A string can also be passed in instead of a function:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
[JSHandle] instances can be passed as an argument to the `page.evaluateHandle`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const aHandle = await page.evaluateHandle(() => document.body);
|
|
|
|
|
|
const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle);
|
|
|
|
|
|
console.log(await resultHandle.jsonValue());
|
|
|
|
|
|
await resultHandle.dispose();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.evaluateHandle.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in the page context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.evaluateHandle.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.exposeBinding
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method adds a function called `name` on the `window` object of every frame in this page. When called, the function
|
|
|
|
|
|
executes `playwrightBinding` in Node.js and returns a [Promise] which resolves to the return value of
|
|
|
|
|
|
`playwrightBinding`. If the `playwrightBinding` returns a [Promise], it will be awaited.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The first argument of the `playwrightBinding` function contains information about the caller: `{ browserContext:
|
|
|
|
|
|
BrowserContext, page: Page, frame: Frame }`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
See [browserContext.exposeBinding()]() for the context-wide version.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** Functions installed via `page.exposeBinding` survive navigations.
|
|
|
|
|
|
|
|
|
|
|
|
An example of exposing page URL to all frames in a page:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch({ headless: false });
|
|
|
|
|
|
const context = await browser.newContext();
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
await page.exposeBinding('pageURL', ({ page }) => page.url());
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
async function onClick() {
|
|
|
|
|
|
document.querySelector('div').textContent = await window.pageURL();
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<button onclick="onClick()">Click me</button>
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
await page.click('button');
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of passing an element handle:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
await page.exposeBinding('clicked', async (source, element) => {
|
|
|
|
|
|
console.log(await element.textContent());
|
|
|
|
|
|
}, { handle: true });
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
document.addEventListener('click', event => window.clicked(event.target));
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<div>Click me</div>
|
|
|
|
|
|
<div>Or click me</div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.exposeBinding.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the function on the window object.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.exposeBinding.playwrightBinding
|
|
|
|
|
|
- `playwrightBinding` <[function]>
|
|
|
|
|
|
|
|
|
|
|
|
Callback function that will be called in the Playwright's context.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.exposeBinding.handle
|
|
|
|
|
|
- `handle` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to pass the argument as a handle, instead of passing by value. When passing a handle, only one argument is
|
|
|
|
|
|
supported. When passing by value, multiple arguments are supported.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.exposeFunction
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method adds a function called `name` on the `window` object of every frame in the page. When called, the function
|
|
|
|
|
|
executes `playwrightFunction` in Node.js and returns a [Promise] which resolves to the return value of
|
|
|
|
|
|
`playwrightFunction`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If the `playwrightFunction` returns a [Promise], it will be awaited.
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
See [browserContext.exposeFunction()]() for context-wide exposed function.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** Functions installed via `page.exposeFunction` survive navigations.
|
|
|
|
|
|
|
|
|
|
|
|
An example of adding an `md5` function to the page:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch({ headless: false });
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.exposeFunction('md5', text => crypto.createHash('md5').update(text).digest('hex'));
|
|
|
|
|
|
await page.setContent(`
|
|
|
|
|
|
<script>
|
|
|
|
|
|
async function onClick() {
|
|
|
|
|
|
document.querySelector('div').textContent = await window.md5('PLAYWRIGHT');
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<button onclick="onClick()">Click me</button>
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
`);
|
|
|
|
|
|
await page.click('button');
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of adding a `window.readfile` function to the page:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
const fs = require('fs');
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
page.on('console', msg => console.log(msg.text()));
|
|
|
|
|
|
await page.exposeFunction('readfile', async filePath => {
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
fs.readFile(filePath, 'utf8', (err, text) => {
|
|
|
|
|
|
if (err)
|
|
|
|
|
|
reject(err);
|
|
|
|
|
|
else
|
|
|
|
|
|
resolve(text);
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
await page.evaluate(async () => {
|
|
|
|
|
|
// use window.readfile to read contents of a file
|
|
|
|
|
|
const content = await window.readfile('/etc/hosts');
|
|
|
|
|
|
console.log(content);
|
|
|
|
|
|
});
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.exposeFunction.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the function on the window object
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.exposeFunction.playwrightFunction
|
|
|
|
|
|
- `playwrightFunction` <[function]>
|
|
|
|
|
|
|
|
|
|
|
|
Callback function which will be called in Playwright's context.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.fill
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
|
|
|
|
|
|
element, fills it and triggers an `input` event after filling. If the element matching `selector` is not an `<input>`,
|
|
|
|
|
|
`<textarea>` or `[contenteditable]` element, this method throws an error. Note that you can pass an empty string to
|
|
|
|
|
|
clear the input field.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To send fine-grained keyboard events, use [page.type()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.fill()]()
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.fill.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.fill.value
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Value to fill for the `<input>`, `<textarea>` or `[contenteditable]` element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.fill.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.fill.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.focus
|
|
|
|
|
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully focused. The promise
|
|
|
|
|
|
will be rejected if there is no element matching `selector`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method fetches an element with `selector` and focuses it. If there's no element matching `selector`, the method
|
|
|
|
|
|
waits until a matching element appears in the DOM.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.focus()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.focus.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.focus.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.frame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Frame]> frame matching the criteria. Returns `null` if no frame matches.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const frame = page.frame('frame-name');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const frame = page.frame({ url: /.*domain.*/ });
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Returns frame matching the specified criteria. Either `name` or `url` must be specified.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.frame.frameSelector
|
|
|
|
|
|
- `frameSelector` <[string]|[Object]>
|
|
|
|
|
|
- `name` <[string]> frame name specified in the `iframe`'s `name` attribute
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[Function]> A glob pattern, regex pattern or predicate receiving frame's `url` as a [URL]
|
|
|
|
|
|
object.
|
|
|
|
|
|
|
|
|
|
|
|
Frame name or other frame lookup options.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.frames
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[Frame]>> An array of all frames attached to the page.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.getAttribute
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns element attribute value.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.getAttribute.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.getAttribute.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Attribute name to get the value for.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.getAttribute.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.goBack
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect. If can not go back, resolves to `null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Navigate to the previous page in history.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.goBack.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Page.goBack.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.goForward
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect. If can not go forward, resolves to `null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Navigate to the next page in history.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.goForward.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Page.goForward.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.goto
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
`page.goto` will throw an error if:
|
|
|
|
|
|
* there's an SSL error (e.g. in case of self-signed certificates).
|
|
|
|
|
|
* target URL is invalid.
|
|
|
|
|
|
* the `timeout` is exceeded during navigation.
|
|
|
|
|
|
* the remote server does not respond or is unreachable.
|
|
|
|
|
|
* the main resource failed to load.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`page.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
|
|
|
|
|
|
Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[response.status()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** `page.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
|
|
|
|
|
|
`about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
|
|
|
|
|
|
> **NOTE** Headless mode doesn't support navigation to a PDF document. See the [upstream
|
|
|
|
|
|
issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.goto()]()
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.goto.url
|
|
|
|
|
|
- `url` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
URL to navigate page to. The url should include scheme, e.g. `https://`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.goto.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Page.goto.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
### option: Page.goto.referer
|
|
|
|
|
|
- `referer` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Referer header value. If provided it will take preference over the referer header value set by
|
|
|
|
|
|
[page.setExtraHTTPHeaders()]().
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.hover
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully hovered.
|
|
|
|
|
|
|
|
|
|
|
|
This method hovers over an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to hover over the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.hover()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.hover.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.hover.position = %%-input-position-%%
|
|
|
|
|
|
### option: Page.hover.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Page.hover.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.hover.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.innerHTML
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.innerHTML`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.innerHTML.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.innerHTML.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.innerText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.innerText`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.innerText.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.innerText.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.isClosed
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Indicates that the page has been closed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## namespace: Page.keyboard
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Keyboard]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.mainFrame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Frame]> The page's main frame.
|
|
|
|
|
|
|
|
|
|
|
|
Page is guaranteed to have a main frame which persists during navigations.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## namespace: Page.mouse
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Mouse]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.opener
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Page]>> Promise which resolves to the opener for popup pages and `null` for others. If the
|
|
|
|
|
|
opener has been closed already the promise may resolve to `null`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.pdf
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Buffer]>> Promise which resolves with PDF buffer.
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** Generating a pdf is currently only supported in Chromium headless.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`page.pdf()` generates a pdf of the page with `print` css media. To generate a pdf with `screen` media, call
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[page.emulateMedia()]() before calling `page.pdf()`:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** By default, `page.pdf()` generates a pdf with modified colors for printing. Use the
|
|
|
|
|
|
[`-webkit-print-color-adjust`](https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-print-color-adjust) property to
|
|
|
|
|
|
force rendering of exact colors.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Generates a PDF with 'screen' media type.
|
|
|
|
|
|
await page.emulateMedia({media: 'screen'});
|
|
|
|
|
|
await page.pdf({path: 'page.pdf'});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
The `width`, `height`, and `margin` options accept values labeled with units. Unlabeled values are treated as pixels.
|
|
|
|
|
|
|
|
|
|
|
|
A few examples:
|
|
|
|
|
|
* `page.pdf({width: 100})` - prints with width set to 100 pixels
|
|
|
|
|
|
* `page.pdf({width: '100px'})` - prints with width set to 100 pixels
|
|
|
|
|
|
* `page.pdf({width: '10cm'})` - prints with width set to 10 centimeters.
|
|
|
|
|
|
|
|
|
|
|
|
All possible units are:
|
|
|
|
|
|
* `px` - pixel
|
|
|
|
|
|
* `in` - inch
|
|
|
|
|
|
* `cm` - centimeter
|
|
|
|
|
|
* `mm` - millimeter
|
|
|
|
|
|
|
|
|
|
|
|
The `format` options are:
|
|
|
|
|
|
* `Letter`: 8.5in x 11in
|
|
|
|
|
|
* `Legal`: 8.5in x 14in
|
|
|
|
|
|
* `Tabloid`: 11in x 17in
|
|
|
|
|
|
* `Ledger`: 17in x 11in
|
|
|
|
|
|
* `A0`: 33.1in x 46.8in
|
|
|
|
|
|
* `A1`: 23.4in x 33.1in
|
|
|
|
|
|
* `A2`: 16.54in x 23.4in
|
|
|
|
|
|
* `A3`: 11.7in x 16.54in
|
|
|
|
|
|
* `A4`: 8.27in x 11.7in
|
|
|
|
|
|
* `A5`: 5.83in x 8.27in
|
|
|
|
|
|
* `A6`: 4.13in x 5.83in
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** `headerTemplate` and `footerTemplate` markup have the following limitations:
|
|
|
|
|
|
> 1. Script tags inside templates are not evaluated.
|
|
|
|
|
|
> 2. Page styles are not visible inside templates.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.pdf.path
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
The file path to save the PDF to. If `path` is a relative path, then it is resolved relative to [current working
|
|
|
|
|
|
directory](https://nodejs.org/api/process.html#process_process_cwd). If no path is provided, the PDF won't be saved to
|
|
|
|
|
|
the disk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.scale
|
|
|
|
|
|
- `scale` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Scale of the webpage rendering. Defaults to `1`. Scale amount must be between 0.1 and 2.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.displayHeaderFooter
|
|
|
|
|
|
- `displayHeaderFooter` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Display header and footer. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.headerTemplate
|
|
|
|
|
|
- `headerTemplate` <[string]>
|
|
|
|
|
|
- `'date'` formatted print date
|
|
|
|
|
|
- `'title'` document title
|
|
|
|
|
|
- `'url'` document location
|
|
|
|
|
|
- `'pageNumber'` current page number
|
|
|
|
|
|
- `'totalPages'` total pages in the document
|
|
|
|
|
|
|
|
|
|
|
|
HTML template for the print header. Should be valid HTML markup with following classes used to inject printing values
|
|
|
|
|
|
into them:
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.footerTemplate
|
|
|
|
|
|
- `footerTemplate` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
HTML template for the print footer. Should use the same format as the `headerTemplate`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.printBackground
|
|
|
|
|
|
- `printBackground` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Print background graphics. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.landscape
|
|
|
|
|
|
- `landscape` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Paper orientation. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.pageRanges
|
|
|
|
|
|
- `pageRanges` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means print all pages.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.format
|
|
|
|
|
|
- `format` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Paper format. If set, takes priority over `width` or `height` options. Defaults to 'Letter'.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.width
|
|
|
|
|
|
- `width` <[string]|[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Paper width, accepts values labeled with units.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.height
|
|
|
|
|
|
- `height` <[string]|[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Paper height, accepts values labeled with units.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.margin
|
|
|
|
|
|
- `margin` <[Object]>
|
|
|
|
|
|
- `top` <[string]|[number]> Top margin, accepts values labeled with units. Defaults to `0`.
|
|
|
|
|
|
- `right` <[string]|[number]> Right margin, accepts values labeled with units. Defaults to `0`.
|
|
|
|
|
|
- `bottom` <[string]|[number]> Bottom margin, accepts values labeled with units. Defaults to `0`.
|
|
|
|
|
|
- `left` <[string]|[number]> Left margin, accepts values labeled with units. Defaults to `0`.
|
|
|
|
|
|
|
|
|
|
|
|
Paper margins, defaults to none.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.pdf.preferCSSPageSize
|
|
|
|
|
|
- `preferCSSPageSize` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Give any CSS `@page` size declared in the page priority over what is declared in `width` and `height` or `format`
|
|
|
|
|
|
options. Defaults to `false`, which will scale the content to fit the paper size.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.press
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Focuses the element, and then uses [keyboard.down()]() and [keyboard.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
|
|
|
|
|
value or a single character to generate the text for. A superset of the `key` values can be found
|
|
|
|
|
|
[here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
|
|
|
|
|
`Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Following modification shortcuts are also suported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
|
|
|
|
|
|
|
|
|
|
|
Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
|
|
|
|
|
texts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
|
|
|
|
|
|
modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://keycode.info');
|
|
|
|
|
|
await page.press('body', 'A');
|
|
|
|
|
|
await page.screenshot({ path: 'A.png' });
|
|
|
|
|
|
await page.press('body', 'ArrowLeft');
|
|
|
|
|
|
await page.screenshot({ path: 'ArrowLeft.png' });
|
|
|
|
|
|
await page.press('body', 'Shift+O');
|
|
|
|
|
|
await page.screenshot({ path: 'O.png' });
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.press.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.press.key
|
|
|
|
|
|
- `key` <[string]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.press.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.press.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.press.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.reload
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.reload.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Page.reload.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.route
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>.
|
|
|
|
|
|
|
|
|
|
|
|
Routing provides the capability to modify network requests that are made by a page.
|
|
|
|
|
|
|
|
|
|
|
|
Once routing is enabled, every request matching the url pattern will stall unless it's continued, fulfilled or aborted.
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** The handler will only be called for the first url if the response is a redirect.
|
|
|
|
|
|
|
|
|
|
|
|
An example of a naïve handler that aborts all image requests:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.route('**/*.{png,jpg,jpeg}', route => route.abort());
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
or the same snippet using a regex pattern instead:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.route(/(\.png$)|(\.jpg$)/, route => route.abort());
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Page routes take precedence over browser context routes (set up with [browserContext.route()]()) when request matches
|
|
|
|
|
|
both handlers.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** Enabling routing disables http cache.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.route.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[function]\([URL]\):[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
A glob pattern, regex pattern or predicate receiving [URL] to match while routing.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.route.handler
|
|
|
|
|
|
- `handler` <[function]\([Route], [Request]\)>
|
|
|
|
|
|
|
|
|
|
|
|
handler function to route the request.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.screenshot
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Buffer]>> Promise which resolves to buffer with the captured screenshot.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** Screenshots take at least 1/6 second on Chromium OS X and Chromium Windows. See https://crbug.com/741689 for
|
|
|
|
|
|
discussion.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.screenshot.path
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
The file path to save the image to. The screenshot type will be inferred from file extension. If `path` is a relative
|
|
|
|
|
|
path, then it is resolved relative to [current working
|
|
|
|
|
|
directory](https://nodejs.org/api/process.html#process_process_cwd). If no path is provided, the image won't be saved to
|
|
|
|
|
|
the disk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.type
|
|
|
|
|
|
- `type` <"png"|"jpeg">
|
|
|
|
|
|
|
|
|
|
|
|
Specify screenshot type, defaults to `png`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.quality
|
|
|
|
|
|
- `quality` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
The quality of the image, between 0-100. Not applicable to `png` images.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.fullPage
|
|
|
|
|
|
- `fullPage` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Defaults to
|
|
|
|
|
|
`false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.clip
|
|
|
|
|
|
- `clip` <[Object]>
|
|
|
|
|
|
- `x` <[number]> x-coordinate of top-left corner of clip area
|
|
|
|
|
|
- `y` <[number]> y-coordinate of top-left corner of clip area
|
|
|
|
|
|
- `width` <[number]> width of clipping area
|
|
|
|
|
|
- `height` <[number]> height of clipping area
|
|
|
|
|
|
|
|
|
|
|
|
An object which specifies clipping of the resulting image. Should have the following fields:
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.omitBackground
|
|
|
|
|
|
- `omitBackground` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Hides default white background and allows capturing screenshots with transparency. Not applicable to `jpeg` images.
|
|
|
|
|
|
Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.screenshot.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.selectOption
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[string]>>> An array of option values that have been successfully selected.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Triggers a `change` and `input` event once all the provided options have been selected. If there's no `<select>` element
|
|
|
|
|
|
matching `selector`, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// single selection matching the value
|
|
|
|
|
|
page.selectOption('select#colors', 'blue');
|
|
|
|
|
|
|
|
|
|
|
|
// single selection matching both the value and the label
|
|
|
|
|
|
page.selectOption('select#colors', { label: 'Blue' });
|
|
|
|
|
|
|
|
|
|
|
|
// multiple selection
|
|
|
|
|
|
page.selectOption('select#colors', ['red', 'green', 'blue']);
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.selectOption()]()
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.selectOption.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.selectOption.values
|
|
|
|
|
|
- `values` <[null]|[string]|[ElementHandle]|[Array]<[string]>|[Object]|[Array]<[ElementHandle]>|[Array]<[Object]>>
|
|
|
|
|
|
- `value` <[string]> Matches by `option.value`.
|
|
|
|
|
|
- `label` <[string]> Matches by `option.label`.
|
|
|
|
|
|
- `index` <[number]> Matches by the index.
|
|
|
|
|
|
|
|
|
|
|
|
Options to select. If the `<select>` has the `multiple` attribute, all matching options are selected, otherwise only the
|
|
|
|
|
|
first option matching one of the passed options is selected. String values are equivalent to `{value:'string'}`. Option
|
|
|
|
|
|
is considered matching if all specified properties match.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.selectOption.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.selectOption.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setContent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setContent.html
|
|
|
|
|
|
- `html` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
HTML markup to assign to the page.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.setContent.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Page.setContent.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setDefaultNavigationTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This setting will change the default maximum navigation time for the following methods and related shortcuts:
|
2020-12-04 18:03:33 +01:00
|
|
|
|
* [page.goBack()]()
|
|
|
|
|
|
* [page.goForward()]()
|
|
|
|
|
|
* [page.goto()]()
|
|
|
|
|
|
* [page.reload()]()
|
|
|
|
|
|
* [page.setContent()]()
|
|
|
|
|
|
* [page.waitForNavigation()]()
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** [page.setDefaultNavigationTimeout()]() takes priority over [page.setDefaultTimeout()](),
|
|
|
|
|
|
[browserContext.setDefaultTimeout()]() and [browserContext.setDefaultNavigationTimeout()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setDefaultNavigationTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum navigation time in milliseconds
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setDefaultTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This setting will change the default maximum time for all the methods accepting `timeout` option.
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
> **NOTE** [page.setDefaultNavigationTimeout()]() takes priority over [page.setDefaultTimeout()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setDefaultTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum time in milliseconds
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setExtraHTTPHeaders
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
The extra HTTP headers will be sent with every request the page initiates.
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** page.setExtraHTTPHeaders does not guarantee the order of headers in the outgoing requests.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setExtraHTTPHeaders.headers
|
|
|
|
|
|
- `headers` <[Object]<[string], [string]>>
|
|
|
|
|
|
|
|
|
|
|
|
An object containing additional HTTP headers to be sent with every request. All header values must be strings.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setInputFiles
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method expects `selector` to point to an [input
|
|
|
|
|
|
element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
|
|
|
|
|
|
are resolved relative to the [current working directory](https://nodejs.org/api/process.html#process_process_cwd). For
|
|
|
|
|
|
empty array, clears the selected files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setInputFiles.selector = %%-input-selector-%%
|
|
|
|
|
|
### param: Page.setInputFiles.files = %%-input-files-%%
|
|
|
|
|
|
### option: Page.setInputFiles.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.setInputFiles.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.setViewportSize
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
In the case of multiple pages in a single browser, each page can have its own viewport size. However,
|
2020-12-04 20:09:20 +01:00
|
|
|
|
[browser.newContext()]() allows to set viewport size (and more) for all pages in the context at once.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`page.setViewportSize` will resize the page. A lot of websites don't expect phones to change size, so you should set the
|
|
|
|
|
|
viewport size before navigating to the page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.setViewportSize({
|
|
|
|
|
|
width: 640,
|
|
|
|
|
|
height: 480,
|
|
|
|
|
|
});
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.setViewportSize.viewportSize
|
|
|
|
|
|
- `viewportSize` <[Object]>
|
|
|
|
|
|
- `width` <[number]> page width in pixels. **required**
|
|
|
|
|
|
- `height` <[number]> page height in pixels. **required**
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.tap
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully tapped.
|
|
|
|
|
|
|
|
|
|
|
|
This method taps an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
2020-12-04 18:03:33 +01:00
|
|
|
|
1. Use [page.touchscreen](#pagetouchscreen#pagetouchscreen) to tap the center of the element, or the specified `position`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `page.tap()` requires that the `hasTouch` option of the browser context be set to true.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.tap()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.tap.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Page.tap.position = %%-input-position-%%
|
|
|
|
|
|
### option: Page.tap.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Page.tap.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.tap.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.tap.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.textContent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.textContent`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.textContent.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.textContent.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.title
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>> The page's title.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.title()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## namespace: Page.touchscreen
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Touchscreen]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text. `page.type` can be used to send
|
2020-12-04 18:03:33 +01:00
|
|
|
|
fine-grained keyboard events. To fill values in form fields, use [page.fill()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To press a special key, like `Control` or `ArrowDown`, use [keyboard.press()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.type('#mytextarea', 'Hello'); // Types instantly
|
|
|
|
|
|
await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.type()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.type.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.type.text
|
|
|
|
|
|
- `text` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A text to type into a focused element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.type.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between key presses in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.type.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.type.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.uncheck
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully unchecked.
|
|
|
|
|
|
|
|
|
|
|
|
This method unchecks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
|
|
|
|
|
|
unchecked, this method returns immediately.
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now unchecked. If not, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.uncheck()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.uncheck.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.uncheck.force = %%-input-force-%%
|
|
|
|
|
|
### option: Page.uncheck.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Page.uncheck.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.unroute
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Removes a route created with [page.route()](). When `handler` is not specified, removes all routes for the `url`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.unroute.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[function]\([URL]\):[boolean]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
A glob pattern, regex pattern or predicate receiving [URL] to match while routing.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.unroute.handler
|
|
|
|
|
|
- `handler` <[function]\([Route], [Request]\)>
|
|
|
|
|
|
|
|
|
|
|
|
Optional handler function to route the request.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.url
|
|
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Shortcut for main frame's [frame.url()]().
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.video
|
|
|
|
|
|
- returns: <[null]|[Video]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Video object associated with this page.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.viewportSize
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Object]>
|
|
|
|
|
|
- `width` <[number]> page width in pixels.
|
|
|
|
|
|
- `height` <[number]> page height in pixels.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Page.waitForEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Object]>> Promise which resolves to the event data value.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Waits for event to fire and passes its value into the predicate function. Resolves when the predicate returns truthy
|
|
|
|
|
|
value. Will throw an error if the page is closed before the event is fired.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForEvent.event
|
|
|
|
|
|
- `event` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Event name, same one would pass into `page.on(event)`.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.waitForEvent.optionsOrPredicate
|
|
|
|
|
|
- `optionsOrPredicate` <[Function]|[Object]>
|
|
|
|
|
|
- `predicate` <[Function]> receives the event data and resolves to truthy value when the waiting should resolve.
|
|
|
|
|
|
- `timeout` <[number]> maximum time to wait for in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable
|
|
|
|
|
|
timeout. The default value can be changed by using the
|
|
|
|
|
|
[browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout).
|
|
|
|
|
|
|
|
|
|
|
|
Either a predicate that receives an event or an options object. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForFunction
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves when the `pageFunction` returns a truthy value. It resolves to
|
|
|
|
|
|
a JSHandle of the truthy value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The `waitForFunction` can be used to observe viewport size change:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
const watchDog = page.waitForFunction('window.innerWidth < 100');
|
|
|
|
|
|
await page.setViewportSize({width: 50, height: 50});
|
|
|
|
|
|
await watchDog;
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
To pass an argument from Node.js to the predicate of `page.waitForFunction` function:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const selector = '.foo';
|
|
|
|
|
|
await page.waitForFunction(selector => !!document.querySelector(selector), selector);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.waitForFunction()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForFunction.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Page.waitForFunction.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForFunction.polling
|
|
|
|
|
|
- `polling` <[number]|"raf">
|
|
|
|
|
|
|
|
|
|
|
|
If `polling` is `'raf'`, then `pageFunction` is constantly executed in `requestAnimationFrame` callback. If `polling` is
|
|
|
|
|
|
a number, then it is treated as an interval in milliseconds at which the function would be executed. Defaults to `raf`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForFunction.timeout = %%-wait-for-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForLoadState
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise which resolves when the required load state has been reached.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This resolves when the page reaches a required load state, `load` by default. The navigation must have been committed
|
|
|
|
|
|
when this method is called. If current document has already reached the required state, resolves immediately.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.click('button'); // Click triggers navigation.
|
|
|
|
|
|
await page.waitForLoadState(); // The promise resolves after 'load' event.
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [popup] = await Promise.all([
|
|
|
|
|
|
page.waitForEvent('popup'),
|
|
|
|
|
|
page.click('button'), // Click triggers a popup.
|
|
|
|
|
|
])
|
|
|
|
|
|
await popup.waitForLoadState('domcontentloaded'); // The promise resolves after 'domcontentloaded' event.
|
|
|
|
|
|
console.log(await popup.title()); // Popup is ready to use.
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.waitForLoadState()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForLoadState.state
|
|
|
|
|
|
- `state` <"load"|"domcontentloaded"|"networkidle">
|
|
|
|
|
|
- `'load'` - wait for the `load` event to be fired.
|
|
|
|
|
|
- `'domcontentloaded'` - wait for the `DOMContentLoaded` event to be fired.
|
|
|
|
|
|
- `'networkidle'` - wait until there are no network connections for at least `500` ms.
|
|
|
|
|
|
|
|
|
|
|
|
Load state to wait for, defaults to `load`. If the state has been already reached while loading current document, the
|
|
|
|
|
|
method resolves immediately. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForLoadState.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForNavigation
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect. In case of navigation to a different
|
|
|
|
|
|
anchor or navigation due to History API usage, the navigation will resolve with `null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This resolves when the page navigates to a new URL or reloads. It is useful for when you run code which will indirectly
|
|
|
|
|
|
cause the page to navigate. e.g. The click target has an `onclick` handler that triggers navigation from a `setTimeout`.
|
|
|
|
|
|
Consider this example:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [response] = await Promise.all([
|
|
|
|
|
|
page.waitForNavigation(), // The promise resolves after navigation has finished
|
|
|
|
|
|
page.click('a.delayed-navigation'), // Clicking the link will indirectly cause a navigation
|
|
|
|
|
|
]);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
**NOTE** Usage of the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) to change the URL is
|
|
|
|
|
|
considered a navigation.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.waitForNavigation()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Page.waitForNavigation.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForNavigation.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[Function]>
|
|
|
|
|
|
|
|
|
|
|
|
A glob pattern, regex pattern or predicate receiving [URL] to match while waiting for the navigation.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForNavigation.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForRequest
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Request]>> Promise which resolves to the matched request.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const firstRequest = await page.waitForRequest('http://example.com/resource');
|
|
|
|
|
|
const finalRequest = await page.waitForRequest(request => request.url() === 'http://example.com' && request.method() === 'GET');
|
|
|
|
|
|
return firstRequest.url();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.waitForRequest(request => request.url().searchParams.get('foo') === 'bar' && request.url().searchParams.get('foo2') === 'bar2');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForRequest.urlOrPredicate
|
|
|
|
|
|
- `urlOrPredicate` <[string]|[RegExp]|[Function]>
|
|
|
|
|
|
|
|
|
|
|
|
Request URL string, regex or predicate receiving [Request] object.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForRequest.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum wait time in milliseconds, defaults to 30 seconds, pass `0` to disable the timeout. The default value can be
|
|
|
|
|
|
changed by using the [page.setDefaultTimeout()]() method.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForResponse
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Response]>> Promise which resolves to the matched response.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const firstResponse = await page.waitForResponse('https://example.com/resource');
|
|
|
|
|
|
const finalResponse = await page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200);
|
|
|
|
|
|
return finalResponse.ok();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForResponse.urlOrPredicate
|
|
|
|
|
|
- `urlOrPredicate` <[string]|[RegExp]|[function]\([Response]\):[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Request URL string, regex or predicate receiving [Response] object.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForResponse.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum wait time in milliseconds, defaults to 30 seconds, pass `0` to disable the timeout. The default value can be
|
|
|
|
|
|
changed by using the [browserContext.setDefaultTimeout()]() or [page.setDefaultTimeout()]() methods.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForSelector
|
|
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>> Promise which resolves when element specified by selector satisfies
|
|
|
|
|
|
`state` option. Resolves to `null` if waiting for `hidden` or `detached`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Wait for the `selector` to satisfy `state` option (either appear/disappear from dom, or become visible/hidden). If at
|
|
|
|
|
|
the moment of calling the method `selector` already satisfies the condition, the method will return immediately. If the
|
|
|
|
|
|
selector doesn't satisfy the condition for the `timeout` milliseconds, the function will throw.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This method works across navigations:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
let currentURL;
|
|
|
|
|
|
page
|
|
|
|
|
|
.waitForSelector('img')
|
|
|
|
|
|
.then(() => console.log('First URL with image: ' + currentURL));
|
|
|
|
|
|
for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) {
|
|
|
|
|
|
await page.goto(currentURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForSelector.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Page.waitForSelector.state = %%-wait-for-selector-state-%%
|
|
|
|
|
|
### option: Page.waitForSelector.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.waitForTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns a promise that resolves after the timeout.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Note that `page.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going to be
|
|
|
|
|
|
flaky. Use signals such as network events, selectors becoming visible and others instead.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// wait for 1 second
|
|
|
|
|
|
await page.waitForTimeout(1000);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for main frame's [frame.waitForTimeout()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Page.waitForTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
A timeout to wait for
|
|
|
|
|
|
|
|
|
|
|
|
## method: Page.workers
|
|
|
|
|
|
- returns: <[Array]<[Worker]>> This method returns all of the dedicated
|
|
|
|
|
|
[WebWorkers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) associated with the page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** This does not contain ServiceWorkers
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Frame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
At every point of time, page exposes its current frame tree via the [page.mainFrame()]() and [frame.childFrames()]()
|
|
|
|
|
|
methods.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
[Frame] object's lifecycle is controlled by three events, dispatched on the page object:
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- [page.on('frameattached')]() - fired when the frame gets attached to the page. A Frame can be attached to the page
|
|
|
|
|
|
only once.
|
2020-12-04 20:09:20 +01:00
|
|
|
|
- [page.on('framenavigated')]() - fired when the frame commits navigation to a different URL.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- [page.on('framedetached')]() - fired when the frame gets detached from the page. A Frame can be detached from the
|
|
|
|
|
|
page only once.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of dumping frame tree:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await firefox.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://www.google.com/chrome/browser/canary.html');
|
|
|
|
|
|
dumpFrameTree(page.mainFrame(), '');
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
|
|
|
|
|
|
function dumpFrameTree(frame, indent) {
|
|
|
|
|
|
console.log(indent + frame.url());
|
|
|
|
|
|
for (const child of frame.childFrames()) {
|
|
|
|
|
|
dumpFrameTree(child, indent + ' ');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of getting text from an iframe element:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const frame = page.frames().find(frame => frame.name() === 'myframe');
|
|
|
|
|
|
const text = await frame.$eval('.selector', element => element.textContent);
|
|
|
|
|
|
console.log(text);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.$
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>> Promise which resolves to ElementHandle pointing to the frame element.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector within the frame. See [Working with
|
|
|
|
|
|
selectors](#working-with-selectors) for more details. If no elements match the selector, the return value resolves to
|
|
|
|
|
|
`null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.$$
|
|
|
|
|
|
- returns: <[Promise]<[Array]<[ElementHandle]>>> Promise which resolves to ElementHandles pointing to the frame
|
|
|
|
|
|
elements.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector within the frame. See [Working with
|
|
|
|
|
|
selectors](#working-with-selectors) for more details. If no elements match the selector, the return value resolves to
|
|
|
|
|
|
`[]`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.$$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector within the frame and passes it as a first argument to
|
|
|
|
|
|
`pageFunction`. See [Working with selectors](#working-with-selectors) for more details. If no elements match the
|
|
|
|
|
|
selector, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `frame.$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const searchValue = await frame.$eval('#search', el => el.value);
|
|
|
|
|
|
const preloadHref = await frame.$eval('link[rel=preload]', el => el.href);
|
|
|
|
|
|
const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Element]\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.$$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector within the frame and passes an array of matched elements
|
|
|
|
|
|
as a first argument to `pageFunction`. See [Working with selectors](#working-with-selectors) for more details.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `frame.$$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.$$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.$$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Array]<[Element]>\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.$$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.addScriptTag
|
|
|
|
|
|
- returns: <[Promise]<[ElementHandle]>> which resolves to the added tag when the script's onload fires or when the
|
|
|
|
|
|
script content was injected into frame.
|
|
|
|
|
|
|
|
|
|
|
|
Adds a `<script>` tag into the page with the desired url or content.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.addScriptTag.script
|
2020-12-04 07:28:11 +01:00
|
|
|
|
- `script` <[Object]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `url` <[string]> URL of a script to be added.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `path` <[string]> Path to the JavaScript file to be injected into frame. If `path` is a relative path, then it is
|
|
|
|
|
|
resolved relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `content` <[string]> Raw JavaScript content to be injected into frame.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `type` <[string]> Script type. Use 'module' in order to load a Javascript ES6 module. See
|
|
|
|
|
|
[script](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script) for more details.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.addStyleTag
|
|
|
|
|
|
- returns: <[Promise]<[ElementHandle]>> which resolves to the added tag when the stylesheet's onload fires or when the
|
|
|
|
|
|
CSS content was injected into frame.
|
|
|
|
|
|
|
|
|
|
|
|
Adds a `<link rel="stylesheet">` tag into the page with the desired url or a `<style type="text/css">` tag with the
|
|
|
|
|
|
content.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.addStyleTag.style
|
2020-12-04 07:28:11 +01:00
|
|
|
|
- `style` <[Object]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `url` <[string]> URL of the `<link>` tag.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `path` <[string]> Path to the CSS file to be injected into frame. If `path` is a relative path, then it is resolved
|
|
|
|
|
|
relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `content` <[string]> Raw CSS content to be injected into frame.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.check
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully checked.
|
|
|
|
|
|
|
|
|
|
|
|
This method checks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
|
|
|
|
|
|
checked, this method returns immediately.
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now checked. If not, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.check.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.check.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.check.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.check.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.childFrames
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[Frame]>>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.click
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method clicks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.click.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.click.button = %%-input-button-%%
|
|
|
|
|
|
### option: Frame.click.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
### option: Frame.click.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: Frame.click.position = %%-input-position-%%
|
|
|
|
|
|
### option: Frame.click.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Frame.click.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.click.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.click.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.content
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Gets the full HTML contents of the frame, including the doctype.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.dblclick
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully double clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method double clicks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to double click in the center of the element, or the specified `position`.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the first
|
|
|
|
|
|
click of the `dblclick()` triggers a navigation event, this method will reject.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `frame.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.dblclick.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.dblclick.button = %%-input-button-%%
|
|
|
|
|
|
### option: Frame.dblclick.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: Frame.dblclick.position = %%-input-position-%%
|
|
|
|
|
|
### option: Frame.dblclick.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Frame.dblclick.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.dblclick.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.dblclick.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.dispatchEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the elment, `click`
|
|
|
|
|
|
is dispatched. This is equivalend to calling
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await frame.dispatchEvent('button#submit', 'click');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
|
|
|
|
|
and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Since `eventInit` is event-specific, please refer to the events documentation for the lists of initial properties:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* [DragEvent](https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/DragEvent)
|
|
|
|
|
|
* [FocusEvent](https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/FocusEvent)
|
|
|
|
|
|
* [KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent)
|
|
|
|
|
|
* [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent)
|
|
|
|
|
|
* [PointerEvent](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/PointerEvent)
|
|
|
|
|
|
* [TouchEvent](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/TouchEvent)
|
|
|
|
|
|
* [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event/Event)
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
You can also specify `JSHandle` as the property value if you want live objects to be passed into the event:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Note you can only create DataTransfer in Chromium and Firefox
|
|
|
|
|
|
const dataTransfer = await frame.evaluateHandle(() => new DataTransfer());
|
|
|
|
|
|
await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.dispatchEvent.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.dispatchEvent.type
|
|
|
|
|
|
- `type` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
DOM event type: `"click"`, `"dragstart"`, etc.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.dispatchEvent.eventInit
|
|
|
|
|
|
- `eventInit` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional event-specific initialization properties.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.dispatchEvent.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.evaluate
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `frame.evaluate` returns a [Promise], then `frame.evaluate` would wait for the promise to
|
|
|
|
|
|
resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `frame.evaluate` returns a non-[Serializable] value, then `frame.evaluate` resolves to
|
|
|
|
|
|
`undefined`. DevTools Protocol also supports transferring some additional values that are not serializable by `JSON`:
|
|
|
|
|
|
`-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const result = await frame.evaluate(([x, y]) => {
|
|
|
|
|
|
return Promise.resolve(x * y);
|
|
|
|
|
|
}, [7, 8]);
|
|
|
|
|
|
console.log(result); // prints "56"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
A string can also be passed in instead of a function.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
console.log(await frame.evaluate('1 + 2')); // prints "3"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
[ElementHandle] instances can be passed as an argument to the `frame.evaluate`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const bodyHandle = await frame.$('body');
|
|
|
|
|
|
const html = await frame.evaluate(([body, suffix]) => body.innerHTML + suffix, [bodyHandle, 'hello']);
|
|
|
|
|
|
await bodyHandle.dispose();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.evaluate.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.evaluate.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.evaluateHandle
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object
|
|
|
|
|
|
(JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The only difference between `frame.evaluate` and `frame.evaluateHandle` is that `frame.evaluateHandle` returns in-page
|
|
|
|
|
|
object (JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function, passed to the `frame.evaluateHandle`, returns a [Promise], then `frame.evaluateHandle` would wait for
|
|
|
|
|
|
the promise to resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window));
|
|
|
|
|
|
aWindowHandle; // Handle for the window object.
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
A string can also be passed in instead of a function.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
[JSHandle] instances can be passed as an argument to the `frame.evaluateHandle`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const aHandle = await frame.evaluateHandle(() => document.body);
|
|
|
|
|
|
const resultHandle = await frame.evaluateHandle(([body, suffix]) => body.innerHTML + suffix, [aHandle, 'hello']);
|
|
|
|
|
|
console.log(await resultHandle.jsonValue());
|
|
|
|
|
|
await resultHandle.dispose();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.evaluateHandle.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in the page context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.evaluateHandle.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.fill
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
|
|
|
|
|
|
element, fills it and triggers an `input` event after filling. If the element matching `selector` is not an `<input>`,
|
|
|
|
|
|
`<textarea>` or `[contenteditable]` element, this method throws an error. Note that you can pass an empty string to
|
|
|
|
|
|
clear the input field.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To send fine-grained keyboard events, use [frame.type()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.fill.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.fill.value
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Value to fill for the `<input>`, `<textarea>` or `[contenteditable]` element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.fill.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.fill.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.focus
|
|
|
|
|
|
- returns: <[Promise]> Promise which resolves when the element matching `selector` is successfully focused. The promise
|
|
|
|
|
|
will be rejected if there is no element matching `selector`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method fetches an element with `selector` and focuses it. If there's no element matching `selector`, the method
|
|
|
|
|
|
waits until a matching element appears in the DOM.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.focus.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.focus.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.frameElement
|
|
|
|
|
|
- returns: <[Promise]<[ElementHandle]>> Promise that resolves with a `frame` or `iframe` element handle which
|
|
|
|
|
|
corresponds to this frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
This is an inverse of [elementHandle.contentFrame()](). Note that returned handle actually belongs to the parent frame.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This method throws an error if the frame has been detached before `frameElement()` returns.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const frameElement = await frame.frameElement();
|
|
|
|
|
|
const contentFrame = await frameElement.contentFrame();
|
|
|
|
|
|
console.log(frame === contentFrame); // -> true
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.getAttribute
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns element attribute value.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.getAttribute.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.getAttribute.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Attribute name to get the value for.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.getAttribute.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.goto
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
`frame.goto` will throw an error if:
|
|
|
|
|
|
* there's an SSL error (e.g. in case of self-signed certificates).
|
|
|
|
|
|
* target URL is invalid.
|
|
|
|
|
|
* the `timeout` is exceeded during navigation.
|
|
|
|
|
|
* the remote server does not respond or is unreachable.
|
|
|
|
|
|
* the main resource failed to load.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`frame.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404
|
|
|
|
|
|
"Not Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[response.status()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** `frame.goto` either throws an error or returns a main resource response. The only exceptions are navigation
|
|
|
|
|
|
to `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
|
|
|
|
|
|
> **NOTE** Headless mode doesn't support navigation to a PDF document. See the [upstream
|
|
|
|
|
|
issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.goto.url
|
|
|
|
|
|
- `url` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
URL to navigate frame to. The url should include scheme, e.g. `https://`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.goto.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Frame.goto.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.goto.referer
|
|
|
|
|
|
- `referer` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Referer header value. If provided it will take preference over the referer header value set by
|
|
|
|
|
|
[page.setExtraHTTPHeaders()]().
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.hover
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully hovered.
|
|
|
|
|
|
|
|
|
|
|
|
This method hovers over an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to hover over the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.hover.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.hover.position = %%-input-position-%%
|
|
|
|
|
|
### option: Frame.hover.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Frame.hover.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.hover.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.innerHTML
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.innerHTML`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.innerHTML.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.innerHTML.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.innerText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.innerText`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.innerText.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.innerText.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.isDetached
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns `true` if the frame has been detached, or `false` otherwise.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.name
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns frame's name attribute as specified in the tag.
|
|
|
|
|
|
|
|
|
|
|
|
If the name is empty, returns the id attribute instead.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** This value is calculated once when the frame is created, and will not update if the attribute is changed
|
|
|
|
|
|
later.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.page
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Page]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns the page containing this frame.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.parentFrame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Frame]> Parent frame, if any. Detached frames and main frames return `null`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.press
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
|
|
|
|
|
value or a single character to generate the text for. A superset of the `key` values can be found
|
|
|
|
|
|
[here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
|
|
|
|
|
`Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Following modification shortcuts are also suported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
|
|
|
|
|
|
|
|
|
|
|
Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
|
|
|
|
|
texts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
|
|
|
|
|
|
modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.press.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.press.key
|
|
|
|
|
|
- `key` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.press.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.press.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.press.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.selectOption
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[string]>>> An array of option values that have been successfully selected.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Triggers a `change` and `input` event once all the provided options have been selected. If there's no `<select>` element
|
|
|
|
|
|
matching `selector`, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// single selection matching the value
|
|
|
|
|
|
frame.selectOption('select#colors', 'blue');
|
|
|
|
|
|
|
|
|
|
|
|
// single selection matching both the value and the label
|
|
|
|
|
|
frame.selectOption('select#colors', { label: 'Blue' });
|
|
|
|
|
|
|
|
|
|
|
|
// multiple selection
|
|
|
|
|
|
frame.selectOption('select#colors', 'red', 'green', 'blue');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.selectOption.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.selectOption.values
|
|
|
|
|
|
- `values` <[null]|[string]|[ElementHandle]|[Array]<[string]>|[Object]|[Array]<[ElementHandle]>|[Array]<[Object]>>
|
|
|
|
|
|
- `value` <[string]> Matches by `option.value`.
|
|
|
|
|
|
- `label` <[string]> Matches by `option.label`.
|
|
|
|
|
|
- `index` <[number]> Matches by the index.
|
|
|
|
|
|
|
|
|
|
|
|
Options to select. If the `<select>` has the `multiple` attribute, all matching options are selected, otherwise only the
|
|
|
|
|
|
first option matching one of the passed options is selected. String values are equivalent to `{value:'string'}`. Option
|
|
|
|
|
|
is considered matching if all specified properties match.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.selectOption.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.selectOption.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.setContent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.setContent.html
|
|
|
|
|
|
- `html` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
HTML markup to assign to the page.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.setContent.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
### option: Frame.setContent.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.setInputFiles
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method expects `selector` to point to an [input
|
|
|
|
|
|
element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
|
|
|
|
|
|
are resolved relative to the [current working directory](https://nodejs.org/api/process.html#process_process_cwd). For
|
|
|
|
|
|
empty array, clears the selected files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.setInputFiles.selector = %%-input-selector-%%
|
|
|
|
|
|
### param: Frame.setInputFiles.files = %%-input-files-%%
|
|
|
|
|
|
### option: Frame.setInputFiles.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.setInputFiles.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.tap
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully tapped.
|
|
|
|
|
|
|
|
|
|
|
|
This method taps an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Use [page.touchscreen](#pagetouchscreen#pagetouchscreen) to tap the center of the element, or the specified
|
|
|
|
|
|
`position`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `frame.tap()` requires that the `hasTouch` option of the browser context be set to true.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.tap.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.tap.position = %%-input-position-%%
|
|
|
|
|
|
### option: Frame.tap.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: Frame.tap.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.tap.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.tap.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.textContent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Resolves to the `element.textContent`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.textContent.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.textContent.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.title
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>> The page's title.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text. `frame.type` can be used to
|
2020-12-04 18:03:33 +01:00
|
|
|
|
send fine-grained keyboard events. To fill values in form fields, use [frame.fill()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To press a special key, like `Control` or `ArrowDown`, use [keyboard.press()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await frame.type('#mytextarea', 'Hello'); // Types instantly
|
|
|
|
|
|
await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.type.selector = %%-input-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.type.text
|
|
|
|
|
|
- `text` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A text to type into a focused element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.type.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between key presses in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.type.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.type.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.uncheck
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element matching `selector` is successfully unchecked.
|
|
|
|
|
|
|
|
|
|
|
|
This method checks an element matching `selector` by performing the following steps:
|
|
|
|
|
|
1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
|
|
|
|
|
|
unchecked, this method returns immediately.
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
|
|
|
|
|
element is detached during the checks, the whole action is retried.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now unchecked. If not, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.uncheck.selector = %%-input-selector-%%
|
|
|
|
|
|
### option: Frame.uncheck.force = %%-input-force-%%
|
|
|
|
|
|
### option: Frame.uncheck.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: Frame.uncheck.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns frame's url.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Frame.waitForFunction
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves when the `pageFunction` returns a truthy value. It resolves to
|
|
|
|
|
|
a JSHandle of the truthy value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The `waitForFunction` can be used to observe viewport size change:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await firefox.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100');
|
|
|
|
|
|
page.setViewportSize({width: 50, height: 50});
|
|
|
|
|
|
await watchDog;
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
To pass an argument from Node.js to the predicate of `frame.waitForFunction` function:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const selector = '.foo';
|
|
|
|
|
|
await frame.waitForFunction(selector => !!document.querySelector(selector), selector);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.waitForFunction.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Frame.waitForFunction.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.waitForFunction.polling
|
|
|
|
|
|
- `polling` <[number]|"raf">
|
|
|
|
|
|
|
|
|
|
|
|
If `polling` is `'raf'`, then `pageFunction` is constantly executed in `requestAnimationFrame` callback. If `polling` is
|
|
|
|
|
|
a number, then it is treated as an interval in milliseconds at which the function would be executed. Defaults to `raf`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.waitForFunction.timeout = %%-wait-for-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.waitForLoadState
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise which resolves when the required load state has been reached.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This resolves when the frame reaches a required load state, `load` by default. The navigation must have been committed
|
|
|
|
|
|
when this method is called. If current document has already reached the required state, resolves immediately.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await frame.click('button'); // Click triggers navigation.
|
|
|
|
|
|
await frame.waitForLoadState(); // The promise resolves after 'load' event.
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.waitForLoadState.state
|
|
|
|
|
|
- `state` <"load"|"domcontentloaded"|"networkidle">
|
|
|
|
|
|
- `'load'` - wait for the `load` event to be fired.
|
|
|
|
|
|
- `'domcontentloaded'` - wait for the `DOMContentLoaded` event to be fired.
|
|
|
|
|
|
- `'networkidle'` - wait until there are no network connections for at least `500` ms.
|
|
|
|
|
|
|
|
|
|
|
|
Load state to wait for, defaults to `load`. If the state has been already reached while loading current document, the
|
|
|
|
|
|
method resolves immediately. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.waitForLoadState.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.waitForNavigation
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> Promise which resolves to the main resource response. In case of multiple
|
|
|
|
|
|
redirects, the navigation will resolve with the response of the last redirect. In case of navigation to a different
|
|
|
|
|
|
anchor or navigation due to History API usage, the navigation will resolve with `null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This resolves when the frame navigates to a new URL. It is useful for when you run code which will indirectly cause the
|
|
|
|
|
|
frame to navigate. Consider this example:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [response] = await Promise.all([
|
|
|
|
|
|
frame.waitForNavigation(), // The navigation promise resolves after navigation has finished
|
|
|
|
|
|
frame.click('a.my-link'), // Clicking the link will indirectly cause a navigation
|
|
|
|
|
|
]);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
**NOTE** Usage of the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) to change the URL is
|
|
|
|
|
|
considered a navigation.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Frame.waitForNavigation.timeout = %%-navigation-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.waitForNavigation.url
|
|
|
|
|
|
- `url` <[string]|[RegExp]|[Function]>
|
|
|
|
|
|
|
|
|
|
|
|
URL string, URL regex pattern or predicate receiving [URL] to match while waiting for the navigation.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Frame.waitForNavigation.waitUntil = %%-navigation-wait-until-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.waitForSelector
|
|
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>> Promise which resolves when element specified by selector satisfies
|
|
|
|
|
|
`state` option. Resolves to `null` if waiting for `hidden` or `detached`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Wait for the `selector` to satisfy `state` option (either appear/disappear from dom, or become visible/hidden). If at
|
|
|
|
|
|
the moment of calling the method `selector` already satisfies the condition, the method will return immediately. If the
|
|
|
|
|
|
selector doesn't satisfy the condition for the `timeout` milliseconds, the function will throw.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This method works across navigations:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await webkit.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
let currentURL;
|
|
|
|
|
|
page.mainFrame()
|
|
|
|
|
|
.waitForSelector('img')
|
|
|
|
|
|
.then(() => console.log('First URL with image: ' + currentURL));
|
|
|
|
|
|
for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) {
|
|
|
|
|
|
await page.goto(currentURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.waitForSelector.selector = %%-query-selector-%%
|
|
|
|
|
|
### option: Frame.waitForSelector.state = %%-wait-for-selector-state-%%
|
|
|
|
|
|
### option: Frame.waitForSelector.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Frame.waitForTimeout
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns a promise that resolves after the timeout.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Note that `frame.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going to
|
|
|
|
|
|
be flaky. Use signals such as network events, selectors becoming visible and others instead.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Frame.waitForTimeout.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
A timeout to wait for
|
|
|
|
|
|
|
|
|
|
|
|
# class: ElementHandle
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [JSHandle]
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
ElementHandle represents an in-page DOM element. ElementHandles can be created with the [page.$()]() method.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
const hrefElement = await page.$('a');
|
|
|
|
|
|
await hrefElement.click();
|
|
|
|
|
|
// ...
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
ElementHandle prevents DOM element from garbage collection unless the handle is disposed with [jsHandle.dispose()]().
|
2020-12-04 03:05:36 +01:00
|
|
|
|
ElementHandles are auto-disposed when their origin frame gets navigated.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
ElementHandle instances can be used as an argument in [page.$eval()]() and [page.evaluate()]() methods.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
<!-- GEN:toc-extends-JSHandle -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.$
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector in the `ElementHandle`'s subtree. See [Working with
|
|
|
|
|
|
selectors](#working-with-selectors) for more details. If no elements match the selector, the return value resolves to
|
|
|
|
|
|
`null`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.$$
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[ElementHandle]>>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector in the `ElementHandle`s subtree. See [Working with
|
|
|
|
|
|
selectors](#working-with-selectors) for more details. If no elements match the selector, the return value resolves to
|
|
|
|
|
|
`[]`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.$$.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds an element matching the specified selector in the `ElementHandle`s subtree and passes it as a first
|
|
|
|
|
|
argument to `pageFunction`. See [Working with selectors](#working-with-selectors) for more details. If no elements match
|
|
|
|
|
|
the selector, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `frame.$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const tweetHandle = await page.$('.tweet');
|
|
|
|
|
|
expect(await tweetHandle.$eval('.like', node => node.innerText)).toBe('100');
|
|
|
|
|
|
expect(await tweetHandle.$eval('.retweets', node => node.innerText)).toBe('10');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: ElementHandle.$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Element]\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: ElementHandle.$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.$$eval
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method finds all elements matching the specified selector in the `ElementHandle`'s subtree and passes an array of
|
|
|
|
|
|
matched elements as a first argument to `pageFunction`. See [Working with selectors](#working-with-selectors) for more
|
|
|
|
|
|
details.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If `pageFunction` returns a [Promise], then `frame.$$eval` would wait for the promise to resolve and return its value.
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```html
|
|
|
|
|
|
<div class="feed">
|
|
|
|
|
|
<div class="tweet">Hello!</div>
|
|
|
|
|
|
<div class="tweet">Hi!</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
```
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const feedHandle = await page.$('.feed');
|
|
|
|
|
|
expect(await feedHandle.$$eval('.tweet', nodes => nodes.map(n => n.innerText))).toEqual(['Hello!', 'Hi!']);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.$$eval.selector = %%-query-selector-%%
|
|
|
|
|
|
|
|
|
|
|
|
### param: ElementHandle.$$eval.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]\([Array]<[Element]>\)>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: ElementHandle.$$eval.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.boundingBox
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Object]>>
|
|
|
|
|
|
- `x` <[number]> the x coordinate of the element in pixels.
|
|
|
|
|
|
- `y` <[number]> the y coordinate of the element in pixels.
|
|
|
|
|
|
- width <[number]> the width of the element in pixels.
|
|
|
|
|
|
- height <[number]> the height of the element in pixels.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method returns the bounding box of the element, or `null` if the element is not visible. The bounding box is
|
|
|
|
|
|
calculated relative to the main frame viewport - which is usually the same as the browser window.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Scrolling affects the returned bonding box, similarly to
|
|
|
|
|
|
[Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). That
|
|
|
|
|
|
means `x` and/or `y` may be negative.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Elements from child frames return the bounding box relative to the main frame, unlike the
|
|
|
|
|
|
[Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Assuming the page is static, it is safe to use bounding box coordinates to perform input. For example, the following
|
|
|
|
|
|
snippet should click the center of the element.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const box = await elementHandle.boundingBox();
|
|
|
|
|
|
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.check
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully checked.
|
|
|
|
|
|
|
|
|
|
|
|
This method checks the element by performing the following steps:
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that element is a checkbox or a radio input. If not, this method rejects. If the element is already checked,
|
|
|
|
|
|
this method returns immediately.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now checked. If not, this method rejects.
|
|
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.check.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.check.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.check.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.click
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method clicks the element by performing the following steps:
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.click.button = %%-input-button-%%
|
|
|
|
|
|
### option: ElementHandle.click.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
### option: ElementHandle.click.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: ElementHandle.click.position = %%-input-position-%%
|
|
|
|
|
|
### option: ElementHandle.click.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: ElementHandle.click.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.click.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.click.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.contentFrame
|
|
|
|
|
|
- returns: <[Promise]<[null]|[Frame]>> Resolves to the content frame for element handles referencing iframe nodes, or
|
|
|
|
|
|
`null` otherwise
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.dblclick
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully double clicked.
|
|
|
|
|
|
|
|
|
|
|
|
This method double clicks the element by performing the following steps:
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to double click in the center of the element, or the specified `position`.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the first
|
|
|
|
|
|
click of the `dblclick()` triggers a navigation event, this method will reject.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `elementHandle.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.dblclick.button = %%-input-button-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.position = %%-input-position-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.dblclick.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.dispatchEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the elment, `click`
|
|
|
|
|
|
is dispatched. This is equivalend to calling
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await elementHandle.dispatchEvent('click');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
|
|
|
|
|
and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Since `eventInit` is event-specific, please refer to the events documentation for the lists of initial properties:
|
2020-12-04 07:28:11 +01:00
|
|
|
|
* [DragEvent](https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/DragEvent)
|
|
|
|
|
|
* [FocusEvent](https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/FocusEvent)
|
|
|
|
|
|
* [KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent)
|
|
|
|
|
|
* [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent)
|
|
|
|
|
|
* [PointerEvent](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/PointerEvent)
|
|
|
|
|
|
* [TouchEvent](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/TouchEvent)
|
|
|
|
|
|
* [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event/Event)
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
You can also specify `JSHandle` as the property value if you want live objects to be passed into the event:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Note you can only create DataTransfer in Chromium and Firefox
|
|
|
|
|
|
const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
|
|
|
|
|
|
await elementHandle.dispatchEvent('dragstart', { dataTransfer });
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.dispatchEvent.type
|
|
|
|
|
|
- `type` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
DOM event type: `"click"`, `"dragstart"`, etc.
|
|
|
|
|
|
|
|
|
|
|
|
### param: ElementHandle.dispatchEvent.eventInit
|
|
|
|
|
|
- `eventInit` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional event-specific initialization properties.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.fill
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for [actionability](./actionability.md) checks, focuses the element, fills it and triggers an `input`
|
|
|
|
|
|
event after filling. If the element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws
|
|
|
|
|
|
an error. Note that you can pass an empty string to clear the input field.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.fill.value
|
|
|
|
|
|
- `value` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Value to set for the `<input>`, `<textarea>` or `[contenteditable]` element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.fill.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.fill.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.focus
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Calls [focus](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) on the element.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.getAttribute
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns element attribute value.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.getAttribute.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Attribute name to get the value for.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.hover
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully hovered.
|
|
|
|
|
|
|
|
|
|
|
|
This method hovers over the element by performing the following steps:
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to hover over the center of the element, or the specified `position`.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.hover.position = %%-input-position-%%
|
|
|
|
|
|
### option: ElementHandle.hover.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: ElementHandle.hover.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.hover.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.innerHTML
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>> Resolves to the `element.innerHTML`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.innerText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>> Resolves to the `element.innerText`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.ownerFrame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Frame]>> Returns the frame containing the given element.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.press
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Focuses the element, and then uses [keyboard.down()]() and [keyboard.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
|
|
|
|
|
value or a single character to generate the text for. A superset of the `key` values can be found
|
|
|
|
|
|
[here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
|
|
|
|
|
`Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Following modification shortcuts are also suported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
|
|
|
|
|
|
|
|
|
|
|
Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
|
|
|
|
|
texts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
|
|
|
|
|
|
modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.press.key
|
|
|
|
|
|
- `key` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.press.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.press.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.press.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.screenshot
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Buffer]>> Promise which resolves to buffer with the captured screenshot.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for the [actionability](./actionability.md) checks, then scrolls element into view before taking a
|
|
|
|
|
|
screenshot. If the element is detached from DOM, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.screenshot.path
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
The file path to save the image to. The screenshot type will be inferred from file extension. If `path` is a relative
|
|
|
|
|
|
path, then it is resolved relative to [current working
|
|
|
|
|
|
directory](https://nodejs.org/api/process.html#process_process_cwd). If no path is provided, the image won't be saved to
|
|
|
|
|
|
the disk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.screenshot.type
|
|
|
|
|
|
- `type` <"png"|"jpeg">
|
|
|
|
|
|
|
|
|
|
|
|
Specify screenshot type, defaults to `png`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.screenshot.quality
|
|
|
|
|
|
- `quality` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
The quality of the image, between 0-100. Not applicable to `png` images.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.screenshot.omitBackground
|
|
|
|
|
|
- `omitBackground` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Hides default white background and allows capturing screenshots with transparency. Not applicable to `jpeg` images.
|
|
|
|
|
|
Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.screenshot.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.scrollIntoViewIfNeeded
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for [actionability](./actionability.md) checks, then tries to scroll element into view, unless it is
|
|
|
|
|
|
completely visible as defined by
|
|
|
|
|
|
[IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)'s ```ratio```.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Throws when ```elementHandle``` does not point to an element
|
|
|
|
|
|
[connected](https://developer.mozilla.org/en-US/docs/Web/API/Node/isConnected) to a Document or a ShadowRoot.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.scrollIntoViewIfNeeded.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.selectOption
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[string]>>> An array of option values that have been successfully selected.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Triggers a `change` and `input` event once all the provided options have been selected. If element is not a `<select>`
|
|
|
|
|
|
element, the method throws an error.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// single selection matching the value
|
|
|
|
|
|
handle.selectOption('blue');
|
|
|
|
|
|
|
|
|
|
|
|
// single selection matching both the value and the label
|
|
|
|
|
|
handle.selectOption({ label: 'Blue' });
|
|
|
|
|
|
|
|
|
|
|
|
// multiple selection
|
|
|
|
|
|
handle.selectOption('red', 'green', 'blue');
|
|
|
|
|
|
|
|
|
|
|
|
// multiple selection for blue, red and second option
|
|
|
|
|
|
handle.selectOption({ value: 'blue' }, { index: 2 }, 'red');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.selectOption.values
|
|
|
|
|
|
- `values` <[null]|[string]|[ElementHandle]|[Array]<[string]>|[Object]|[Array]<[ElementHandle]>|[Array]<[Object]>>
|
|
|
|
|
|
- `value` <[string]> Matches by `option.value`.
|
|
|
|
|
|
- `label` <[string]> Matches by `option.label`.
|
|
|
|
|
|
- `index` <[number]> Matches by the index.
|
|
|
|
|
|
|
|
|
|
|
|
Options to select. If the `<select>` has the `multiple` attribute, all matching options are selected, otherwise only the
|
|
|
|
|
|
first option matching one of the passed options is selected. String values are equivalent to `{value:'string'}`. Option
|
|
|
|
|
|
is considered matching if all specified properties match.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.selectOption.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.selectOption.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.selectText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method waits for [actionability](./actionability.md) checks, then focuses the element and selects all its text
|
|
|
|
|
|
content.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.selectText.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.setInputFiles
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
This method expects `elementHandle` to point to an [input
|
|
|
|
|
|
element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
|
|
|
|
|
|
are resolved relative to the [current working directory](https://nodejs.org/api/process.html#process_process_cwd). For
|
|
|
|
|
|
empty array, clears the selected files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.setInputFiles.files = %%-input-files-%%
|
|
|
|
|
|
### option: ElementHandle.setInputFiles.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.setInputFiles.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.tap
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully tapped.
|
|
|
|
|
|
|
|
|
|
|
|
This method taps the element by performing the following steps:
|
|
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
2020-12-04 18:03:33 +01:00
|
|
|
|
1. Use [page.touchscreen](#pagetouchscreen) to tap in the center of the element, or the specified `position`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** `elementHandle.tap()` requires that the `hasTouch` option of the browser context be set to true.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.tap.position = %%-input-position-%%
|
|
|
|
|
|
### option: ElementHandle.tap.modifiers = %%-input-modifiers-%%
|
|
|
|
|
|
### option: ElementHandle.tap.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.tap.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.tap.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.textContent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>> Resolves to the `node.textContent`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.toString
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ElementHandle.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Focuses the element, and then sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To press a special key, like `Control` or `ArrowDown`, use [elementHandle.press()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await elementHandle.type('Hello'); // Types instantly
|
|
|
|
|
|
await elementHandle.type('World', {delay: 100}); // Types slower, like a user
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of typing into a text field and then submitting the form:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const elementHandle = await page.$('input');
|
|
|
|
|
|
await elementHandle.type('some text');
|
|
|
|
|
|
await elementHandle.press('Enter');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.type.text
|
|
|
|
|
|
- `text` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A text to type into a focused element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.type.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between key presses in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.type.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.type.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.uncheck
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element is successfully unchecked.
|
|
|
|
|
|
|
|
|
|
|
|
This method checks the element by performing the following steps:
|
2020-12-05 03:05:35 +01:00
|
|
|
|
1. Ensure that element is a checkbox or a radio input. If not, this method rejects. If the element is already unchecked,
|
|
|
|
|
|
this method returns immediately.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
|
|
|
|
|
1. Scroll the element into view if needed.
|
|
|
|
|
|
1. Use [page.mouse](#pagemouse) to click in the center of the element.
|
|
|
|
|
|
1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
|
|
|
|
|
1. Ensure that the element is now unchecked. If not, this method rejects.
|
|
|
|
|
|
|
|
|
|
|
|
If the element is detached from the DOM at any moment during the action, this method rejects.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When all steps combined have not finished during the specified `timeout`, this method rejects with a [TimeoutError].
|
|
|
|
|
|
Passing zero timeout disables this.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ElementHandle.uncheck.force = %%-input-force-%%
|
|
|
|
|
|
### option: ElementHandle.uncheck.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: ElementHandle.uncheck.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.waitForElementState
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when the element satisfies the `state`.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Depending on the `state` parameter, this method waits for one of the [actionability](./actionability.md) checks to pass.
|
|
|
|
|
|
This method throws when the element is detached while waiting, unless waiting for the `"hidden"` state.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* `"visible"` Wait until the element is [visible](./actionability.md#visible).
|
2020-12-05 03:05:35 +01:00
|
|
|
|
* `"hidden"` Wait until the element is [not visible](./actionability.md#visible) or
|
|
|
|
|
|
[not attached](./actionability.md#attached). Note that waiting for hidden does not throw when the element detaches.
|
|
|
|
|
|
* `"stable"` Wait until the element is both [visible](./actionability.md#visible) and
|
|
|
|
|
|
[stable](./actionability.md#stable).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* `"enabled"` Wait until the element is [enabled](./actionability.md#enabled).
|
|
|
|
|
|
* `"disabled"` Wait until the element is [not enabled](./actionability.md#enabled).
|
|
|
|
|
|
|
|
|
|
|
|
If the element does not satisfy the condition for the `timeout` milliseconds, this method will throw.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.waitForElementState.state
|
|
|
|
|
|
- `state` <"visible"|"hidden"|"stable"|"enabled"|"disabled">
|
|
|
|
|
|
|
|
|
|
|
|
A state to wait for, see below for more details.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ElementHandle.waitForElementState.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: ElementHandle.waitForSelector
|
|
|
|
|
|
- returns: <[Promise]<[null]|[ElementHandle]>> Promise that resolves when element specified by selector satisfies
|
|
|
|
|
|
`state` option. Resolves to `null` if waiting for `hidden` or `detached`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Wait for the `selector` relative to the element handle to satisfy `state` option (either appear/disappear from dom, or
|
|
|
|
|
|
become visible/hidden). If at the moment of calling the method `selector` already satisfies the condition, the method
|
|
|
|
|
|
will return immediately. If the selector doesn't satisfy the condition for the `timeout` milliseconds, the function will
|
|
|
|
|
|
throw.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.setContent(`<div><span></span></div>`);
|
|
|
|
|
|
const div = await page.$('div');
|
|
|
|
|
|
// Waiting for the 'span' selector relative to the div.
|
|
|
|
|
|
const span = await div.waitForSelector('span', { state: 'attached' });
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
> **NOTE** This method does not work across navigations, use [page.waitForSelector()]() instead.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ElementHandle.waitForSelector.selector = %%-query-selector-%%
|
|
|
|
|
|
### option: ElementHandle.waitForSelector.state = %%-wait-for-selector-state-%%
|
|
|
|
|
|
### option: ElementHandle.waitForSelector.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
# class: JSHandle
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
JSHandle represents an in-page JavaScript object. JSHandles can be created with the [page.evaluateHandle()]() method.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const windowHandle = await page.evaluateHandle(() => window);
|
|
|
|
|
|
// ...
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
JSHandle prevents the referenced JavaScript object being garbage collected unless the handle is exposed with
|
2020-12-04 20:09:20 +01:00
|
|
|
|
[jsHandle.dispose()](). JSHandles are auto-disposed when their origin frame gets navigated or the parent context gets
|
|
|
|
|
|
destroyed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
JSHandle instances can be used as an argument in [page.$eval()](), [page.evaluate()]() and [page.evaluateHandle()]()
|
2020-12-04 03:05:36 +01:00
|
|
|
|
methods.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: JSHandle.asElement
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[ElementHandle]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns either `null` or the object handle itself, if the object handle is an instance of [ElementHandle].
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: JSHandle.dispose
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise which resolves when the object handle is successfully disposed.
|
|
|
|
|
|
|
|
|
|
|
|
The `jsHandle.dispose` method stops referencing the element handle.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: JSHandle.evaluate
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
This method passes this handle as the first argument to `pageFunction`.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `pageFunction` returns a [Promise], then `handle.evaluate` would wait for the promise to resolve and return its
|
|
|
|
|
|
value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Examples:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const tweetHandle = await page.$('.tweet .retweets');
|
|
|
|
|
|
expect(await tweetHandle.evaluate((node, suffix) => node.innerText, ' retweets')).toBe('10 retweets');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: JSHandle.evaluate.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in browser context
|
|
|
|
|
|
|
|
|
|
|
|
### param: JSHandle.evaluate.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: JSHandle.evaluateHandle
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object
|
|
|
|
|
|
(JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
This method passes this handle as the first argument to `pageFunction`.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The only difference between `jsHandle.evaluate` and `jsHandle.evaluateHandle` is that `jsHandle.evaluateHandle` returns
|
|
|
|
|
|
in-page object (JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `jsHandle.evaluateHandle` returns a [Promise], then `jsHandle.evaluateHandle` would wait
|
|
|
|
|
|
for the promise to resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
See [page.evaluateHandle()]() for more details.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: JSHandle.evaluateHandle.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated
|
|
|
|
|
|
|
|
|
|
|
|
### param: JSHandle.evaluateHandle.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: JSHandle.getProperties
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Map]<[string], [JSHandle]>>>
|
|
|
|
|
|
|
|
|
|
|
|
The method returns a map with **own property names** as keys and JSHandle instances for the property values.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const handle = await page.evaluateHandle(() => ({window, document}));
|
|
|
|
|
|
const properties = await handle.getProperties();
|
|
|
|
|
|
const windowHandle = properties.get('window');
|
|
|
|
|
|
const documentHandle = properties.get('document');
|
|
|
|
|
|
await handle.dispose();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: JSHandle.getProperty
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[JSHandle]>>
|
|
|
|
|
|
|
|
|
|
|
|
Fetches a single property from the referenced object.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: JSHandle.getProperty.propertyName
|
|
|
|
|
|
- `propertyName` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
property to get
|
|
|
|
|
|
|
|
|
|
|
|
## method: JSHandle.jsonValue
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns a JSON representation of the object. If the object has a
|
|
|
|
|
|
[`toJSON`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior)
|
|
|
|
|
|
function, it **will not be called**.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** The method will return an empty JSON object if the referenced object is not stringifiable. It will throw an
|
|
|
|
|
|
error if the object has circular references.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: ConsoleMessage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[ConsoleMessage] objects are dispatched by page via the [page.on('console')]() event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ConsoleMessage.args
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[JSHandle]>>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ConsoleMessage.location
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Object]>
|
|
|
|
|
|
- `url` <[string]> URL of the resource if available, otherwise empty string.
|
|
|
|
|
|
- `lineNumber` <[number]> 0-based line number in the resource.
|
|
|
|
|
|
- `columnNumber` <[number]> 0-based column number in the resource.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ConsoleMessage.text
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ConsoleMessage.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
One of the following values: `'log'`, `'debug'`, `'info'`, `'error'`, `'warning'`, `'dir'`, `'dirxml'`, `'table'`,
|
|
|
|
|
|
`'trace'`, `'clear'`, `'startGroup'`, `'startGroupCollapsed'`, `'endGroup'`, `'assert'`, `'profile'`, `'profileEnd'`,
|
|
|
|
|
|
`'count'`, `'timeEnd'`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Dialog
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[Dialog] objects are dispatched by page via the [page.on('dialog')]() event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of using `Dialog` class:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
page.on('dialog', async dialog => {
|
|
|
|
|
|
console.log(dialog.message());
|
|
|
|
|
|
await dialog.dismiss();
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
});
|
|
|
|
|
|
page.evaluate(() => alert('1'));
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Dialog.accept
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise which resolves when the dialog has been accepted.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Dialog.accept.promptText
|
|
|
|
|
|
- `promptText` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A text to enter in prompt. Does not cause any effects if the dialog's `type` is not prompt. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Dialog.defaultValue
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> If dialog is prompt, returns default prompt value. Otherwise, returns empty string.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Dialog.dismiss
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise which resolves when the dialog has been dismissed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Dialog.message
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> A message displayed in the dialog.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Dialog.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> Dialog's type, can be one of `alert`, `beforeunload`, `confirm` or `prompt`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Download
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[Download] objects are dispatched by page via the [page.on('download')]() event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
All the downloaded files belonging to the browser context are deleted when the browser context is closed. All downloaded
|
|
|
|
|
|
files are deleted when the browser closes.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Download event is emitted once the download starts. Download path becomes available once download completes:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [ download ] = await Promise.all([
|
|
|
|
|
|
page.waitForEvent('download'), // wait for download to start
|
|
|
|
|
|
page.click('a')
|
|
|
|
|
|
]);
|
|
|
|
|
|
// wait for download to complete
|
|
|
|
|
|
const path = await download.path();
|
|
|
|
|
|
...
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
|
|
|
|
|
|
downloaded content. If `acceptDownloads` is not set or set to `false`, download events are emitted, but the actual
|
|
|
|
|
|
download is not performed and user has no access to the downloaded files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.createReadStream
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Readable]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns readable stream for current download or `null` if download failed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.delete
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Deletes the downloaded file.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.failure
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns download error if any.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.path
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Returns path to the downloaded file in case of successful download.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.saveAs
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Saves the download to a user-specified path.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Download.saveAs.path
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Path where the download should be saved.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Download.suggestedFilename
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Returns suggested filename for this download. It is typically computed by the browser from the
|
|
|
|
|
|
[`Content-Disposition`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) response header
|
|
|
|
|
|
or the `download` attribute. See the spec on [whatwg](https://html.spec.whatwg.org/#downloading-resources). Different
|
|
|
|
|
|
browsers can use different logic for computing it.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Download.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns downloaded url.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Video
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
When browser context is created with the `videosPath` option, each page has a video object associated with it.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
console.log(await page.video().path());
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Video.path
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Returns the file system path this video will be recorded to. The video is guaranteed to be written to the filesystem
|
|
|
|
|
|
upon closing the browser context.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: FileChooser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[FileChooser] objects are dispatched by the page in the [page.on('filechooser')]() event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
page.on('filechooser', async (fileChooser) => {
|
|
|
|
|
|
await fileChooser.setFiles('/tmp/myfile.pdf');
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: FileChooser.element
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[ElementHandle]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns input element associated with this file chooser.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: FileChooser.isMultiple
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns whether this file chooser accepts multiple files.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: FileChooser.page
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Page]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns page this file chooser belongs to.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: FileChooser.setFiles
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Sets the value of the file input this chooser is associated with. If some of the `filePaths` are relative paths, then
|
|
|
|
|
|
they are resolved relative to the [current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
For empty array, clears the selected files.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: FileChooser.setFiles.files = %%-input-files-%%
|
|
|
|
|
|
### option: FileChooser.setFiles.noWaitAfter = %%-input-no-wait-after-%%
|
|
|
|
|
|
### option: FileChooser.setFiles.timeout = %%-input-timeout-%%
|
|
|
|
|
|
|
|
|
|
|
|
# class: Keyboard
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Keyboard provides an api for managing a virtual keyboard. The high level api is [keyboard.type()](), which takes raw
|
|
|
|
|
|
characters and generates proper keydown, keypress/input, and keyup events on your page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
For finer control, you can use [keyboard.down()](), [keyboard.up()](), and [keyboard.insertText()]() to manually fire
|
|
|
|
|
|
events as if they were generated from a real keyboard.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of holding down `Shift` in order to select and delete some text:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
await page.keyboard.type('Hello World!');
|
|
|
|
|
|
await page.keyboard.press('ArrowLeft');
|
|
|
|
|
|
|
|
|
|
|
|
await page.keyboard.down('Shift');
|
|
|
|
|
|
for (let i = 0; i < ' World'.length; i++)
|
|
|
|
|
|
await page.keyboard.press('ArrowLeft');
|
|
|
|
|
|
await page.keyboard.up('Shift');
|
|
|
|
|
|
|
|
|
|
|
|
await page.keyboard.press('Backspace');
|
|
|
|
|
|
// Result text will end up saying 'Hello!'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of pressing uppercase `A`
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
await page.keyboard.press('Shift+KeyA');
|
|
|
|
|
|
// or
|
|
|
|
|
|
await page.keyboard.press('Shift+A');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example to trigger select-all with the keyboard
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
// on Windows and Linux
|
|
|
|
|
|
await page.keyboard.press('Control+A');
|
|
|
|
|
|
// on macOS
|
|
|
|
|
|
await page.keyboard.press('Meta+A');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Keyboard.down
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `keydown` event.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
|
|
|
|
|
value or a single character to generate the text for. A superset of the `key` values can be found
|
|
|
|
|
|
[here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
|
|
|
|
|
`Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Following modification shortcuts are also suported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
|
|
|
|
|
|
|
|
|
|
|
Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
|
|
|
|
|
texts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a modifier key, `Shift`, `Meta`, `Control`, or `Alt`, subsequent key presses will be sent with that modifier
|
2020-12-04 18:03:33 +01:00
|
|
|
|
active. To release the modifier key, use [keyboard.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
After the key is pressed once, subsequent calls to [keyboard.down()]() will have
|
2020-12-04 03:05:36 +01:00
|
|
|
|
[repeat](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat) set to true. To release the key, use
|
2020-12-04 18:03:33 +01:00
|
|
|
|
[keyboard.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
> **NOTE** Modifier keys DO influence `keyboard.down`. Holding down `Shift` will type the text in upper case.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Keyboard.down.key
|
|
|
|
|
|
- `key` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Keyboard.insertText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches only `input` event, does not emit the `keydown`, `keyup` or `keypress` events.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
page.keyboard.insertText('嗨');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** Modifier keys DO NOT effect `keyboard.insertText`. Holding down `Shift` will not type the text in upper case.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Keyboard.insertText.text
|
|
|
|
|
|
- `text` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Sets input to the specified text value.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Keyboard.press
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
|
|
|
|
|
value or a single character to generate the text for. A superset of the `key` values can be found
|
|
|
|
|
|
[here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
|
|
|
|
|
`Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Following modification shortcuts are also suported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
|
|
|
|
|
|
|
|
|
|
|
Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
|
|
|
|
|
texts.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
|
|
|
|
|
|
modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://keycode.info');
|
|
|
|
|
|
await page.keyboard.press('A');
|
|
|
|
|
|
await page.screenshot({ path: 'A.png' });
|
|
|
|
|
|
await page.keyboard.press('ArrowLeft');
|
|
|
|
|
|
await page.screenshot({ path: 'ArrowLeft.png' });
|
|
|
|
|
|
await page.keyboard.press('Shift+O');
|
|
|
|
|
|
await page.screenshot({ path: 'O.png' });
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for [keyboard.down()]() and [keyboard.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Keyboard.press.key
|
|
|
|
|
|
- `key` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Keyboard.press.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Keyboard.type
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
To press a special key, like `Control` or `ArrowDown`, use [keyboard.press()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.keyboard.type('Hello'); // Types instantly
|
|
|
|
|
|
await page.keyboard.type('World', {delay: 100}); // Types slower, like a user
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** Modifier keys DO NOT effect `keyboard.type`. Holding down `Shift` will not type the text in upper case.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Keyboard.type.text
|
|
|
|
|
|
- `text` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A text to type into a focused element.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Keyboard.type.delay
|
|
|
|
|
|
- `delay` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Time to wait between key presses in milliseconds. Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Keyboard.up
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `keyup` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Keyboard.up.key
|
|
|
|
|
|
- `key` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.
|
|
|
|
|
|
|
|
|
|
|
|
# class: Mouse
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The Mouse class operates in main-frame CSS pixels relative to the top-left corner of the viewport.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Every `page` object has its own Mouse, accessible with [page.mouse](#pagemouse).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
// Using ‘page.mouse’ to trace a 100x100 square.
|
|
|
|
|
|
await page.mouse.move(0, 0);
|
|
|
|
|
|
await page.mouse.down();
|
|
|
|
|
|
await page.mouse.move(0, 100);
|
|
|
|
|
|
await page.mouse.move(100, 100);
|
|
|
|
|
|
await page.mouse.move(100, 0);
|
|
|
|
|
|
await page.mouse.move(0, 0);
|
|
|
|
|
|
await page.mouse.up();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Mouse.click
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
Shortcut for [mouse.move()](), [mouse.down()](), [mouse.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Mouse.click.x
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `x` <[number]>
|
2020-12-05 03:05:35 +01:00
|
|
|
|
|
|
|
|
|
|
### param: Mouse.click.y
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `y` <[number]>
|
2020-12-05 03:05:35 +01:00
|
|
|
|
|
|
|
|
|
|
### option: Mouse.click.button = %%-input-button-%%
|
|
|
|
|
|
### option: Mouse.click.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
### option: Mouse.click.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Mouse.dblclick
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Shortcut for [mouse.move()](), [mouse.down()](), [mouse.up()](), [mouse.down()]() and [mouse.up()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Mouse.dblclick.x
|
|
|
|
|
|
- `x` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
### param: Mouse.dblclick.y
|
|
|
|
|
|
- `y` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
### option: Mouse.dblclick.button = %%-input-button-%%
|
|
|
|
|
|
### option: Mouse.dblclick.delay = %%-input-down-up-delay-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Mouse.down
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `mousedown` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Mouse.down.button = %%-input-button-%%
|
|
|
|
|
|
### option: Mouse.down.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: Mouse.move
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `mousemove` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Mouse.move.x
|
|
|
|
|
|
- `x` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
### param: Mouse.move.y
|
|
|
|
|
|
- `y` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
### option: Mouse.move.steps
|
|
|
|
|
|
- `steps` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
defaults to 1. Sends intermediate `mousemove` events.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Mouse.up
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `mouseup` event.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Mouse.up.button = %%-input-button-%%
|
|
|
|
|
|
### option: Mouse.up.clickCount = %%-input-click-count-%%
|
|
|
|
|
|
|
|
|
|
|
|
# class: Touchscreen
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the
|
|
|
|
|
|
touchscreen can only be used in browser contexts that have been intialized with `hasTouch` set to true.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Touchscreen.tap
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Dispatches a `touchstart` and `touchend` event with a single touch at the position (`x`,`y`).
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Touchscreen.tap.x
|
|
|
|
|
|
- `x` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
### param: Touchscreen.tap.y
|
|
|
|
|
|
- `y` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
# class: Request
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Whenever the page sends a request for a network resource the following sequence of events are emitted by [Page]:
|
2020-12-04 18:03:33 +01:00
|
|
|
|
- [page.on('request')]() emitted when the request is issued by the page.
|
|
|
|
|
|
- [page.on('response')]() emitted when/if the response status and headers are received for the request.
|
|
|
|
|
|
- [page.on('requestfinished')]() emitted when the response body is downloaded and the request is complete.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If request fails at some point, then instead of `'requestfinished'` event (and possibly instead of 'response' event),
|
2020-12-04 18:03:33 +01:00
|
|
|
|
the [page.on('requestfailed')]() event is emitted.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** HTTP Error responses, such as 404 or 503, are still successful responses from HTTP standpoint, so request
|
|
|
|
|
|
will complete with `'requestfinished'` event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If request gets a 'redirect' response, the request is successfully finished with the 'requestfinished' event, and a new
|
|
|
|
|
|
request is issued to a redirected url.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.failure
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Object]> Object describing request failure, if any
|
|
|
|
|
|
- `errorText` <[string]> Human-readable error message, e.g. `'net::ERR_FAILED'`.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The method returns `null` unless this request has failed, as reported by `requestfailed` event.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Example of logging of all the failed requests:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
page.on('requestfailed', request => {
|
|
|
|
|
|
console.log(request.url() + ' ' + request.failure().errorText);
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.frame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Frame]> A [Frame] that initiated this request.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.headers
|
|
|
|
|
|
- returns: <[Object]<[string], [string]>> An object with HTTP headers associated with the request. All header names are
|
|
|
|
|
|
lower-case.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.isNavigationRequest
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether this request is driving frame's navigation.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.method
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> Request's method (GET, POST, etc.)
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.postData
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[string]> Request's post body, if any.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.postDataBuffer
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Buffer]> Request's post body in a binary form, if any.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.postDataJSON
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Object]> Parsed request's body for `form-urlencoded` and JSON as a fallback if any.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When the response is `application/x-www-form-urlencoded` then a key/value object of the values will be returned.
|
|
|
|
|
|
Otherwise it will be parsed as JSON.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.redirectedFrom
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Request]> Request that was redirected by the server to this one, if any.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
When the server responds with a redirect, Playwright creates a new [Request] object. The two requests are connected by
|
|
|
|
|
|
`redirectedFrom()` and `redirectedTo()` methods. When multiple server redirects has happened, it is possible to
|
|
|
|
|
|
construct the whole redirect chain by repeatedly calling `redirectedFrom()`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
For example, if the website `http://example.com` redirects to `https://example.com`:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const response = await page.goto('http://example.com');
|
|
|
|
|
|
console.log(response.request().redirectedFrom().url()); // 'http://example.com'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
If the website `https://google.com` has no redirects:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const response = await page.goto('https://google.com');
|
|
|
|
|
|
console.log(response.request().redirectedFrom()); // null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.redirectedTo
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[null]|[Request]> New request issued by the browser if the server responded with redirect.
|
|
|
|
|
|
|
2020-12-04 18:03:33 +01:00
|
|
|
|
This method is the opposite of [request.redirectedFrom()]():
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
console.log(request.redirectedFrom().redirectedTo() === request); // true
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.resourceType
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Contains the request's resource type as it was perceived by the rendering engine. ResourceType will be one of the
|
|
|
|
|
|
following: `document`, `stylesheet`, `image`, `media`, `font`, `script`, `texttrack`, `xhr`, `fetch`, `eventsource`,
|
|
|
|
|
|
`websocket`, `manifest`, `other`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.response
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Response]>> A matching [Response] object, or `null` if the response was not received due to error.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.timing
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Object]>
|
|
|
|
|
|
- `startTime` <[number]> Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `domainLookupStart` <[number]> Time immediately before the browser starts the domain name lookup for the resource.
|
|
|
|
|
|
The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `domainLookupEnd` <[number]> Time immediately after the browser starts the domain name lookup for the resource.
|
|
|
|
|
|
The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `connectStart` <[number]> Time immediately before the user agent starts establishing the connection to the server to
|
|
|
|
|
|
retrieve the resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `secureConnectionStart` <[number]> Time immediately before the browser starts the handshake process to secure the
|
|
|
|
|
|
current connection. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `connectEnd` <[number]> Time immediately before the user agent starts establishing the connection to the server to
|
|
|
|
|
|
retrieve the resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `requestStart` <[number]> Time immediately before the browser starts requesting the resource from the server, cache,
|
|
|
|
|
|
or local resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `responseStart` <[number]> Time immediately after the browser starts requesting the resource from the server, cache,
|
|
|
|
|
|
or local resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
|
|
|
|
|
- `responseEnd` <[number]> Time immediately after the browser receives the last byte of the resource or immediately
|
|
|
|
|
|
before the transport connection is closed, whichever comes first. The value is given in milliseconds relative to
|
|
|
|
|
|
`startTime`, -1 if not available.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Returns resource timing information for given request. Most of the timing values become available upon the response,
|
|
|
|
|
|
`responseEnd` becomes available when request finishes. Find more information at [Resource Timing
|
|
|
|
|
|
API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const [request] = await Promise.all([
|
|
|
|
|
|
page.waitForEvent('requestfinished'),
|
|
|
|
|
|
page.goto(httpsServer.EMPTY_PAGE)
|
|
|
|
|
|
]);
|
|
|
|
|
|
console.log(request.timing());
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Request.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> URL of the request.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Response
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
[Response] class represents responses which are received by page.
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.body
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Buffer]>> Promise which resolves to a buffer with response body.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.finished
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Error]>> Waits for this response to finish, returns failure error if request failed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.frame
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Frame]> A [Frame] that initiated this response.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.headers
|
|
|
|
|
|
- returns: <[Object]<[string], [string]>> An object with HTTP headers associated with the response. All header names are
|
|
|
|
|
|
lower-case.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.json
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to a JSON representation of response body.
|
|
|
|
|
|
|
|
|
|
|
|
This method will throw if the response body is not parsable via `JSON.parse`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.ok
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Contains a boolean stating whether the response was successful (status in the range 200-299) or not.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.request
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Request]> A matching [Request] object.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.status
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Contains the status code of the response (e.g., 200 for a success).
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.statusText
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Contains the status text of the response (e.g. usually an "OK" for a success).
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.text
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[string]>> Promise which resolves to a text representation of response body.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Response.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Contains the URL of the response.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Selectors
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Selectors can be used to install custom selector engines. See [Working with selectors](#working-with-selectors) for more
|
|
|
|
|
|
information.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Selectors.register
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
An example of registering selector engine that queries elements based on a tag name:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { selectors, firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
// Must be a function that evaluates to a selector engine instance.
|
|
|
|
|
|
const createTagNameEngine = () => ({
|
|
|
|
|
|
// Creates a selector that matches given target when queried at the root.
|
|
|
|
|
|
// Can return undefined if unable to create one.
|
|
|
|
|
|
create(root, target) {
|
|
|
|
|
|
return root.querySelector(target.tagName) === target ? target.tagName : undefined;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Returns the first element matching given selector in the root's subtree.
|
|
|
|
|
|
query(root, selector) {
|
|
|
|
|
|
return root.querySelector(selector);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Returns all elements matching given selector in the root's subtree.
|
|
|
|
|
|
queryAll(root, selector) {
|
|
|
|
|
|
return Array.from(root.querySelectorAll(selector));
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Register the engine. Selectors will be prefixed with "tag=".
|
|
|
|
|
|
await selectors.register('tag', createTagNameEngine);
|
|
|
|
|
|
|
|
|
|
|
|
const browser = await firefox.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.setContent(`<div><button>Click me</button></div>`);
|
|
|
|
|
|
|
|
|
|
|
|
// Use the selector prefixed with its name.
|
|
|
|
|
|
const button = await page.$('tag=button');
|
|
|
|
|
|
// Combine it with other selector engines.
|
|
|
|
|
|
await page.click('tag=div >> text="Click me"');
|
|
|
|
|
|
// Can use it in any methods supporting selectors.
|
|
|
|
|
|
const buttonCount = await page.$$eval('tag=button', buttons => buttons.length);
|
|
|
|
|
|
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Selectors.register.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Name that is used in selectors as a prefix, e.g. `{name: 'foo'}` enables `foo=myselectorbody` selectors. May only
|
|
|
|
|
|
contain `[a-zA-Z0-9_]` characters.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Selectors.register.script
|
|
|
|
|
|
- `script` <[function]|[string]|[Object]>
|
|
|
|
|
|
- `path` <[string]> Path to the JavaScript file. If `path` is a relative path, then it is resolved relative to
|
|
|
|
|
|
[current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
- `content` <[string]> Raw script content.
|
|
|
|
|
|
|
|
|
|
|
|
Script that evaluates to a selector engine instance.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Selectors.register.contentScript
|
|
|
|
|
|
- `contentScript` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to run this selector engine in isolated JavaScript environment. This environment has access to the same DOM, but
|
|
|
|
|
|
not any JavaScript objects from the frame's scripts. Defaults to `false`. Note that running as a content script is not
|
|
|
|
|
|
guaranteed when this engine is used together with other registered engines.
|
|
|
|
|
|
|
|
|
|
|
|
# class: Route
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Whenever a network route is set up with [page.route()]() or [browserContext.route()](), the `Route` object allows to
|
|
|
|
|
|
handle the route.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Route.abort
|
|
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Aborts the route's request.
|
|
|
|
|
|
|
|
|
|
|
|
### param: Route.abort.errorCode
|
|
|
|
|
|
- `errorCode` <[string]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `'aborted'` - An operation was aborted (due to user action)
|
|
|
|
|
|
- `'accessdenied'` - Permission to access a resource, other than the network, was denied
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `'addressunreachable'` - The IP address is unreachable. This usually means that there is no route to the specified
|
|
|
|
|
|
host or network.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `'blockedbyclient'` - The client chose to block the request.
|
2020-12-05 03:05:35 +01:00
|
|
|
|
- `'blockedbyresponse'` - The request failed because the response was delivered along with requirements which are not
|
|
|
|
|
|
met ('X-Frame-Options' and 'Content-Security-Policy' ancestor checks, for instance).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `'connectionaborted'` - A connection timed out as a result of not receiving an ACK for data sent.
|
|
|
|
|
|
- `'connectionclosed'` - A connection was closed (corresponding to a TCP FIN).
|
|
|
|
|
|
- `'connectionfailed'` - A connection attempt failed.
|
|
|
|
|
|
- `'connectionrefused'` - A connection attempt was refused.
|
|
|
|
|
|
- `'connectionreset'` - A connection was reset (corresponding to a TCP RST).
|
|
|
|
|
|
- `'internetdisconnected'` - The Internet connection has been lost.
|
|
|
|
|
|
- `'namenotresolved'` - The host name could not be resolved.
|
|
|
|
|
|
- `'timedout'` - An operation timed out.
|
|
|
|
|
|
- `'failed'` - A generic failure occurred.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
Optional error code. Defaults to `failed`, could be one of the following:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Route.continue
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Continues route's request with optional overrides.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.route('**/*', (route, request) => {
|
|
|
|
|
|
// Override headers
|
|
|
|
|
|
const headers = {
|
|
|
|
|
|
...request.headers(),
|
|
|
|
|
|
foo: 'bar', // set "foo" header
|
|
|
|
|
|
origin: undefined, // remove "origin" header
|
|
|
|
|
|
};
|
|
|
|
|
|
route.continue({headers});
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Route.continue.overrides
|
|
|
|
|
|
- `overrides` <[Object]>
|
|
|
|
|
|
- `url` <[string]> If set changes the request URL. New URL must have same protocol as original one.
|
|
|
|
|
|
- `method` <[string]> If set changes the request method (e.g. GET or POST)
|
|
|
|
|
|
- `postData` <[string]|[Buffer]> If set changes the post data of request
|
|
|
|
|
|
- `headers` <[Object]<[string], [string]>> If set changes the request HTTP headers. Header values will be converted to
|
|
|
|
|
|
a string.
|
|
|
|
|
|
|
|
|
|
|
|
Optional request overrides, can override following properties:
|
|
|
|
|
|
|
|
|
|
|
|
## method: Route.fulfill
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Fulfills route's request with given response.
|
|
|
|
|
|
|
|
|
|
|
|
An example of fulfilling all requests with 404 responses:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.route('**/*', route => {
|
|
|
|
|
|
route.fulfill({
|
|
|
|
|
|
status: 404,
|
|
|
|
|
|
contentType: 'text/plain',
|
|
|
|
|
|
body: 'Not Found!'
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of serving static file:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await page.route('**/xhr_endpoint', route => route.fulfill({ path: 'mock_data.json' }));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Route.fulfill.response
|
|
|
|
|
|
- `response` <[Object]>
|
|
|
|
|
|
- `status` <[number]> Response status code, defaults to `200`.
|
|
|
|
|
|
- `headers` <[Object]<[string], [string]>> Optional response headers. Header values will be converted to a string.
|
|
|
|
|
|
- `contentType` <[string]> If set, equals to setting `Content-Type` response header.
|
|
|
|
|
|
- `body` <[string]|[Buffer]> Optional response body.
|
|
|
|
|
|
- `path` <[string]> Optional file path to respond with. The content type will be inferred from file extension. If
|
|
|
|
|
|
`path` is a relative path, then it is resolved relative to
|
|
|
|
|
|
[current working directory](https://nodejs.org/api/process.html#process_process_cwd).
|
|
|
|
|
|
|
|
|
|
|
|
Response that will fulfill this route's request.
|
|
|
|
|
|
|
|
|
|
|
|
## method: Route.request
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Request]> A request to be routed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: WebSocket
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
The [WebSocket] class represents websocket connections in the page.
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: WebSocket.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Fired when the websocket closes.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: WebSocket.framereceived
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Object]> web socket frame data
|
|
|
|
|
|
- `payload` <[string]|[Buffer]> frame payload
|
|
|
|
|
|
|
|
|
|
|
|
Fired when the websocket recieves a frame.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: WebSocket.framesent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Object]> web socket frame data
|
|
|
|
|
|
- `payload` <[string]|[Buffer]> frame payload
|
|
|
|
|
|
|
|
|
|
|
|
Fired when the websocket sends a frame.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: WebSocket.socketerror
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[String]> the error message
|
|
|
|
|
|
|
|
|
|
|
|
Fired when the websocket has an error.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: WebSocket.isClosed
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Indicates that the web socket has been closed.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: WebSocket.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Contains the URL of the WebSocket.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: WebSocket.waitForEvent
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Object]>> Promise which resolves to the event data value.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Waits for event to fire and passes its value into the predicate function. Resolves when the predicate returns truthy
|
|
|
|
|
|
value. Will throw an error if the webSocket is closed before the event is fired.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: WebSocket.waitForEvent.event
|
|
|
|
|
|
- `event` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Event name, same one would pass into `webSocket.on(event)`.
|
|
|
|
|
|
|
|
|
|
|
|
### param: WebSocket.waitForEvent.optionsOrPredicate
|
|
|
|
|
|
- `optionsOrPredicate` <[Function]|[Object]>
|
|
|
|
|
|
- `predicate` <[Function]> receives the event data and resolves to truthy value when the waiting should resolve.
|
|
|
|
|
|
- `timeout` <[number]> maximum time to wait for in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable
|
|
|
|
|
|
timeout. The default value can be changed by using the
|
|
|
|
|
|
[browserContext.setDefaultTimeout(timeout)](#browsercontextsetdefaulttimeouttimeout).
|
|
|
|
|
|
|
|
|
|
|
|
Either a predicate that receives an event or an options object. Optional.
|
|
|
|
|
|
|
|
|
|
|
|
# class: TimeoutError
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [Error]
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
TimeoutError is emitted whenever certain operations are terminated due to timeout, e.g. [page.waitForSelector()]() or
|
|
|
|
|
|
[browserType.launch()]().
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Accessibility
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The Accessibility class provides methods for inspecting Chromium's accessibility tree. The accessibility tree is used by
|
|
|
|
|
|
assistive technology such as [screen readers](https://en.wikipedia.org/wiki/Screen_reader) or
|
|
|
|
|
|
[switches](https://en.wikipedia.org/wiki/Switch_access).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Accessibility is a very platform-specific thing. On different platforms, there are different screen readers that might
|
|
|
|
|
|
have wildly different output.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Blink - Chromium's rendering engine - has a concept of "accessibility tree", which is then translated into different
|
|
|
|
|
|
platform-specific APIs. Accessibility namespace gives users access to the Blink Accessibility Tree.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Most of the accessibility tree gets filtered out when converting from Blink AX Tree to Platform-specific AX-Tree or by
|
|
|
|
|
|
assistive technologies themselves. By default, Playwright tries to approximate this filtering, exposing only the
|
|
|
|
|
|
"interesting" nodes of the tree.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Accessibility.snapshot
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[null]|[Object]>> An [AXNode] object with the following properties:
|
|
|
|
|
|
- `role` <[string]> The [role](https://www.w3.org/TR/wai-aria/#usage_intro).
|
|
|
|
|
|
- `name` <[string]> A human readable name for the node.
|
|
|
|
|
|
- `value` <[string]|[number]> The current value of the node, if applicable.
|
|
|
|
|
|
- `description` <[string]> An additional human readable description of the node, if applicable.
|
|
|
|
|
|
- `keyshortcuts` <[string]> Keyboard shortcuts associated with this node, if applicable.
|
|
|
|
|
|
- `roledescription` <[string]> A human readable alternative to the role, if applicable.
|
|
|
|
|
|
- `valuetext` <[string]> A description of the current value, if applicable.
|
|
|
|
|
|
- `disabled` <[boolean]> Whether the node is disabled, if applicable.
|
|
|
|
|
|
- `expanded` <[boolean]> Whether the node is expanded or collapsed, if applicable.
|
|
|
|
|
|
- `focused` <[boolean]> Whether the node is focused, if applicable.
|
|
|
|
|
|
- `modal` <[boolean]> Whether the node is [modal](https://en.wikipedia.org/wiki/Modal_window), if applicable.
|
|
|
|
|
|
- `multiline` <[boolean]> Whether the node text input supports multiline, if applicable.
|
|
|
|
|
|
- `multiselectable` <[boolean]> Whether more than one child can be selected, if applicable.
|
|
|
|
|
|
- `readonly` <[boolean]> Whether the node is read only, if applicable.
|
|
|
|
|
|
- `required` <[boolean]> Whether the node is required, if applicable.
|
|
|
|
|
|
- `selected` <[boolean]> Whether the node is selected in its parent node, if applicable.
|
|
|
|
|
|
- `checked` <[boolean]|"mixed"> Whether the checkbox is checked, or "mixed", if applicable.
|
|
|
|
|
|
- `pressed` <[boolean]|"mixed"> Whether the toggle button is checked, or "mixed", if applicable.
|
|
|
|
|
|
- `level` <[number]> The level of a heading, if applicable.
|
|
|
|
|
|
- `valuemin` <[number]> The minimum value in a node, if applicable.
|
|
|
|
|
|
- `valuemax` <[number]> The maximum value in a node, if applicable.
|
|
|
|
|
|
- `autocomplete` <[string]> What kind of autocomplete is supported by a control, if applicable.
|
|
|
|
|
|
- `haspopup` <[string]> What kind of popup is currently being shown for a node, if applicable.
|
|
|
|
|
|
- `invalid` <[string]> Whether and in what way this node's value is invalid, if applicable.
|
|
|
|
|
|
- `orientation` <[string]> Whether the node is oriented horizontally or vertically, if applicable.
|
|
|
|
|
|
- `children` <[Array]<[Object]>> Child [AXNode]s of this node, if any, if applicable.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Captures the current state of the accessibility tree. The returned object represents the root accessible node of the
|
|
|
|
|
|
page.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** The Chromium accessibility tree contains nodes that go unused on most platforms and by most screen readers.
|
|
|
|
|
|
Playwright will discard them as well for an easier to process tree, unless `interestingOnly` is set to `false`.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
An example of dumping the entire accessibility tree:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const snapshot = await page.accessibility.snapshot();
|
|
|
|
|
|
console.log(snapshot);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
An example of logging the focused node's name:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const snapshot = await page.accessibility.snapshot();
|
|
|
|
|
|
const node = findFocusedNode(snapshot);
|
|
|
|
|
|
console.log(node && node.name);
|
|
|
|
|
|
|
|
|
|
|
|
function findFocusedNode(node) {
|
|
|
|
|
|
if (node.focused)
|
|
|
|
|
|
return node;
|
|
|
|
|
|
for (const child of node.children || []) {
|
|
|
|
|
|
const foundNode = findFocusedNode(child);
|
|
|
|
|
|
return foundNode;
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: Accessibility.snapshot.interestingOnly
|
|
|
|
|
|
- `interestingOnly` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Prune uninteresting nodes from the tree. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: Accessibility.snapshot.root
|
|
|
|
|
|
- `root` <[ElementHandle]>
|
|
|
|
|
|
|
|
|
|
|
|
The root DOM element for the snapshot. Defaults to the whole page.
|
|
|
|
|
|
|
|
|
|
|
|
# class: Worker
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The Worker class represents a [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API). `worker`
|
|
|
|
|
|
event is emitted on the page object to signal a worker creation. `close` event is emitted on the worker object when the
|
|
|
|
|
|
worker is gone.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
page.on('worker', worker => {
|
|
|
|
|
|
console.log('Worker created: ' + worker.url());
|
|
|
|
|
|
worker.on('close', worker => console.log('Worker destroyed: ' + worker.url()));
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
console.log('Current workers:');
|
|
|
|
|
|
for (const worker of page.workers())
|
|
|
|
|
|
console.log(' ' + worker.url());
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: Worker.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Worker]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when this dedicated [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is terminated.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Worker.evaluate
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction`
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `worker.evaluate` returns a [Promise], then `worker.evaluate` would wait for the promise
|
|
|
|
|
|
to resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `worker.evaluate` returns a non-[Serializable] value, then `worker.evaluate` resolves to
|
|
|
|
|
|
`undefined`. DevTools Protocol also supports transferring some additional values that are not serializable by `JSON`:
|
|
|
|
|
|
`-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Worker.evaluate.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in the worker context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Worker.evaluate.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Worker.evaluateHandle
|
|
|
|
|
|
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object
|
|
|
|
|
|
(JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
The only difference between `worker.evaluate` and `worker.evaluateHandle` is that `worker.evaluateHandle` returns
|
|
|
|
|
|
in-page object (JSHandle).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
If the function passed to the `worker.evaluateHandle` returns a [Promise], then `worker.evaluateHandle` would wait for
|
|
|
|
|
|
the promise to resolve and return its value.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Worker.evaluateHandle.pageFunction
|
|
|
|
|
|
- `pageFunction` <[function]|[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Function to be evaluated in the page context
|
|
|
|
|
|
|
|
|
|
|
|
### param: Worker.evaluateHandle.arg
|
|
|
|
|
|
- `arg` <[EvaluationArgument]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional argument to pass to `pageFunction`
|
|
|
|
|
|
|
|
|
|
|
|
## method: Worker.url
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: BrowserServer
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: BrowserServer.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Emitted when the browser server closes.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserServer.close
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Closes the browser gracefully and makes sure the process is terminated.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserServer.kill
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Kills the browser process and waits for the process to exit.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserServer.process
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[ChildProcess]> Spawned browser application process.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserServer.wsEndpoint
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> Browser websocket url.
|
|
|
|
|
|
|
2020-12-04 20:09:20 +01:00
|
|
|
|
Browser websocket endpoint which can be used as an argument to [browserType.connect()]() to establish connection to the
|
|
|
|
|
|
browser.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: BrowserType
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
BrowserType provides methods to launch a specific browser instance or connect to an existing one. The following is a
|
|
|
|
|
|
typical example of using Playwright to drive automation:
|
|
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.goto('https://example.com');
|
|
|
|
|
|
// other actions...
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserType.connect
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Browser]>>
|
|
|
|
|
|
|
|
|
|
|
|
This methods attaches Playwright to an existing browser instance.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserType.connect.params
|
|
|
|
|
|
- `params` <[Object]>
|
|
|
|
|
|
- `wsEndpoint` <[string]> A browser websocket endpoint to connect to. **required**
|
|
|
|
|
|
- `slowMo` <[number]> Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can
|
|
|
|
|
|
see what is going on. Defaults to 0.
|
|
|
|
|
|
- `logger` <[Logger]> Logger sink for Playwright logging.
|
|
|
|
|
|
- `timeout` <[number]> Maximum time in milliseconds to wait for the connection to be established. Defaults to `30000`
|
|
|
|
|
|
(30 seconds). Pass `0` to disable timeout.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserType.executablePath
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]> A path where Playwright expects to find a bundled browser executable.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: BrowserType.launch
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Browser]>> Promise which resolves to browser instance.
|
|
|
|
|
|
|
|
|
|
|
|
You can use `ignoreDefaultArgs` to filter out `--mute-audio` from default arguments:
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
```js
|
|
|
|
|
|
const browser = await chromium.launch({ // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
ignoreDefaultArgs: ['--mute-audio']
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **Chromium-only** Playwright can also be used to control the Chrome browser, but it works best with the version of
|
|
|
|
|
|
Chromium it is bundled with. There is no guarantee it will work with any other version. Use `executablePath` option with
|
|
|
|
|
|
extreme caution.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
>
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> If Google Chrome (rather than Chromium) is preferred, a [Chrome
|
|
|
|
|
|
Canary](https://www.google.com/chrome/browser/canary.html) or [Dev
|
|
|
|
|
|
Channel](https://www.chromium.org/getting-involved/dev-channel) build is suggested.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
>
|
2020-12-04 18:03:33 +01:00
|
|
|
|
> In [browserType.launch()]() above, any mention of Chromium also applies to Chrome.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
>
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> 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/+/lkgr/docs/chromium_browser_vs_google_chrome.md) describes
|
|
|
|
|
|
some differences for Linux users.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: BrowserType.launch.headless
|
|
|
|
|
|
- `headless` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to run browser in headless mode. More details for
|
|
|
|
|
|
[Chromium](https://developers.google.com/web/updates/2017/04/headless-chrome) and
|
|
|
|
|
|
[Firefox](https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode). Defaults to `true` unless the
|
|
|
|
|
|
`devtools` option is `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.executablePath
|
|
|
|
|
|
- `executablePath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Path to a browser executable to run instead of the bundled one. If `executablePath` is a relative path, then it is
|
|
|
|
|
|
resolved relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd). Note that
|
|
|
|
|
|
Playwright only works with the bundled Chromium, Firefox or WebKit, use at your own risk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.args
|
|
|
|
|
|
- `args` <[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Additional arguments to pass to the browser instance. The list of Chromium flags can be found
|
|
|
|
|
|
[here](http://peter.sh/experiments/chromium-command-line-switches/).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.ignoreDefaultArgs
|
|
|
|
|
|
- `ignoreDefaultArgs` <[boolean]|[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
If `true`, Playwright does not pass its own configurations args and only uses the ones from `args`. If an array is
|
|
|
|
|
|
given, then filters out the given default arguments. Dangerous option; use with care. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.proxy
|
|
|
|
|
|
- `proxy` <[Object]>
|
|
|
|
|
|
- `server` <[string]> Proxy to be used for all requests. HTTP and SOCKS proxies are supported, for example
|
|
|
|
|
|
`http://myproxy.com:3128` or `socks5://myproxy.com:3128`. Short form `myproxy.com:3128` is considered an HTTP proxy.
|
|
|
|
|
|
- `bypass` <[string]> Optional coma-separated domains to bypass proxy, for example `".com, chromium.org, .domain.com"`.
|
|
|
|
|
|
- `username` <[string]> Optional username to use if HTTP proxy requires authentication.
|
|
|
|
|
|
- `password` <[string]> Optional password to use if HTTP proxy requires authentication.
|
|
|
|
|
|
|
|
|
|
|
|
Network proxy settings.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.downloadsPath
|
|
|
|
|
|
- `downloadsPath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
If specified, accepted downloads are downloaded into this directory. Otherwise, temporary directory is created and is
|
|
|
|
|
|
deleted when browser is closed.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.chromiumSandbox
|
|
|
|
|
|
- `chromiumSandbox` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Enable Chromium sandboxing. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.firefoxUserPrefs
|
|
|
|
|
|
- `firefoxUserPrefs` <[Object]<[string], [string]|[number]|[boolean]>>
|
|
|
|
|
|
|
|
|
|
|
|
Firefox user preferences. Learn more about the Firefox user preferences at
|
|
|
|
|
|
[`about:config`](https://support.mozilla.org/en-US/kb/about-config-editor-firefox).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.handleSIGINT
|
|
|
|
|
|
- `handleSIGINT` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on Ctrl-C. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.handleSIGTERM
|
|
|
|
|
|
- `handleSIGTERM` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGTERM. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.handleSIGHUP
|
|
|
|
|
|
- `handleSIGHUP` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGHUP. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.logger
|
|
|
|
|
|
- `logger` <[Logger]>
|
|
|
|
|
|
|
|
|
|
|
|
Logger sink for Playwright logging.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to
|
|
|
|
|
|
disable timeout.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.env
|
|
|
|
|
|
- `env` <[Object]<[string], [string]|[number]|[boolean]>>
|
|
|
|
|
|
|
|
|
|
|
|
Specify environment variables that will be visible to the browser. Defaults to `process.env`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.devtools
|
|
|
|
|
|
- `devtools` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
**Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless`
|
|
|
|
|
|
option will be set `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launch.slowMo
|
|
|
|
|
|
- `slowMo` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserType.launchPersistentContext
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[BrowserContext]>> Promise that resolves to the persistent browser context instance.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Launches browser that uses persistent storage located at `userDataDir` and returns the only context. Closing this
|
|
|
|
|
|
context will automatically close the browser.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: BrowserType.launchPersistentContext.userDataDir
|
|
|
|
|
|
- `userDataDir` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Path to a User Data Directory, which stores browser session data like cookies and local storage. More details for
|
|
|
|
|
|
[Chromium](https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md) and
|
|
|
|
|
|
[Firefox](https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options#User_Profile).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.headless
|
|
|
|
|
|
- `headless` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to run browser in headless mode. More details for
|
|
|
|
|
|
[Chromium](https://developers.google.com/web/updates/2017/04/headless-chrome) and
|
|
|
|
|
|
[Firefox](https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode). Defaults to `true` unless the
|
|
|
|
|
|
`devtools` option is `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.executablePath
|
|
|
|
|
|
- `executablePath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Path to a browser executable to run instead of the bundled one. If `executablePath` is a relative path, then it is
|
|
|
|
|
|
resolved relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd). **BEWARE**:
|
|
|
|
|
|
Playwright is only guaranteed to work with the bundled Chromium, Firefox or WebKit, use at your own risk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.args
|
|
|
|
|
|
- `args` <[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Additional arguments to pass to the browser instance. The list of Chromium flags can be found
|
|
|
|
|
|
[here](http://peter.sh/experiments/chromium-command-line-switches/).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.ignoreDefaultArgs
|
|
|
|
|
|
- `ignoreDefaultArgs` <[boolean]|[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
If `true`, then do not use any of the default arguments. If an array is given, then filter out the given default
|
|
|
|
|
|
arguments. Dangerous option; use with care. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.proxy
|
|
|
|
|
|
- `proxy` <[Object]>
|
|
|
|
|
|
- `server` <[string]> Proxy to be used for all requests. HTTP and SOCKS proxies are supported, for example
|
|
|
|
|
|
`http://myproxy.com:3128` or `socks5://myproxy.com:3128`. Short form `myproxy.com:3128` is considered an HTTP proxy.
|
|
|
|
|
|
- `bypass` <[string]> Optional coma-separated domains to bypass proxy, for example `".com, chromium.org, .domain.com"`.
|
|
|
|
|
|
- `username` <[string]> Optional username to use if HTTP proxy requires authentication.
|
|
|
|
|
|
- `password` <[string]> Optional password to use if HTTP proxy requires authentication.
|
|
|
|
|
|
|
|
|
|
|
|
Network proxy settings.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.downloadsPath
|
|
|
|
|
|
- `downloadsPath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
If specified, accepted downloads are downloaded into this directory. Otherwise, temporary directory is created and is
|
|
|
|
|
|
deleted when browser is closed.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.chromiumSandbox
|
|
|
|
|
|
- `chromiumSandbox` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Enable Chromium sandboxing. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.handleSIGINT
|
|
|
|
|
|
- `handleSIGINT` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on Ctrl-C. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.handleSIGTERM
|
|
|
|
|
|
- `handleSIGTERM` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGTERM. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.handleSIGHUP
|
|
|
|
|
|
- `handleSIGHUP` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGHUP. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to
|
|
|
|
|
|
disable timeout.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.env
|
|
|
|
|
|
- `env` <[Object]<[string], [string]|[number]|[boolean]>>
|
|
|
|
|
|
|
|
|
|
|
|
Specify environment variables that will be visible to the browser. Defaults to `process.env`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.devtools
|
|
|
|
|
|
- `devtools` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
**Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless`
|
|
|
|
|
|
option will be set `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.slowMo
|
|
|
|
|
|
- `slowMo` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on.
|
|
|
|
|
|
Defaults to 0.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchPersistentContext.-inline- = %%-shared-context-params-list-%%
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserType.launchServer
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[BrowserServer]>> Promise which resolves to the browser app instance.
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Launches browser server that client can connect to. An example of launching a browser executable and connecting to it
|
|
|
|
|
|
later:
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'webkit' or 'firefox'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browserServer = await chromium.launchServer();
|
|
|
|
|
|
const wsEndpoint = browserServer.wsEndpoint();
|
|
|
|
|
|
// Use web socket endpoint later to establish a connection.
|
|
|
|
|
|
const browser = await chromium.connect({ wsEndpoint });
|
|
|
|
|
|
// Close browser instance.
|
|
|
|
|
|
await browserServer.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: BrowserType.launchServer.headless
|
|
|
|
|
|
- `headless` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to run browser in headless mode. More details for
|
|
|
|
|
|
[Chromium](https://developers.google.com/web/updates/2017/04/headless-chrome) and
|
|
|
|
|
|
[Firefox](https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode). Defaults to `true` unless the
|
|
|
|
|
|
`devtools` option is `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.port
|
|
|
|
|
|
- `port` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Port to use for the web socket. Defaults to 0 that picks any available port.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.executablePath
|
|
|
|
|
|
- `executablePath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Path to a browser executable to run instead of the bundled one. If `executablePath` is a relative path, then it is
|
|
|
|
|
|
resolved relative to [current working directory](https://nodejs.org/api/process.html#process_process_cwd). **BEWARE**:
|
|
|
|
|
|
Playwright is only guaranteed to work with the bundled Chromium, Firefox or WebKit, use at your own risk.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.args
|
|
|
|
|
|
- `args` <[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
Additional arguments to pass to the browser instance. The list of Chromium flags can be found
|
|
|
|
|
|
[here](http://peter.sh/experiments/chromium-command-line-switches/).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.ignoreDefaultArgs
|
|
|
|
|
|
- `ignoreDefaultArgs` <[boolean]|[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
If `true`, then do not use any of the default arguments. If an array is given, then filter out the given default
|
|
|
|
|
|
arguments. Dangerous option; use with care. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.proxy
|
|
|
|
|
|
- `proxy` <[Object]>
|
|
|
|
|
|
- `server` <[string]> Proxy to be used for all requests. HTTP and SOCKS proxies are supported, for example
|
|
|
|
|
|
`http://myproxy.com:3128` or `socks5://myproxy.com:3128`. Short form `myproxy.com:3128` is considered an HTTP proxy.
|
|
|
|
|
|
- `bypass` <[string]> Optional coma-separated domains to bypass proxy, for example `".com, chromium.org, .domain.com"`.
|
|
|
|
|
|
- `username` <[string]> Optional username to use if HTTP proxy requires authentication.
|
|
|
|
|
|
- `password` <[string]> Optional password to use if HTTP proxy requires authentication.
|
|
|
|
|
|
|
|
|
|
|
|
Network proxy settings.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.downloadsPath
|
|
|
|
|
|
- `downloadsPath` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
If specified, accepted downloads are downloaded into this directory. Otherwise, temporary directory is created and is
|
|
|
|
|
|
deleted when browser is closed.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.chromiumSandbox
|
|
|
|
|
|
- `chromiumSandbox` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Enable Chromium sandboxing. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.firefoxUserPrefs
|
|
|
|
|
|
- `firefoxUserPrefs` <[Object]<[string], [string]|[number]|[boolean]>>
|
|
|
|
|
|
|
|
|
|
|
|
Firefox user preferences. Learn more about the Firefox user preferences at
|
|
|
|
|
|
[`about:config`](https://support.mozilla.org/en-US/kb/about-config-editor-firefox).
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.handleSIGINT
|
|
|
|
|
|
- `handleSIGINT` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on Ctrl-C. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.handleSIGTERM
|
|
|
|
|
|
- `handleSIGTERM` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGTERM. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.handleSIGHUP
|
|
|
|
|
|
- `handleSIGHUP` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Close the browser process on SIGHUP. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.logger
|
|
|
|
|
|
- `logger` <[Logger]>
|
|
|
|
|
|
|
|
|
|
|
|
Logger sink for Playwright logging.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.timeout
|
|
|
|
|
|
- `timeout` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to
|
|
|
|
|
|
disable timeout.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.env
|
|
|
|
|
|
- `env` <[Object]<[string], [string]|[number]|[boolean]>>
|
|
|
|
|
|
|
|
|
|
|
|
Specify environment variables that will be visible to the browser. Defaults to `process.env`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: BrowserType.launchServer.devtools
|
|
|
|
|
|
- `devtools` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
**Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless`
|
|
|
|
|
|
option will be set `false`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: BrowserType.name
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
Returns browser name. For example: `'chromium'`, `'webkit'` or `'firefox'`.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: Logger
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Playwright generates a lot of logs and they are accessible via the pluggable logger sink.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
|
|
|
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
const browser = await chromium.launch({
|
|
|
|
|
|
logger: {
|
|
|
|
|
|
isEnabled: (name, severity) => name === 'browser',
|
|
|
|
|
|
log: (name, severity, message, args) => console.log(`${name} ${message}`)
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
...
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: Logger.isEnabled
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Determines whether sink is interested in the logger with the given name and severity.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: Logger.isEnabled.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
logger name
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.isEnabled.severity
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `severity` <"verbose"|"info"|"warning"|"error">
|
2020-12-05 03:05:35 +01:00
|
|
|
|
|
|
|
|
|
|
## method: Logger.log
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.log.name
|
|
|
|
|
|
- `name` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
logger name
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.log.severity
|
|
|
|
|
|
- `severity` <"verbose"|"info"|"warning"|"error">
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.log.message
|
|
|
|
|
|
- `message` <[string]|[Error]>
|
|
|
|
|
|
|
|
|
|
|
|
log message format
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.log.args
|
|
|
|
|
|
- `args` <[Array]<[Object]>>
|
|
|
|
|
|
|
|
|
|
|
|
message arguments
|
|
|
|
|
|
|
|
|
|
|
|
### param: Logger.log.hints
|
|
|
|
|
|
- `hints` <[Object]>
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- `color` <[string]> preferred logger color
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
optional formatting hints
|
|
|
|
|
|
|
|
|
|
|
|
# class: ChromiumBrowser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [Browser]
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Chromium-specific features including Tracing, service worker support, etc. You can use
|
2020-12-04 20:09:20 +01:00
|
|
|
|
[chromiumBrowser.startTracing()]() and [chromiumBrowser.stopTracing()]() to create a trace file which can be opened in
|
|
|
|
|
|
Chrome DevTools or [timeline viewer](https://chromedevtools.github.io/timeline-viewer/).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
await browser.startTracing(page, {path: 'trace.json'});
|
|
|
|
|
|
await page.goto('https://www.google.com');
|
|
|
|
|
|
await browser.stopTracing();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
<!-- GEN:toc-extends-Browser -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumBrowser.newBrowserCDPSession
|
2020-12-04 03:05:36 +01:00
|
|
|
|
- returns: <[Promise]<[CDPSession]>> Promise that resolves to the newly created browser session.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumBrowser.startTracing
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
|
|
|
|
|
Only one trace can be active at a time per browser.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ChromiumBrowser.startTracing.page
|
|
|
|
|
|
- `page` <[Page]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional, if specified, tracing includes screenshots of the given page.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ChromiumBrowser.startTracing.path
|
|
|
|
|
|
- `path` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
A path to write the trace file to.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ChromiumBrowser.startTracing.screenshots
|
|
|
|
|
|
- `screenshots` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
captures screenshots in the trace.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ChromiumBrowser.startTracing.categories
|
|
|
|
|
|
- `categories` <[Array]<[string]>>
|
|
|
|
|
|
|
|
|
|
|
|
specify custom categories to use instead of default.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ChromiumBrowser.stopTracing
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Buffer]>> Promise which resolves to buffer with trace data.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: ChromiumBrowserContext
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [BrowserContext]
|
|
|
|
|
|
|
|
|
|
|
|
Chromium-specific features including background pages, service worker support, etc.
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const backgroundPage = await context.waitForEvent('backgroundpage');
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|
2020-12-02 22:50:10 +01:00
|
|
|
|
<!-- GEN:toc-extends-BrowserContext -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: ChromiumBrowserContext.backgroundpage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Page]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when new background page is created in the context.
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** Only works with persistent context.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## event: ChromiumBrowserContext.serviceworker
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- <[Worker]>
|
|
|
|
|
|
|
|
|
|
|
|
Emitted when new service worker is created in the context.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumBrowserContext.backgroundPages
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[Page]>> All existing background pages in the context.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumBrowserContext.newCDPSession
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[CDPSession]>> Promise that resolves to the newly created session.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: ChromiumBrowserContext.newCDPSession.page
|
|
|
|
|
|
- `page` <[Page]>
|
|
|
|
|
|
|
|
|
|
|
|
Page to create new session for.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ChromiumBrowserContext.serviceWorkers
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Array]<[Worker]>> All existing service workers in the context.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: ChromiumCoverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
|
|
|
|
|
Coverage gathers information about parts of JavaScript and CSS that were used by the page.
|
|
|
|
|
|
|
|
|
|
|
|
An example of using JavaScript coverage to produce Istambul report for page load:
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const { chromium } = require('playwright');
|
|
|
|
|
|
const v8toIstanbul = require('v8-to-istanbul');
|
|
|
|
|
|
|
|
|
|
|
|
(async() => {
|
|
|
|
|
|
const browser = await chromium.launch();
|
|
|
|
|
|
const page = await browser.newPage();
|
|
|
|
|
|
await page.coverage.startJSCoverage();
|
|
|
|
|
|
await page.goto('https://chromium.org');
|
|
|
|
|
|
const coverage = await page.coverage.stopJSCoverage();
|
|
|
|
|
|
for (const entry of coverage) {
|
|
|
|
|
|
const converter = new v8toIstanbul('', 0, { source: entry.source });
|
|
|
|
|
|
await converter.load();
|
|
|
|
|
|
converter.applyCoverage(entry.functions);
|
|
|
|
|
|
console.log(JSON.stringify(converter.toIstanbul()));
|
|
|
|
|
|
}
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
})();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumCoverage.startCSSCoverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when coverage is started
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ChromiumCoverage.startCSSCoverage.resetOnNavigation
|
|
|
|
|
|
- `resetOnNavigation` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to reset coverage on every navigation. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ChromiumCoverage.startJSCoverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]> Promise that resolves when coverage is started
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
> **NOTE** Anonymous scripts are ones that don't have an associated url. These are scripts that are dynamically created
|
|
|
|
|
|
on the page using `eval` or `new Function`. If `reportAnonymousScripts` is set to `true`, anonymous scripts will have
|
|
|
|
|
|
`__playwright_evaluation_script__` as their URL.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### option: ChromiumCoverage.startJSCoverage.resetOnNavigation
|
|
|
|
|
|
- `resetOnNavigation` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether to reset coverage on every navigation. Defaults to `true`.
|
|
|
|
|
|
|
|
|
|
|
|
### option: ChromiumCoverage.startJSCoverage.reportAnonymousScripts
|
|
|
|
|
|
- `reportAnonymousScripts` <[boolean]>
|
|
|
|
|
|
|
|
|
|
|
|
Whether anonymous scripts generated by the page should be reported. Defaults to `false`.
|
|
|
|
|
|
|
|
|
|
|
|
## method: ChromiumCoverage.stopCSSCoverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[Object]>>> Promise that resolves to the array of coverage reports for all stylesheets
|
|
|
|
|
|
- `url` <[string]> StyleSheet URL
|
|
|
|
|
|
- `text` <[string]> StyleSheet content, if available.
|
|
|
|
|
|
- `ranges` <[Array]<[Object]>> StyleSheet ranges that were used. Ranges are sorted and non-overlapping.
|
|
|
|
|
|
- `start` <[number]> A start offset in text, inclusive
|
|
|
|
|
|
- `end` <[number]> An end offset in text, exclusive
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** CSS Coverage doesn't include dynamically injected style tags without sourceURLs.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: ChromiumCoverage.stopJSCoverage
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Array]<[Object]>>> Promise that resolves to the array of coverage reports for all scripts
|
|
|
|
|
|
- `url` <[string]> Script URL
|
|
|
|
|
|
- `scriptId` <[string]> Script ID
|
|
|
|
|
|
- `source` <[string]> Script content, if applicable.
|
|
|
|
|
|
- `functions` <[Array]<[Object]>> V8-specific coverage format.
|
|
|
|
|
|
- `functionName` <[string]>
|
|
|
|
|
|
- `isBlockCoverage` <[boolean]>
|
|
|
|
|
|
- `ranges` <[Array]<[Object]>>
|
|
|
|
|
|
- `count` <[number]>
|
|
|
|
|
|
- `startOffset` <[number]>
|
|
|
|
|
|
- `endOffset` <[number]>
|
|
|
|
|
|
|
|
|
|
|
|
> **NOTE** JavaScript Coverage doesn't include anonymous scripts by default. However, scripts with sourceURLs are
|
|
|
|
|
|
reported.
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: CDPSession
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
|
|
|
|
|
|
|
|
|
|
|
The `CDPSession` instances are used to talk raw Chrome Devtools Protocol:
|
|
|
|
|
|
* protocol methods can be called with `session.send` method.
|
|
|
|
|
|
* protocol events can be subscribed to with `session.on` method.
|
|
|
|
|
|
|
|
|
|
|
|
Useful links:
|
2020-12-05 03:05:35 +01:00
|
|
|
|
* Documentation on DevTools Protocol can be found here:
|
|
|
|
|
|
[DevTools Protocol Viewer](https://chromedevtools.github.io/devtools-protocol/).
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* Getting Started with DevTools Protocol: https://github.com/aslushnikov/getting-started-with-cdp/blob/master/README.md
|
|
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
|
const client = await page.context().newCDPSession(page);
|
|
|
|
|
|
await client.send('Animation.enable');
|
|
|
|
|
|
client.on('Animation.animationCreated', () => console.log('Animation created!'));
|
|
|
|
|
|
const response = await client.send('Animation.getPlaybackRate');
|
|
|
|
|
|
console.log('playback rate is ' + response.playbackRate);
|
|
|
|
|
|
await client.send('Animation.setPlaybackRate', {
|
|
|
|
|
|
playbackRate: response.playbackRate / 2
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: CDPSession.detach
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]>
|
|
|
|
|
|
|
2020-12-04 03:05:36 +01:00
|
|
|
|
Detaches the CDPSession from the target. Once detached, the CDPSession object won't emit any events and can't be used to
|
|
|
|
|
|
send messages.
|
2020-12-02 22:50:10 +01:00
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
## method: CDPSession.send
|
2020-12-02 22:50:10 +01:00
|
|
|
|
- returns: <[Promise]<[Object]>>
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
### param: CDPSession.send.method
|
|
|
|
|
|
- `method` <[string]>
|
|
|
|
|
|
|
|
|
|
|
|
protocol method name
|
|
|
|
|
|
|
|
|
|
|
|
### param: CDPSession.send.params
|
|
|
|
|
|
- `params` <[Object]>
|
|
|
|
|
|
|
|
|
|
|
|
Optional method parameters
|
|
|
|
|
|
|
|
|
|
|
|
# class: FirefoxBrowser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [Browser]
|
|
|
|
|
|
|
|
|
|
|
|
Firefox browser instance does not expose Firefox-specific features.
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc-extends-Browser -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
|
|
|
|
|
|
2020-12-05 03:05:35 +01:00
|
|
|
|
# class: WebKitBrowser
|
2020-12-02 22:50:10 +01:00
|
|
|
|
* extends: [Browser]
|
|
|
|
|
|
|
|
|
|
|
|
WebKit browser instance does not expose WebKit-specific features.
|
|
|
|
|
|
|
|
|
|
|
|
<!-- GEN:toc-extends-Browser -->
|
|
|
|
|
|
<!-- GEN:stop -->
|
2020-12-04 03:05:36 +01:00
|
|
|
|
|