docs(dotnet): examples for dialogs, fixes (#6599)

This commit is contained in:
Pavel Feldman 2021-05-15 14:02:07 -07:00 committed by GitHub
parent 52658cf507
commit fd1e62b8c5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 90 additions and 89 deletions

View file

@ -25,7 +25,7 @@ BrowserContext context = browser.newContext();
// Create a new page inside context. // Create a new page inside context.
Page page = context.newPage(); Page page = context.newPage();
page.navigate("https://example.com"); page.navigate("https://example.com");
// Dispose context once it"s no longer needed. // Dispose context once it is no longer needed.
context.close(); context.close();
``` ```
@ -35,7 +35,7 @@ context = await browser.new_context()
# create a new page inside context. # create a new page inside context.
page = await context.new_page() page = await context.new_page()
await page.goto("https://example.com") await page.goto("https://example.com")
# dispose context once it"s no longer needed. # dispose context once it is no longer needed.
await context.close() await context.close()
``` ```
@ -45,7 +45,7 @@ context = browser.new_context()
# create a new page inside context. # create a new page inside context.
page = context.new_page() page = context.new_page()
page.goto("https://example.com") page.goto("https://example.com")
# dispose context once it"s no longer needed. # dispose context once it is no longer needed.
context.close() context.close()
``` ```
@ -57,7 +57,7 @@ var context = await browser.NewContextAsync();
// Create a new page inside context. // Create a new page inside context.
var page = await context.NewPageAsync(); var page = await context.NewPageAsync();
await page.GotoAsync("https://bing.com"); await page.GotoAsync("https://bing.com");
// Dispose context once it"s no longer needed. // Dispose context once it is no longer needed.
await context.CloseAsync(); await context.CloseAsync();
``` ```
@ -133,9 +133,9 @@ print(page.evaluate("location.href"))
```csharp ```csharp
var popupTask = context.WaitForPageAsync(); var popupTask = context.WaitForPageAsync();
await Task.WhenAll(popupTask, page.ClickAsync("a")); await page.ClickAsync("a");
var popup = await popupTask;
Console.WriteLine(popupTask.Result.EvaluateAsync<string>("location.href")); Console.WriteLine(await popup.EvaluateAsync<string>("location.href"));
``` ```
:::note :::note
@ -1226,8 +1226,9 @@ page = event_info.value
``` ```
```csharp ```csharp
var t = page.WaitForEventAsync("page"); var waitForPageEvent = context.WaitForPageAsync();
await Task.WhenAll(t, page.ClickAsync("button")); await page.ClickAsync("button");
var page = await waitForPageEvent;
``` ```
### param: BrowserContext.waitForEvent.event ### param: BrowserContext.waitForEvent.event

View file

@ -49,9 +49,10 @@ path = download.path()
``` ```
```csharp ```csharp
var downloadTask = page.WaitForDownloadAsync(); var waitForDownloadTask = page.WaitForDownloadAsync();
await Task.WhenAll(downloadTask, page.ClickAsync("#downloadButton")); await page.ClickAsync("#downloadButton");
Console.WriteLine(await downloadTask.Result.PathAsync()); var download = await waitForDownloadTask;
Console.WriteLine(await download.PathAsync());
``` ```
:::note :::note

View file

@ -30,9 +30,10 @@ file_chooser.set_files("myfile.pdf")
``` ```
```csharp ```csharp
var fileChooserTask = page.WaitForFileChooserAsync(); var waitForFileChooserTask = page.WaitForFileChooserAsync();
await Task.WhenAll(fileChooserTask, page.ClickAsync("upload")); await page.ClickAsync("upload");
await fileChooserTask.Result.SetFilesAsync("temp.txt"); var fileChooser = await waitForFileChooserTask;
await fileChooser.SetFilesAsync("temp.txt");
``` ```
## method: FileChooser.element ## method: FileChooser.element

View file

@ -1424,8 +1424,10 @@ with frame.expect_navigation():
``` ```
```csharp ```csharp
Task.WaitAll(frame.WaitForNavigationAsync(), await Task.WhenAll(
frame.ClickAsync("a.delayed-navigation")); // clicking the link will indirectly cause a navigation frame.WaitForNavigationAsync(),
// clicking the link will indirectly cause a navigation
frame.ClickAsync("a.delayed-navigation"));
// Resolves after navigation has finished // Resolves after navigation has finished
``` ```

View file

@ -397,9 +397,10 @@ print(popup.evaluate("location.href"))
``` ```
```csharp ```csharp
var popupTask = page.WaitForPopupAsync(); var waitForPopupTask = page.WaitForPopupAsync();
await Task.WhenAll(popupTask, page.EvaluateAsync("() => window.open('https://microsoft.com')")); await page.EvaluateAsync("() => window.open('https://microsoft.com')");
Console.WriteLine(await popupTask.Result.EvaluateAsync<string>("location.href")); var popup = await waitForPopupTask;
Console.WriteLine(await popup.EvaluateAsync<string>("location.href"));
``` ```
:::note :::note
@ -2965,8 +2966,8 @@ frame = event_info.value
```csharp ```csharp
var waitTask = page.WaitForEventAsync(PageEvent.FrameNavigated); var waitTask = page.WaitForEventAsync(PageEvent.FrameNavigated);
await Task.WhenAll(waitTask, page.ClickAsync("button")); await page.ClickAsync("button");
var frame = waitTask.Result; var frame = await waitTask;
``` ```
### param: Page.waitForEvent.event = %%-wait-for-event-event-%% ### param: Page.waitForEvent.event = %%-wait-for-event-event-%%
@ -3194,9 +3195,10 @@ print(popup.title()) # popup is ready to use.
```csharp ```csharp
var popupTask = page.WaitForPopupAsync(); var popupTask = page.WaitForPopupAsync();
await Task.WhenAll(popupTask, page.ClickAsync("button")); // click triggers the popup/ await page.ClickAsync("button"); // click triggers the popup/
await popupTask.Result.WaitForLoadStateAsync(LoadState.DOMContentLoaded); var popup = await popupTask;
Console.WriteLine(await popupTask.Result.TitleAsync()); // popup is ready to use. await popup.WaitForLoadStateAsync(LoadState.DOMContentLoaded);
Console.WriteLine(await popup.TitleAsync()); // popup is ready to use.
``` ```
Shortcut for main frame's [`method: Frame.waitForLoadState`]. Shortcut for main frame's [`method: Frame.waitForLoadState`].

View file

@ -239,9 +239,10 @@ print(request.timing)
``` ```
```csharp ```csharp
var requestFinishedTask = page.WaitForEventAsync(PageEvent.RequestFinished); var waitForEventTask = page.WaitForEventAsync(PageEvent.RequestFinished);
await Task.WhenAll(requestFinishedTask, page.GotoAsync("https://www.microsoft.com")); await page.GotoAsync("https://www.microsoft.com");
Console.WriteLine(requestFinishedTask.Result.Timing.ResponseEnd); var request = await waitForEventTask;
Console.WriteLine(request.Timing.ResponseEnd);
``` ```
## method: Request.url ## method: Request.url

View file

@ -31,6 +31,11 @@ page.on("dialog", lambda dialog: dialog.accept())
page.click("button") page.click("button")
``` ```
```csharp
page.Dialog += (_, dialog) => dialog.AcceptAsync();
await page.ClickAsync("button");
```
:::note :::note
[`event: Page.dialog`] listener **must handle** the dialog. Otherwise your action will stall, be it [`method: Page.click`], [`method: Page.evaluate`] or any other. That's because dialogs in Web are modal and block further page execution until they are handled. [`event: Page.dialog`] listener **must handle** the dialog. Otherwise your action will stall, be it [`method: Page.click`], [`method: Page.evaluate`] or any other. That's because dialogs in Web are modal and block further page execution until they are handled.
::: :::
@ -61,6 +66,11 @@ page.on("dialog", lambda dialog: print(dialog.message))
page.click("button") # Will hang here page.click("button") # Will hang here
``` ```
```csharp
page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.ClickAsync("button"); // Will hang here
```
:::note :::note
If there is no listener for [`event: Page.dialog`], all dialogs are automatically dismissed. If there is no listener for [`event: Page.dialog`], all dialogs are automatically dismissed.
::: :::
@ -110,3 +120,12 @@ def handle_dialog(dialog):
page.on('dialog', lambda: handle_dialog) page.on('dialog', lambda: handle_dialog)
page.close(run_before_unload=True) page.close(run_before_unload=True)
``` ```
```csharp
page.Dialog += (_, dialog) =>
{
Assert.Equal("beforeunload", dialog.Type);
dialog.DismissAsync();
};
await page.CloseAsync(runBeforeUnload: true);
```

View file

@ -50,8 +50,6 @@ print(first.value.url)
``` ```
```csharp ```csharp
// The callback lambda defines scope of the code that is expected to
// trigger request.
var waitForRequestTask = page.WaitForRequestAsync("**/*logo*.png"); var waitForRequestTask = page.WaitForRequestAsync("**/*logo*.png");
await page.GotoAsync("https://wikipedia.org"); await page.GotoAsync("https://wikipedia.org");
var request = await waitForRequestTask; var request = await waitForRequestTask;
@ -94,8 +92,6 @@ popup.value.goto("https://wikipedia.org")
``` ```
```csharp ```csharp
// The callback lambda defines scope of the code that is expected to
// create popup window.
var waitForPopupTask = page.WaitForPopupAsync(); var waitForPopupTask = page.WaitForPopupAsync();
await page.EvaluateAsync("window.open()"); await page.EvaluateAsync("window.open()");
var popup = await waitForPopupTask; var popup = await waitForPopupTask;
@ -160,18 +156,20 @@ page.goto("https://www.openstreetmap.org/")
```csharp ```csharp
page.Request += (_, request) => Console.WriteLine("Request sent: " + request.Url); page.Request += (_, request) => Console.WriteLine("Request sent: " + request.Url);
EventHandler<IRequest> listener = (_, request) => { void listener(object sender, IRequest request)
Console.WriteLine("Request finished: " + request.Url); {
Console.WriteLine("Request finished: " + request.Url);
}; };
page.RequestFinished += listener; page.RequestFinished += listener;
await page.GotoAsync("https://wikipedia.org"); await page.GotoAsync("https://wikipedia.org");
// Remove previously added listener, each on* method has corresponding off* // Remove previously added listener.
page.RequestFinished -= listener; page.RequestFinished -= listener;
await page.GotoAsync("https://www.openstreetmap.org/"); await page.GotoAsync("https://www.openstreetmap.org/");
``` ```
## Adding one-off listeners ## Adding one-off listeners
* langs: js, python, java
If certain event needs to be handled once, there is a convenience API for that: If certain event needs to be handled once, there is a convenience API for that:
@ -195,11 +193,6 @@ page.once("dialog", lambda dialog: dialog.accept("2021"))
page.evaluate("prompt('Enter a number:')") page.evaluate("prompt('Enter a number:')")
``` ```
```csharp
page.Dialog += (_, dialog) => dialog.AcceptAsync("2021");
await page.EvaluateAsync("prompt('Enter a number:')");
```
### API reference ### API reference
- [Browser] - [Browser]

View file

@ -193,7 +193,7 @@ arg.put("myArray", myArrayHandle);
arg.put("newElement", 2); arg.put("newElement", 2);
page.evaluate("arg => arg.myArray.add(arg.newElement)", arg); page.evaluate("arg => arg.myArray.add(arg.newElement)", arg);
// Release the object when it"s no longer needed. // Release the object when it is no longer needed.
myArrayHandle.dispose(); myArrayHandle.dispose();
``` ```
@ -239,10 +239,10 @@ my_array_handle.dispose()
```csharp ```csharp
// Create new array in page. // Create new array in page.
var myArrayHandle = await page.EvaluateHandleAsync("() => {\n" + var myArrayHandle = await page.EvaluateHandleAsync(@"() => {
" window.myArray = [1];\n" + window.myArray = [1];
" return myArray;\n" + return myArray;
"}"); }");
// Get the length of the array. // Get the length of the array.
var length = await page.EvaluateAsync<int>("a => a.length", myArrayHandle); var length = await page.EvaluateAsync<int>("a => a.length", myArrayHandle);
@ -251,7 +251,7 @@ var length = await page.EvaluateAsync<int>("a => a.length", myArrayHandle);
await page.EvaluateAsync("arg => arg.myArray.add(arg.newElement)", await page.EvaluateAsync("arg => arg.myArray.add(arg.newElement)",
new { myArray = myArrayHandle, newElement = 2 }); new { myArray = myArrayHandle, newElement = 2 });
// Release the object when it"s no longer needed. // Release the object when it is no longer needed.
await myArrayHandle.DisposeAsync(); await myArrayHandle.DisposeAsync();
``` ```

View file

@ -751,11 +751,9 @@ file_chooser.set_files("myfile.pdf")
```csharp ```csharp
var waitForChooserTask = page.WaitForFileChooserAsync(); var waitForChooserTask = page.WaitForFileChooserAsync();
await Task.WhenAll( await page.ClickAsync("upload");
waitForChooserTask, var fileChooser = await waitForChooserTask;
page.ClickAsync("upload") await fileChooser.SetFilesAsync("myfile.pdf");
);
await waitForChooserTask.Result.SetFilesAsync("myfile.pdf");
``` ```
### API reference ### API reference

View file

@ -210,11 +210,9 @@ print(new_page.title())
```csharp ```csharp
// Get page after a specific action (e.g. clicking a link) // Get page after a specific action (e.g. clicking a link)
var waitForPageTask = context.WaitForPageAsync(); var waitForPageTask = context.WaitForPageAsync();
await Task.WhenAll( await page.ClickAsync("a[target='_blank']");
waitForPageTask, var newPage = await waitForPageTask;
page.ClickAsync("a[target='_blank']") await page.WaitForLoadStateAsync();
);
await waitForPageTask.Result.WaitForLoadStateAsync();
Console.WriteLine(await newPage.TitleAsync()); Console.WriteLine(await newPage.TitleAsync());
``` ```
@ -312,10 +310,9 @@ print(popup.title())
```csharp ```csharp
// Get popup after a specific action (e.g., click) // Get popup after a specific action (e.g., click)
var newPage = await Task.WhenAll( var waitForPopupTask = page.WaitForPopupAsync();
page.WaitForPopupAsync(), await page.ClickAsync("#open");
page.ClickAsync("#open") var newPage = await waitForPopupTask;
);
await newPage.WaitForLoadStateAsync(); await newPage.WaitForLoadStateAsync();
Console.WriteLine(await newPage.TitleAsync()); Console.WriteLine(await newPage.TitleAsync());
``` ```

View file

@ -435,11 +435,9 @@ popup.wait_for_load_state("load")
```csharp ```csharp
var waitForPopupTask = page.WaitForPopupAsync(); var waitForPopupTask = page.WaitForPopupAsync();
await Task.WhenAll( await page.ClickAsync("a[target='_blank']"); // Opens popup
waitForPopupTask, var popup = await waitForPopupTask;
page.ClickAsync("a[target='_blank']") // Opens popup popup.WaitForLoadStateAsync(LoadState.Load);
);
await waitForPopupTask.Result.WaitForLoadStateAsync(LoadState.Load);
``` ```
### API reference ### API reference

View file

@ -282,11 +282,8 @@ response = response_info.value
```csharp ```csharp
// Use a glob URL pattern // Use a glob URL pattern
var waitForResponseTask = page.WaitForResponseAsync("**/api/fetch_data"); var waitForResponseTask = page.WaitForResponseAsync("**/api/fetch_data");
await Task.WhenAll( await page.ClickAsync("button#update");
waitForResponseTask, var response = await waitForResponseTask;
page.ClickAsync("button#update")
);
var response = waitForResponseTask.Result;
``` ```
#### Variations #### Variations
@ -344,19 +341,13 @@ response = response_info.value
```csharp ```csharp
// Use a regular expression // Use a regular expression
var waitForResponseTask = page.WaitForResponseAsync(new Regex("\\.jpeg$")); var waitForResponseTask = page.WaitForResponseAsync(new Regex("\\.jpeg$"));
await Task.WhenAll( await page.ClickAsync("button#update");
waitForResponseTask, var response = await waitForResponseTask;
page.ClickAsync("button#update")
);
var response = waitForResponseTask.Result;
// Use a predicate taking a Response object // Use a predicate taking a Response object
var waitForResponseTask = page.WaitForResponseAsync(r => r.Url.Contains(token)); var waitForResponseTask = page.WaitForResponseAsync(r => r.Url.Contains(token));
await Task.WhenAll( await page.ClickAsync("button#update");
waitForResponseTask, var response = await waitForResponseTask;
page.ClickAsync("button#update")
);
var response = waitForResponseTask.Result;
``` ```
### API reference ### API reference

View file

@ -103,14 +103,11 @@ page.Console += (_, msg) =>
// Get the next System.out.println // Get the next System.out.println
var waitForMessageTask = page.WaitForConsoleMessageAsync(); var waitForMessageTask = page.WaitForConsoleMessageAsync();
await Task.WhenAll( await page.EvaluateAsync("console.log('hello', 42, { foo: 'bar' });");
waitForMessageTask, var message = await waitForMessageTask;
page.EvaluateAsync("console.log('hello', 42, { foo: 'bar' });")
);
// Deconstruct console.log arguments // Deconstruct console.log arguments
await waitForMessageTask.Result.Args.ElementAt(0).JsonValueAsync<string>(); // hello await message.Args.ElementAt(0).JsonValueAsync<string>(); // hello
await waitForMessageTask.Result.Args.ElementAt(1).JsonValueAsync<int>(); // 42 await message.Args.ElementAt(1).JsonValueAsync<int>(); // 42
``` ```
### API reference ### API reference
@ -248,8 +245,8 @@ popup = popup_info.value
```csharp ```csharp
var waitForPopupTask = page.WaitForPopupAsync(); var waitForPopupTask = page.WaitForPopupAsync();
await Task.WhenAll(waitForPopupTask, page.ClickAsync("#open")); await page.ClickAsync("#open");
var popup = waitForPopupTask.Result; var popup = await waitForPopupTask;
``` ```
### API reference ### API reference