docs(dotnet): First part/pass for guides (#6583)
This commit is contained in:
parent
2f9b057525
commit
0aa9e06370
|
|
@ -30,6 +30,11 @@ content = page.text_content("nav:first-child")
|
||||||
assert content == "home"
|
assert content == "home"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var content = await page.TextContentAsync("nav:first-child");
|
||||||
|
Assert.Equals("home", content);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.textContent`]
|
- [`method: Page.textContent`]
|
||||||
- [`method: ElementHandle.textContent`]
|
- [`method: ElementHandle.textContent`]
|
||||||
|
|
@ -56,6 +61,11 @@ text = page.inner_text(".selected")
|
||||||
assert text == "value"
|
assert text == "value"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var content = await page.InnerTextAsync(".selected");
|
||||||
|
Assert.Equals("value", content);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.innerText`]
|
- [`method: Page.innerText`]
|
||||||
- [`method: ElementHandle.innerText`]
|
- [`method: ElementHandle.innerText`]
|
||||||
|
|
@ -82,6 +92,11 @@ checked = page.get_attribute("input", "alt")
|
||||||
assert alt == "Text"
|
assert alt == "Text"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var value = await page.GetAttributeAsync("input", "alt");
|
||||||
|
Assert.Equals("Text", value);
|
||||||
|
```
|
||||||
|
|
||||||
## Checkbox state
|
## Checkbox state
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
|
@ -104,6 +119,11 @@ checked = page.is_checked("input")
|
||||||
assert checked
|
assert checked
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var checked = await page.IsCheckedAsync("input");
|
||||||
|
Assert.True(checked);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.isChecked`]
|
- [`method: Page.isChecked`]
|
||||||
- [`method: ElementHandle.isChecked`]
|
- [`method: ElementHandle.isChecked`]
|
||||||
|
|
@ -130,6 +150,11 @@ content = page.eval_on_selector("nav:first-child", "e => e.textContent")
|
||||||
assert content == "home"
|
assert content == "home"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var content = await page.EvalOnSelectorAsync("nav:first-child", "e => e.textContent");
|
||||||
|
Assert.Equals("home", content);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.evalOnSelector`]
|
- [`method: Page.evalOnSelector`]
|
||||||
- [`method: JSHandle.evaluate`]
|
- [`method: JSHandle.evaluate`]
|
||||||
|
|
@ -156,6 +181,11 @@ html = page.inner_html("div.result")
|
||||||
assert html == "<p>Result</p>"
|
assert html == "<p>Result</p>"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var html = await page.InnerHTMLAsync("div.result");
|
||||||
|
Assert.Equals(html, "<p>Result</p>");
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.innerHTML`]
|
- [`method: Page.innerHTML`]
|
||||||
- [`method: ElementHandle.innerHTML`]
|
- [`method: ElementHandle.innerHTML`]
|
||||||
|
|
@ -182,6 +212,11 @@ visible = page.is_visible("input")
|
||||||
assert visible
|
assert visible
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var visibility = await page.IsVisibleAsync("input");
|
||||||
|
Assert.True(visibility);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.isVisible`]
|
- [`method: Page.isVisible`]
|
||||||
- [`method: ElementHandle.isVisible`]
|
- [`method: ElementHandle.isVisible`]
|
||||||
|
|
@ -208,6 +243,11 @@ enabled = page.is_enabled("input")
|
||||||
assert enabled
|
assert enabled
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var enabled = await page.IsEnabledAsync("input");
|
||||||
|
Assert.True(enabled);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.isEnabled`]
|
- [`method: Page.isEnabled`]
|
||||||
- [`method: ElementHandle.isEnabled`]
|
- [`method: ElementHandle.isEnabled`]
|
||||||
|
|
@ -294,6 +334,25 @@ length = page.eval_on_selector_all('li.selected', '(items) => items.length')
|
||||||
assert length == 3
|
assert length == 3
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Assert local storage value
|
||||||
|
var userId = await page.EvaluateAsync<string>("() => window.localStorage.getItem('userId')");
|
||||||
|
Assert.NotNull(userId);
|
||||||
|
|
||||||
|
// Assert value for input element
|
||||||
|
await page.WaitForSelectorAsync("#search");
|
||||||
|
var value = await page.EvalOnSelectorAsync("#search", "el => el.value");
|
||||||
|
Assert.Equals("query", value);
|
||||||
|
|
||||||
|
// Assert computed style
|
||||||
|
var fontSize = await page.EvalOnSelectorAsync<string>("div", "el => window.getComputedStyle(el).fontSize");
|
||||||
|
Assert.Equals("16px", fontSize);
|
||||||
|
|
||||||
|
// Assert list length
|
||||||
|
var length = await page.EvalOnSelectorAllAsync<int>("li.selected", "items => items.length");
|
||||||
|
Assert.Equals(3, length);
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: Page.evaluate`]
|
- [`method: Page.evaluate`]
|
||||||
- [`method: Page.evalOnSelector`]
|
- [`method: Page.evalOnSelector`]
|
||||||
|
|
|
||||||
|
|
@ -224,6 +224,23 @@ context.add_init_script(storage => {
|
||||||
}, session_storage)
|
}, session_storage)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Get session storage and store as env variable
|
||||||
|
var sessionStorage = await page.EvaluateAsync<string>("() => JSON.stringify(sessionStorage");
|
||||||
|
Environment.SetEnvironmentVariable("SESSION_STORAGE", sessionStorage);
|
||||||
|
|
||||||
|
// Set session storage in a new context
|
||||||
|
var loadedSessionStorage = Environment.GetEnvironmentVariable("SESSION_STORAGE");
|
||||||
|
await context.AddInitScriptAsync(@"(storage => {
|
||||||
|
if (window.location.hostname === 'example.com') {
|
||||||
|
const entries = JSON.parse(storage);
|
||||||
|
Object.keys(entries).forEach(key => {
|
||||||
|
window.sessionStorage.setItem(key, entries[key]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})(" + loadedSessionStorage + ")");
|
||||||
|
```
|
||||||
|
|
||||||
### API reference
|
### API reference
|
||||||
- [`method: BrowserContext.storageState`]
|
- [`method: BrowserContext.storageState`]
|
||||||
- [`method: Browser.newContext`]
|
- [`method: Browser.newContext`]
|
||||||
|
|
@ -290,6 +307,20 @@ with sync_playwright() as p:
|
||||||
# Execute login steps manually in the browser window
|
# Execute login steps manually in the browser window
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using Microsoft.Playwright;
|
||||||
|
|
||||||
|
class Guides
|
||||||
|
{
|
||||||
|
public async void Main()
|
||||||
|
{
|
||||||
|
using var playwright = await Playwright.CreateAsync();
|
||||||
|
var chromium = playwright.Chromium;
|
||||||
|
var context = chromium.LaunchPersistentContextAsync(@"C:\path\to\directory\", headless: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Lifecycle
|
### Lifecycle
|
||||||
|
|
||||||
1. Create a user data directory on disk
|
1. Create a user data directory on disk
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,10 @@ Suggested configuration
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
await playwright.Chromium.LaunchAsync(args: new[] { "--disable-dev-shm-usage" });
|
||||||
|
```
|
||||||
|
|
||||||
This will write shared memory files into `/tmp` instead of `/dev/shm`. See
|
This will write shared memory files into `/tmp` instead of `/dev/shm`. See
|
||||||
[crbug.com/736452](https://bugs.chromium.org/p/chromium/issues/detail?id=736452) for more details.
|
[crbug.com/736452](https://bugs.chromium.org/p/chromium/issues/detail?id=736452) for more details.
|
||||||
1. Using `--ipc=host` is also recommended when using Chromium—without it Chromium can run out of memory
|
1. Using `--ipc=host` is also recommended when using Chromium—without it Chromium can run out of memory
|
||||||
|
|
@ -259,6 +263,20 @@ browser = await playwright.chromium.launch(chromiumSandbox=False)
|
||||||
browser = playwright.chromium.launch(chromiumSandbox=False)
|
browser = playwright.chromium.launch(chromiumSandbox=False)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using Microsoft.Playwright;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
class Guides
|
||||||
|
{
|
||||||
|
public async void Main()
|
||||||
|
{
|
||||||
|
using var playwright = await Playwright.CreateAsync();
|
||||||
|
await playwright.Chromium.LaunchAsync(chromiumSandbox: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### GitLab CI
|
### GitLab CI
|
||||||
|
|
||||||
To run Playwright tests on GitLab, use our public Docker image ([see Dockerfile](./docker.md)).
|
To run Playwright tests on GitLab, use our public Docker image ([see Dockerfile](./docker.md)).
|
||||||
|
|
@ -371,6 +389,20 @@ with sync_playwright() as p:
|
||||||
browser = p.chromium.launch(headless=False)
|
browser = p.chromium.launch(headless=False)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using Microsoft.Playwright;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
class Guides
|
||||||
|
{
|
||||||
|
public async void Main()
|
||||||
|
{
|
||||||
|
using var playwright = await Playwright.CreateAsync();
|
||||||
|
await playwright.Chromium.LaunchAsync(headless: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
On Linux agents, headed execution requires [Xvfb](https://en.wikipedia.org/wiki/Xvfb) to be installed. Our [Docker image](./docker.md) and GitHub Action have Xvfb pre-installed. To run browsers in headed mode with Xvfb, add `xvfb-run` before the Node.js command.
|
On Linux agents, headed execution requires [Xvfb](https://en.wikipedia.org/wiki/Xvfb) to be installed. Our [Docker image](./docker.md) and GitHub Action have Xvfb pre-installed. To run browsers in headed mode with Xvfb, add `xvfb-run` before the Node.js command.
|
||||||
|
|
||||||
```sh js
|
```sh js
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue