-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: add event listener guide (#5881)
- Loading branch information
Showing
1 changed file
with
165 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
--- | ||
id: events | ||
title: "Events" | ||
--- | ||
|
||
Playwright allows listening to various types of events happening in the browser, such | ||
as network requests, creation of child pages, dedicated workers etc. There are several | ||
ways to subscribe to such events: | ||
|
||
<!-- TOC --> | ||
|
||
## Waiting for event | ||
|
||
There is a number of methods which wait for a particular condition or an event happening | ||
in the page. They are usually the preferred choice. Here is a few examples: | ||
|
||
Waiting for a request with a specified url: | ||
|
||
```js | ||
const [request] = await Promise.all([ | ||
page.waitForRequest('**/*logo*.png'), | ||
page.goto('https://wikipedia.org') | ||
]); | ||
console.log(request.url()); | ||
``` | ||
|
||
```java | ||
// The callback lambda defines scope of the code that is expected to | ||
// trigger request. | ||
Request request = page.waitForRequest("**/*logo*.png", () -> { | ||
page.navigate("https://wikipedia.org"); | ||
}); | ||
System.out.println(request.url()); | ||
``` | ||
|
||
```python async | ||
async with page.expect_request("**/*logo*.png") as first: | ||
await page.goto("https://wikipedia.org") | ||
first_request = await first.value | ||
print(first_request.url) | ||
``` | ||
|
||
```python sync | ||
with page.expect_request("**/*logo*.png") as first: | ||
page.goto("https://wikipedia.org") | ||
print(first.value.url) | ||
``` | ||
|
||
Waiting for popup window: | ||
|
||
```js | ||
const [popup] = await Promise.all([ | ||
page.waitForEvent('popup'), | ||
page.evaluate('window.open()') | ||
]); | ||
await popup.goto('https://wikipedia.org'); | ||
``` | ||
|
||
```java | ||
// The callback lambda defines scope of the code that is expected to | ||
// create popup window. | ||
Page popup = page.waitForPopup(() -> { | ||
page.evaluate("window.open()"); | ||
}); | ||
popup.navigate("https://wikipedia.org"); | ||
``` | ||
|
||
```python async | ||
async with page.expect_popup() as popup: | ||
await page.evaluate("window.open()") | ||
child_page = await popup.value | ||
await child_page.goto("https://wikipedia.org") | ||
``` | ||
|
||
```python sync | ||
with page.expect_popup() as popup: | ||
page.evaluate("window.open()") | ||
popup.value.goto("https://wikipedia.org") | ||
``` | ||
|
||
## Adding/removing event listener | ||
|
||
Playwright supports traditional language mechanisms to subscribe and unsubscribe from events: | ||
|
||
```js | ||
page.on('request', request => console.log(`Request sent: ${request.url()}`)); | ||
const listener = request => console.log(`Request finished: ${request.url()}`); | ||
page.on('requestfinished', listener); | ||
await page.goto('https://wikipedia.org'); | ||
|
||
page.off('requestfinished', listener); | ||
await page.goto('https://www.openstreetmap.org/'); | ||
``` | ||
|
||
```java | ||
page.onRequest(request -> System.out.println("Request sent: " + request.url())); | ||
Consumer<Request> listener = request -> System.out.println("Request finished: " + request.url()); | ||
page.onRequestFinished(listener); | ||
page.navigate("https://wikipedia.org"); | ||
|
||
// Remove previously added listener, each on* method has corresponding off* | ||
page.offRequestFinished(listener); | ||
page.navigate("https://www.openstreetmap.org/"); | ||
``` | ||
|
||
```python async | ||
def print_request_sent(request): | ||
print("Request sent: " + request.url) | ||
|
||
def print_request_finished(request): | ||
print("Request finished: " + request.url) | ||
|
||
page.on("request", print_request_sent) | ||
page.on("requestfinished", print_request_finished) | ||
await page.goto("https://wikipedia.org") | ||
|
||
page.remove_listener("requestfinished", print_request_finished) | ||
await page.goto("https://www.openstreetmap.org/") | ||
``` | ||
|
||
```python sync | ||
def print_request_sent(request): | ||
print("Request sent: " + request.url) | ||
|
||
def print_request_finished(request): | ||
print("Request finished: " + request.url) | ||
|
||
page.on("request", print_request_sent) | ||
page.on("requestfinished", print_request_finished) | ||
page.goto("https://wikipedia.org") | ||
|
||
page.remove_listener("requestfinished", print_request_finished) | ||
page.goto("https://www.openstreetmap.org/") | ||
``` | ||
|
||
## Adding one-off listeners | ||
|
||
If only next event needs to be handled, there is a convinience API for some of the events: | ||
|
||
```js | ||
page.once('dialog', dialog => dialog.accept("2021")); | ||
await page.evaluate("prompt('Enter a number:')"); | ||
``` | ||
|
||
```java | ||
page.onceDialog(dialog -> dialog.accept("2021")); | ||
page.evaluate("prompt('Enter a number:')"); | ||
``` | ||
|
||
```python async | ||
page.once("dialog", lambda dialog: dialog.accept("2021")) | ||
await page.evaluate("prompt('Enter a number:')") | ||
``` | ||
|
||
```python sync | ||
page.once("dialog", lambda dialog: dialog.accept("2021")) | ||
page.evaluate("prompt('Enter a number:')") | ||
``` | ||
|
||
### API reference | ||
|
||
- [Browser] | ||
- [BrowserContext] | ||
- [Page] | ||
- [Worker] |