Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: add new doc for multi-page scenarios #2737

Merged
merged 5 commits into from
Jun 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@
- [Loading a popup](./loading.md#loading-a-popup)
- [Client-side redirects](./loading.md#unusual-client-side-redirects)
- [Navigation after a timeout](./loading.md#click-triggers-navigation-after-a-timeout)
1. [Multi-page scenarios](./multi-pages.md)
- [Multiple contexts](./multi-pages.md#multiple-contexts)
- [Multiple pages](./multi-pages.md#multiple-pages)
- [Handling new pages](./multi-pages.md#handling-new-pages)
- [Handling popups](./multi-pages.md#handling-popups)
1. [Test runners](./test-runners.md)
- [Jest / Jasmine](./test-runners.md#jest--jasmine)
- [AVA](./test-runners.md#ava)
Expand Down
1 change: 1 addition & 0 deletions docs/core-concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ const context = await browser.newContext({
#### API reference

- [class `BrowserContext`](./api.md#class-browsercontext)
- [browser.newContext([options])](./api.md#browsernewcontextoptions)

<br/>

Expand Down
117 changes: 117 additions & 0 deletions docs/multi-pages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Multi-page scenarios

Playwright can automate scenarios that span multiple browser contexts or multiple
tabs in a browser window.

<!-- GEN:toc-top-level -->
- [Multiple contexts](#multiple-contexts)
- [Multiple pages](#multiple-pages)
- [Handling new pages](#handling-new-pages)
- [Handling popups](#handling-popups)
<!-- GEN:stop -->

## Multiple contexts

[Browser contexts](core-concepts.md#browser-contexts) are isolated environments
on a single browser instance. Playwright can create multiple browser contexts
within a single scenario. This is useful when you want to test for
multi-user functionality, like chat.

```js
const { chromium } = require('playwright');

// Create a Chromium browser instance
const browser = await chromium.launch();

// Create two isolated browser contexts
const userContext = await browser.newContext();
const adminContext = await browser.newContext();

// Load user and admin cookies
await userContext.addCookies(userCookies);
await adminContext.addCookies(adminCookies);
```

#### API reference

- [class `BrowserContext`](./api.md#class-browsercontext)
- [`browser.newContext([options])`](./api.md#browsernewcontextoptions)
- [`browserContext.addCookies(cookies)`](api.md#browsercontextaddcookiescookies)

## Multiple pages

Each browser context can host multiple pages (tabs).

* Each page behaves like a focused, active page. Bringing the page to front
is not required.
* Pages inside a context respect context-level emulation, like viewport sizes,
custom network routes or browser locale.

```js
// Create two pages
const pageOne = await context.newPage();
const pageTwo = await context.newPage();

// Get pages of a brower context
const allPages = context.pages();
```

#### API reference

- [class `Page`](./api.md#class-page)
- [`browserContext.newPage()`](./api.md#browsercontextnewpage)
- [`browserContext.pages()`](./api.md#browsercontextpages)

## Handling new pages

The `page` event on browser contexts can be used to get new pages that are
created in the context. This can be used to handle new pages opened by
`target="_blank"` links.

```js
// Get page after a specific action (e.g. clicking a link)
const [newPage] = await Promise.all([
context.waitForEvent('page'),
page.evaluate(() => window.open('https://google.com', '_blank'))
])
await newPage.waitForLoadState();
console.log(await newPage.title());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You'll need at least domcontentloaded before accessing title, but preferably load for everything else.

await newPage.waitForLoadState('domcontentloaded');

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. Updated to use newPage.waitForLoadState() since that covers more scenarios for the audience of a guide like this.


// Get all new pages (including popups) in the context
context.on('page', async page => {
await page.waitForLoadState();
await page.title();
})
```

#### API reference

- [event: 'page'](./api.md#event-page)

## Handling popups

If the page opens a pop-up, you can get a reference to it by listening to the
`popup` event on the page.

This event is emitted in addition to the `browserContext.on('page')` event, but
only for popups relevant to this page.

```js
// Get popup after a specific action (e.g., click)
const [popup] = await Promise.all([
page.waitForEvent('popup'),
page.click('#open')
]);
await popup.waitForLoadState();
await popup.title();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use popup.waitForLoadState()


// Get all popups when they open
page.on('popup', async popup => {
await popup.waitForLoadState();
await popup.title();
})
```

#### API reference

- [event: 'popup'](./api.md#event-popup)