docs: java snippets for api classes (#5629)
This commit is contained in:
parent
612bb022a5
commit
cb0a890a09
|
|
@ -58,6 +58,11 @@ const snapshot = await page.accessibility.snapshot();
|
||||||
console.log(snapshot);
|
console.log(snapshot);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
String snapshot = page.accessibility().snapshot();
|
||||||
|
System.out.println(snapshot);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
snapshot = await page.accessibility.snapshot()
|
snapshot = await page.accessibility.snapshot()
|
||||||
print(snapshot)
|
print(snapshot)
|
||||||
|
|
@ -86,6 +91,11 @@ function findFocusedNode(node) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// FIXME
|
||||||
|
String snapshot = page.accessibility().snapshot();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
def find_focused_node(node):
|
def find_focused_node(node):
|
||||||
if (node.get("focused"))
|
if (node.get("focused"))
|
||||||
|
|
@ -128,4 +138,4 @@ Prune uninteresting nodes from the tree. Defaults to `true`.
|
||||||
### option: Accessibility.snapshot.root
|
### option: Accessibility.snapshot.root
|
||||||
- `root` <[ElementHandle]>
|
- `root` <[ElementHandle]>
|
||||||
|
|
||||||
The root DOM element for the snapshot. Defaults to the whole page.
|
The root DOM element for the snapshot. Defaults to the whole page.
|
||||||
|
|
@ -14,6 +14,22 @@ const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType firefox = playwright.firefox()
|
||||||
|
Browser browser = firefox.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate('https://example.com');
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -75,6 +91,13 @@ const context = await browser.newContext();
|
||||||
console.log(browser.contexts().length); // prints `1`
|
console.log(browser.contexts().length); // prints `1`
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Browser browser = pw.webkit().launch();
|
||||||
|
System.out.println(browser.contexts().size()); // prints "0"
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
System.out.println(browser.contexts().size()); // prints "1"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
browser = await pw.webkit.launch()
|
browser = await pw.webkit.launch()
|
||||||
print(len(browser.contexts())) # prints `0`
|
print(len(browser.contexts())) # prints `0`
|
||||||
|
|
@ -110,6 +133,15 @@ Creates a new browser context. It won't share cookies/cache with other browser c
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Browser browser = playwright.firefox().launch(); // Or 'chromium' or 'webkit'.
|
||||||
|
// Create a new incognito browser context.
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
// Create a new page in a pristine context.
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.navigate('https://example.com');
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
browser = await playwright.firefox.launch() # or "chromium" or "webkit".
|
browser = await playwright.firefox.launch() # or "chromium" or "webkit".
|
||||||
# create a new incognito browser context.
|
# create a new incognito browser context.
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,16 @@ await page.goto('https://example.com');
|
||||||
await context.close();
|
await context.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Create a new incognito browser context
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
// Create a new page inside context.
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
// Dispose context once it"s no longer needed.
|
||||||
|
context.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# create a new incognito browser context
|
# create a new incognito browser context
|
||||||
context = await browser.new_context()
|
context = await browser.new_context()
|
||||||
|
|
@ -58,11 +68,18 @@ popup with `window.open('http://example.com')`, this event will fire when the ne
|
||||||
done and its response has started loading in the popup.
|
done and its response has started loading in the popup.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const [page] = await Promise.all([
|
const [newPage] = await Promise.all([
|
||||||
context.waitForEvent('page'),
|
context.waitForEvent('page'),
|
||||||
page.click('a[target=_blank]'),
|
page.click('a[target=_blank]'),
|
||||||
]);
|
]);
|
||||||
console.log(await page.evaluate('location.href'));
|
console.log(await newPage.evaluate('location.href'));
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page newPage = context.waitForPage(() -> {
|
||||||
|
page.click("a[target=_blank]");
|
||||||
|
});
|
||||||
|
System.out.println(newPage.evaluate("location.href"));
|
||||||
```
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
|
|
@ -93,6 +110,10 @@ obtained via [`method: BrowserContext.cookies`].
|
||||||
await browserContext.addCookies([cookieObject1, cookieObject2]);
|
await browserContext.addCookies([cookieObject1, cookieObject2]);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
browserContext.addCookies(Arrays.asList(cookieObject1, cookieObject2));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await browser_context.add_cookies([cookie_object1, cookie_object2])
|
await browser_context.add_cookies([cookie_object1, cookie_object2])
|
||||||
```
|
```
|
||||||
|
|
@ -137,6 +158,11 @@ await browserContext.addInitScript({
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// In your playwright script, assuming the preload.js file is in same directory.
|
||||||
|
browserContext.addInitScript(Paths.get("preload.js"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# in your playwright script, assuming the preload.js file is in same directory.
|
# in your playwright script, assuming the preload.js file is in same directory.
|
||||||
await browser_context.add_init_script(path="preload.js")
|
await browser_context.add_init_script(path="preload.js")
|
||||||
|
|
@ -193,6 +219,13 @@ await context.grantPermissions(['clipboard-read']);
|
||||||
context.clearPermissions();
|
context.clearPermissions();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
context.grantPermissions(Arrays.asList("clipboard-read"));
|
||||||
|
// do stuff ..
|
||||||
|
context.clearPermissions();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
context = await browser.new_context()
|
context = await browser.new_context()
|
||||||
await context.grant_permissions(["clipboard-read"])
|
await context.grant_permissions(["clipboard-read"])
|
||||||
|
|
@ -268,6 +301,30 @@ const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit()
|
||||||
|
Browser browser = webkit.launch(new BrowserType.LaunchOptions().withHeadless(false));
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
context.exposeBinding("pageURL", (source, args) -> source.page().url());
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.setContent("<script>\n" +
|
||||||
|
" async function onClick() {\n" +
|
||||||
|
" document.querySelector('div').textContent = await window.pageURL();\n" +
|
||||||
|
" }\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<button onclick=\"onClick()\">Click me</button>\n" +
|
||||||
|
"<div></div>");
|
||||||
|
page.click("button");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -334,6 +391,20 @@ await page.setContent(`
|
||||||
`);
|
`);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
context.exposeBinding("clicked", (source, args) -> {
|
||||||
|
ElementHandle element = (ElementHandle) args[0];
|
||||||
|
System.out.println(element.textContent());
|
||||||
|
return null;
|
||||||
|
}, new BrowserContext.ExposeBindingOptions().withHandle(true));
|
||||||
|
page.setContent("" +
|
||||||
|
"<script>\n" +
|
||||||
|
" document.addEventListener('click', event => window.clicked(event.target));\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<div>Click me</div>\n" +
|
||||||
|
"<div>Or click me</div>\n");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async def print(source, element):
|
async def print(source, element):
|
||||||
print(await element.text_content())
|
print(await element.text_content())
|
||||||
|
|
@ -412,6 +483,44 @@ const crypto = require('crypto');
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit()
|
||||||
|
Browser browser = webkit.launch(new BrowserType.LaunchOptions().withHeadless(false));
|
||||||
|
context.exposeFunction("sha1", args -> {
|
||||||
|
String text = (String) args[0];
|
||||||
|
MessageDigest crypto;
|
||||||
|
try {
|
||||||
|
crypto = MessageDigest.getInstance("SHA-1");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] token = crypto.digest(text.getBytes(StandardCharsets.UTF_8));
|
||||||
|
return Base64.getEncoder().encodeToString(token);
|
||||||
|
});
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.setContent("<script>\n" +
|
||||||
|
" async function onClick() {\n" +
|
||||||
|
" document.querySelector('div').textContent = await window.sha1('PLAYWRIGHT');\n" +
|
||||||
|
" }\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<button onclick=\"onClick()\">Click me</button>\n" +
|
||||||
|
"<div></div>\n");
|
||||||
|
page.click("button");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
@ -544,6 +653,14 @@ await page.goto('https://example.com');
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
context.route("**/*.{png,jpg,jpeg}", route -> route.abort());
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
context = await browser.new_context()
|
context = await browser.new_context()
|
||||||
page = await context.new_page()
|
page = await context.new_page()
|
||||||
|
|
@ -570,6 +687,14 @@ await page.goto('https://example.com');
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
context.route(Pattern.compile("(\\.png$)|(\\.jpg$)"), route -> route.abort());
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
context = await browser.new_context()
|
context = await browser.new_context()
|
||||||
page = await context.new_page()
|
page = await context.new_page()
|
||||||
|
|
@ -670,6 +795,10 @@ Sets the context's geolocation. Passing `null` or `undefined` emulates position
|
||||||
await browserContext.setGeolocation({latitude: 59.95, longitude: 30.31667});
|
await browserContext.setGeolocation({latitude: 59.95, longitude: 30.31667});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
browserContext.setGeolocation(new Geolocation(59.95, 30.31667));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
|
await browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
|
||||||
```
|
```
|
||||||
|
|
@ -774,6 +903,10 @@ const [page, _] = await Promise.all([
|
||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page newPage = context.waitForPage(() -> page.click("button"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with context.expect_event("page") as event_info:
|
async with context.expect_event("page") as event_info:
|
||||||
await page.click("button")
|
await page.click("button")
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,23 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
// other actions...
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -102,6 +119,12 @@ const browser = await chromium.launch({ // Or 'firefox' or 'webkit'.
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Or "firefox" or "webkit".
|
||||||
|
Browser browser = chromium.launch(new BrowserType.LaunchOptions()
|
||||||
|
.withIgnoreDefaultArgs(Arrays.asList("--mute-audio")));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
browser = await playwright.chromium.launch( # or "firefox" or "webkit".
|
browser = await playwright.chromium.launch( # or "firefox" or "webkit".
|
||||||
ignore_default_args=["--mute-audio"]
|
ignore_default_args=["--mute-audio"]
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,32 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
||||||
page.on('dialog', async dialog => {
|
page.on('dialog', async dialog => {
|
||||||
console.log(dialog.message());
|
console.log(dialog.message());
|
||||||
await dialog.dismiss();
|
await dialog.dismiss();
|
||||||
await browser.close();
|
|
||||||
});
|
});
|
||||||
page.evaluate(() => alert('1'));
|
await page.evaluate(() => alert('1'));
|
||||||
|
await browser.close();
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.onDialog(dialog -> {
|
||||||
|
System.out.println(dialog.message());
|
||||||
|
dialog.dismiss();
|
||||||
|
});
|
||||||
|
page.evaluate("alert('1')");
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,22 @@ const [ download ] = await Promise.all([
|
||||||
const path = await download.path();
|
const path = await download.path();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// wait for download to start
|
||||||
|
Download download = page.waitForDownload(() -> page.click("a"));
|
||||||
|
// wait for download to complete
|
||||||
|
Path path = download.path();
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// wait for download to start
|
||||||
|
Download download = page.waitForDownload(() -> {
|
||||||
|
page.click("a");
|
||||||
|
});
|
||||||
|
// wait for download to complete
|
||||||
|
Path path = download.path();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_download() as download_info:
|
async with page.expect_download() as download_info:
|
||||||
await page.click("a")
|
await page.click("a")
|
||||||
|
|
@ -78,4 +94,4 @@ browsers can use different logic for computing it.
|
||||||
## method: Download.url
|
## method: Download.url
|
||||||
- returns: <[string]>
|
- returns: <[string]>
|
||||||
|
|
||||||
Returns downloaded url.
|
Returns downloaded url.
|
||||||
|
|
@ -16,6 +16,24 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
ElementHandle hrefElement = page.querySelector("a");
|
||||||
|
hrefElement.click();
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -81,6 +99,11 @@ const box = await elementHandle.boundingBox();
|
||||||
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
BoundingBox box = elementHandle.boundingBox();
|
||||||
|
page.mouse().click(box.x + box.width / 2, box.y + box.height / 2);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
box = await element_handle.bounding_box()
|
box = await element_handle.bounding_box()
|
||||||
await page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
|
await page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
|
||||||
|
|
@ -189,6 +212,10 @@ is dispatched. This is equivalend to calling
|
||||||
await elementHandle.dispatchEvent('click');
|
await elementHandle.dispatchEvent('click');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
elementHandle.dispatchEvent("click");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await element_handle.dispatch_event("click")
|
await element_handle.dispatch_event("click")
|
||||||
```
|
```
|
||||||
|
|
@ -219,6 +246,14 @@ const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
|
||||||
await elementHandle.dispatchEvent('dragstart', { dataTransfer });
|
await elementHandle.dispatchEvent('dragstart', { dataTransfer });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Note you can only create DataTransfer in Chromium and Firefox
|
||||||
|
JSHandle dataTransfer = page.evaluateHandle("() => new DataTransfer()");
|
||||||
|
Map<String, Object> arg = new HashMap<>();
|
||||||
|
arg.put("dataTransfer", dataTransfer);
|
||||||
|
elementHandle.dispatchEvent("dragstart", arg);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# note you can only create data_transfer in chromium and firefox
|
# note you can only create data_transfer in chromium and firefox
|
||||||
data_transfer = await page.evaluate_handle("new DataTransfer()")
|
data_transfer = await page.evaluate_handle("new DataTransfer()")
|
||||||
|
|
@ -264,6 +299,12 @@ expect(await tweetHandle.$eval('.like', node => node.innerText)).toBe('100');
|
||||||
expect(await tweetHandle.$eval('.retweets', node => node.innerText)).toBe('10');
|
expect(await tweetHandle.$eval('.retweets', node => node.innerText)).toBe('10');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle tweetHandle = page.querySelector(".tweet");
|
||||||
|
assertEquals("100", tweetHandle.evalOnSelector(".like", "node => node.innerText"));
|
||||||
|
assertEquals("10", tweetHandle.evalOnSelector(".retweets", "node => node.innerText"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
tweet_handle = await page.query_selector(".tweet")
|
tweet_handle = await page.query_selector(".tweet")
|
||||||
assert await tweet_handle.eval_on_selector(".like", "node => node.innerText") == "100"
|
assert await tweet_handle.eval_on_selector(".like", "node => node.innerText") == "100"
|
||||||
|
|
@ -314,6 +355,11 @@ const feedHandle = await page.$('.feed');
|
||||||
expect(await feedHandle.$$eval('.tweet', nodes => nodes.map(n => n.innerText))).toEqual(['Hello!', 'Hi!']);
|
expect(await feedHandle.$$eval('.tweet', nodes => nodes.map(n => n.innerText))).toEqual(['Hello!', 'Hi!']);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle feedHandle = page.querySelector(".feed");
|
||||||
|
assertEquals(Arrays.asList("Hello!", "Hi!"), feedHandle.evalOnSelectorAll(".tweet", "nodes => nodes.map(n => n.innerText)"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
feed_handle = await page.query_selector(".feed")
|
feed_handle = await page.query_selector(".feed")
|
||||||
assert await feed_handle.eval_on_selector_all(".tweet", "nodes => nodes.map(n => n.innerText)") == ["hello!", "hi!"]
|
assert await feed_handle.eval_on_selector_all(".tweet", "nodes => nodes.map(n => n.innerText)") == ["hello!", "hi!"]
|
||||||
|
|
@ -551,6 +597,15 @@ handle.selectOption({ label: 'Blue' });
|
||||||
handle.selectOption(['red', 'green', 'blue']);
|
handle.selectOption(['red', 'green', 'blue']);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// single selection matching the value
|
||||||
|
handle.selectOption("blue");
|
||||||
|
// single selection matching the label
|
||||||
|
handle.selectOption(new SelectOption().withLabel("Blue"));
|
||||||
|
// multiple selection
|
||||||
|
handle.selectOption(new String[] {"red", "green", "blue"});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# single selection matching the value
|
# single selection matching the value
|
||||||
await handle.select_option("blue")
|
await handle.select_option("blue")
|
||||||
|
|
@ -650,6 +705,11 @@ await elementHandle.type('Hello'); // Types instantly
|
||||||
await elementHandle.type('World', {delay: 100}); // Types slower, like a user
|
await elementHandle.type('World', {delay: 100}); // Types slower, like a user
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
elementHandle.type("Hello"); // Types instantly
|
||||||
|
elementHandle.type("World", new ElementHandle.TypeOptions().withDelay(100)); // Types slower, like a user
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await element_handle.type("hello") # types instantly
|
await element_handle.type("hello") # types instantly
|
||||||
await element_handle.type("world", delay=100) # types slower, like a user
|
await element_handle.type("world", delay=100) # types slower, like a user
|
||||||
|
|
@ -668,6 +728,12 @@ await elementHandle.type('some text');
|
||||||
await elementHandle.press('Enter');
|
await elementHandle.press('Enter');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle elementHandle = page.querySelector("input");
|
||||||
|
elementHandle.type("some text");
|
||||||
|
elementHandle.press("Enter");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
element_handle = await page.query_selector("input")
|
element_handle = await page.query_selector("input")
|
||||||
await element_handle.type("some text")
|
await element_handle.type("some text")
|
||||||
|
|
@ -758,6 +824,14 @@ const div = await page.$('div');
|
||||||
const span = await div.waitForSelector('span', { state: 'attached' });
|
const span = await div.waitForSelector('span', { state: 'attached' });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.setContent("<div><span></span></div>");
|
||||||
|
ElementHandle div = page.querySelector("div");
|
||||||
|
// Waiting for the "span" selector relative to the div.
|
||||||
|
ElementHandle span = div.waitForSelector("span", new ElementHandle.WaitForSelectorOptions()
|
||||||
|
.withState(WaitForSelectorState.ATTACHED));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.set_content("<div><span></span></div>")
|
await page.set_content("<div><span></span></div>")
|
||||||
div = await page.query_selector("div")
|
div = await page.query_selector("div")
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,11 @@ const [fileChooser] = await Promise.all([
|
||||||
await fileChooser.setFiles('myfile.pdf');
|
await fileChooser.setFiles('myfile.pdf');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
FileChooser fileChooser = page.waitForFileChooser(() -> page.click("upload"));
|
||||||
|
fileChooser.setFiles(Paths.get("myfile.pdf"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_file_chooser() as fc_info:
|
async with page.expect_file_chooser() as fc_info:
|
||||||
await page.click("upload")
|
await page.click("upload")
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,29 @@ const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType firefox = playwright.firefox();
|
||||||
|
Browser browser = firefox.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("https://www.google.com/chrome/browser/canary.html");
|
||||||
|
dumpFrameTree(page.mainFrame(), "");
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void dumpFrameTree(Frame frame, String indent) {
|
||||||
|
System.out.println(indent + frame.url());
|
||||||
|
for (Frame child : frame.childFrames()) {
|
||||||
|
dumpFrameTree(child, indent + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -237,6 +260,10 @@ is dispatched. This is equivalend to calling
|
||||||
await frame.dispatchEvent('button#submit', 'click');
|
await frame.dispatchEvent('button#submit', 'click');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
frame.dispatchEvent("button#submit", "click");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await frame.dispatch_event("button#submit", "click")
|
await frame.dispatch_event("button#submit", "click")
|
||||||
```
|
```
|
||||||
|
|
@ -267,6 +294,14 @@ const dataTransfer = await frame.evaluateHandle(() => new DataTransfer());
|
||||||
await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Note you can only create DataTransfer in Chromium and Firefox
|
||||||
|
JSHandle dataTransfer = frame.evaluateHandle("() => new DataTransfer()");
|
||||||
|
Map<String, Object> arg = new HashMap<>();
|
||||||
|
arg.put("dataTransfer", dataTransfer);
|
||||||
|
frame.dispatchEvent("#source", "dragstart", arg);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# note you can only create data_transfer in chromium and firefox
|
# note you can only create data_transfer in chromium and firefox
|
||||||
data_transfer = await frame.evaluate_handle("new DataTransfer()")
|
data_transfer = await frame.evaluate_handle("new DataTransfer()")
|
||||||
|
|
@ -279,7 +314,6 @@ data_transfer = frame.evaluate_handle("new DataTransfer()")
|
||||||
frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### param: Frame.dispatchEvent.selector = %%-input-selector-%%
|
### param: Frame.dispatchEvent.selector = %%-input-selector-%%
|
||||||
|
|
||||||
### param: Frame.dispatchEvent.type
|
### param: Frame.dispatchEvent.type
|
||||||
|
|
@ -317,6 +351,12 @@ const preloadHref = await frame.$eval('link[rel=preload]', el => el.href);
|
||||||
const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
String searchValue = (String) frame.evalOnSelector("#search", "el => el.value");
|
||||||
|
String preloadHref = (String) frame.evalOnSelector("link[rel=preload]", "el => el.href");
|
||||||
|
String html = (String) frame.evalOnSelector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
search_value = await frame.eval_on_selector("#search", "el => el.value")
|
search_value = await frame.eval_on_selector("#search", "el => el.value")
|
||||||
preload_href = await frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
preload_href = await frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
||||||
|
|
@ -359,6 +399,10 @@ Examples:
|
||||||
const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);
|
const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
boolean divsCounts = (boolean) page.evalOnSelectorAll("div", "(divs, min) => divs.length >= min", 10);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
divs_counts = await frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
divs_counts = await frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
||||||
```
|
```
|
||||||
|
|
@ -395,6 +439,13 @@ const result = await frame.evaluate(([x, y]) => {
|
||||||
console.log(result); // prints "56"
|
console.log(result); // prints "56"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Object result = frame.evaluate("([x, y]) => {\n" +
|
||||||
|
" return Promise.resolve(x * y);\n" +
|
||||||
|
"}", Arrays.asList(7, 8));
|
||||||
|
System.out.println(result); // prints "56"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
result = await frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
result = await frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
||||||
print(result) # prints "56"
|
print(result) # prints "56"
|
||||||
|
|
@ -405,13 +456,16 @@ result = frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
||||||
print(result) # prints "56"
|
print(result) # prints "56"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
A string can also be passed in instead of a function.
|
A string can also be passed in instead of a function.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
console.log(await frame.evaluate('1 + 2')); // prints "3"
|
console.log(await frame.evaluate('1 + 2')); // prints "3"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
System.out.println(frame.evaluate("1 + 2")); // prints "3"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
print(await frame.evaluate("1 + 2")) # prints "3"
|
print(await frame.evaluate("1 + 2")) # prints "3"
|
||||||
x = 10
|
x = 10
|
||||||
|
|
@ -424,7 +478,6 @@ x = 10
|
||||||
print(frame.evaluate(f"1 + {x}")) # prints "11"
|
print(frame.evaluate(f"1 + {x}")) # prints "11"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
[ElementHandle] instances can be passed as an argument to the [`method: Frame.evaluate`]:
|
[ElementHandle] instances can be passed as an argument to the [`method: Frame.evaluate`]:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
|
@ -433,6 +486,12 @@ const html = await frame.evaluate(([body, suffix]) => body.innerHTML + suffix, [
|
||||||
await bodyHandle.dispose();
|
await bodyHandle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle bodyHandle = frame.querySelector("body");
|
||||||
|
String html = (String) frame.evaluate("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(bodyHandle, "hello"));
|
||||||
|
bodyHandle.dispose();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
body_handle = await frame.query_selector("body")
|
body_handle = await frame.query_selector("body")
|
||||||
html = await frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
html = await frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
||||||
|
|
@ -468,6 +527,11 @@ const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window));
|
||||||
aWindowHandle; // Handle for the window object.
|
aWindowHandle; // Handle for the window object.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Handle for the window object.
|
||||||
|
JSHandle aWindowHandle = frame.evaluateHandle("() => Promise.resolve(window)");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_window_handle = await frame.evaluate_handle("Promise.resolve(window)")
|
a_window_handle = await frame.evaluate_handle("Promise.resolve(window)")
|
||||||
a_window_handle # handle for the window object.
|
a_window_handle # handle for the window object.
|
||||||
|
|
@ -484,6 +548,10 @@ A string can also be passed in instead of a function.
|
||||||
const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.
|
const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle aHandle = frame.evaluateHandle("document"); // Handle for the "document".
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_handle = await page.evaluate_handle("document") # handle for the "document"
|
a_handle = await page.evaluate_handle("document") # handle for the "document"
|
||||||
```
|
```
|
||||||
|
|
@ -501,6 +569,13 @@ console.log(await resultHandle.jsonValue());
|
||||||
await resultHandle.dispose();
|
await resultHandle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle aHandle = frame.evaluateHandle("() => document.body");
|
||||||
|
JSHandle resultHandle = frame.evaluateHandle("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(aHandle, "hello"));
|
||||||
|
System.out.println(resultHandle.jsonValue());
|
||||||
|
resultHandle.dispose();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_handle = await page.evaluate_handle("document.body")
|
a_handle = await page.evaluate_handle("document.body")
|
||||||
result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
||||||
|
|
@ -567,6 +642,12 @@ const contentFrame = await frameElement.contentFrame();
|
||||||
console.log(frame === contentFrame); // -> true
|
console.log(frame === contentFrame); // -> true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle frameElement = frame.frameElement();
|
||||||
|
Frame contentFrame = frameElement.contentFrame();
|
||||||
|
System.out.println(frame == contentFrame); // -> true
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
frame_element = await frame.frame_element()
|
frame_element = await frame.frame_element()
|
||||||
content_frame = await frame_element.content_frame()
|
content_frame = await frame_element.content_frame()
|
||||||
|
|
@ -844,6 +925,15 @@ frame.selectOption('select#colors', { label: 'Blue' });
|
||||||
frame.selectOption('select#colors', 'red', 'green', 'blue');
|
frame.selectOption('select#colors', 'red', 'green', 'blue');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// single selection matching the value
|
||||||
|
frame.selectOption("select#colors", "blue");
|
||||||
|
// single selection matching both the value and the label
|
||||||
|
frame.selectOption("select#colors", new SelectOption().withLabel("Blue"));
|
||||||
|
// multiple selection
|
||||||
|
frame.selectOption("select#colors", new String[] {"red", "green", "blue"});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# single selection matching the value
|
# single selection matching the value
|
||||||
await frame.select_option("select#colors", "blue")
|
await frame.select_option("select#colors", "blue")
|
||||||
|
|
@ -953,6 +1043,13 @@ await frame.type('#mytextarea', 'Hello'); // Types instantly
|
||||||
await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Types instantly
|
||||||
|
frame.type("#mytextarea", "Hello");
|
||||||
|
// Types slower, like a user
|
||||||
|
frame.type("#mytextarea", "World", new Frame.TypeOptions().withDelay(100));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await frame.type("#mytextarea", "hello") # types instantly
|
await frame.type("#mytextarea", "hello") # types instantly
|
||||||
await frame.type("#mytextarea", "world", delay=100) # types slower, like a user
|
await frame.type("#mytextarea", "world", delay=100) # types slower, like a user
|
||||||
|
|
@ -1029,6 +1126,23 @@ const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType firefox = playwright.firefox();
|
||||||
|
Browser browser = firefox.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.setViewportSize(50, 50);
|
||||||
|
page.mainFrame().waitForFunction("window.innerWidth < 100");
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -1069,6 +1183,11 @@ const selector = '.foo';
|
||||||
await frame.waitForFunction(selector => !!document.querySelector(selector), selector);
|
await frame.waitForFunction(selector => !!document.querySelector(selector), selector);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
String selector = ".foo";
|
||||||
|
frame.waitForFunction("selector => !!document.querySelector(selector)", selector);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
selector = ".foo"
|
selector = ".foo"
|
||||||
await frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
await frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
||||||
|
|
@ -1104,6 +1223,11 @@ await frame.click('button'); // Click triggers navigation.
|
||||||
await frame.waitForLoadState(); // Waits for 'load' state by default.
|
await frame.waitForLoadState(); // Waits for 'load' state by default.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
frame.click("button"); // Click triggers navigation.
|
||||||
|
frame.waitForLoadState(); // Waits for "load" state by default.
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await frame.click("button") # click triggers navigation.
|
await frame.click("button") # click triggers navigation.
|
||||||
await frame.wait_for_load_state() # the promise resolves after "load" event.
|
await frame.wait_for_load_state() # the promise resolves after "load" event.
|
||||||
|
|
@ -1137,6 +1261,14 @@ const [response] = await Promise.all([
|
||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// The method returns after navigation has finished
|
||||||
|
Response response = frame.waitForNavigation(() -> {
|
||||||
|
// Clicking the link will indirectly cause a navigation
|
||||||
|
frame.click("a.delayed-navigation");
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with frame.expect_navigation():
|
async with frame.expect_navigation():
|
||||||
await frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
await frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
||||||
|
|
@ -1188,6 +1320,26 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
for (String currentURL : Arrays.asList("https://google.com", "https://bbc.com")) {
|
||||||
|
page.navigate(currentURL);
|
||||||
|
ElementHandle element = page.mainFrame().waitForSelector("img");
|
||||||
|
System.out.println("Loaded image: " + element.getAttribute("src"));
|
||||||
|
}
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ const windowHandle = await page.evaluateHandle(() => window);
|
||||||
// ...
|
// ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle windowHandle = page.evaluateHandle("() => window");
|
||||||
|
// ...
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
window_handle = await page.evaluate_handle("window")
|
window_handle = await page.evaluate_handle("window")
|
||||||
# ...
|
# ...
|
||||||
|
|
@ -51,6 +56,11 @@ const tweetHandle = await page.$('.tweet .retweets');
|
||||||
expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10 retweets');
|
expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10 retweets');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle tweetHandle = page.querySelector(".tweet .retweets");
|
||||||
|
assertEquals("10 retweets", tweetHandle.evaluate("node => node.innerText"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
tweet_handle = await page.query_selector(".tweet .retweets")
|
tweet_handle = await page.query_selector(".tweet .retweets")
|
||||||
assert await tweet_handle.evaluate("node => node.innerText") == "10 retweets"
|
assert await tweet_handle.evaluate("node => node.innerText") == "10 retweets"
|
||||||
|
|
@ -102,6 +112,14 @@ const documentHandle = properties.get('document');
|
||||||
await handle.dispose();
|
await handle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle handle = page.evaluateHandle("() => ({window, document}"););
|
||||||
|
Map<String, JSHandle> properties = handle.getProperties();
|
||||||
|
JSHandle windowHandle = properties.get("window");
|
||||||
|
JSHandle documentHandle = properties.get("document");
|
||||||
|
handle.dispose();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
handle = await page.evaluate_handle("{window, document}")
|
handle = await page.evaluate_handle("{window, document}")
|
||||||
properties = await handle.get_properties()
|
properties = await handle.get_properties()
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,17 @@ await page.keyboard.press('Backspace');
|
||||||
// Result text will end up saying 'Hello!'
|
// Result text will end up saying 'Hello!'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.keyboard().type("Hello World!");
|
||||||
|
page.keyboard().press("ArrowLeft");
|
||||||
|
page.keyboard().down("Shift");
|
||||||
|
for (int i = 0; i < " World".length(); i++)
|
||||||
|
page.keyboard().press("ArrowLeft");
|
||||||
|
page.keyboard().up("Shift");
|
||||||
|
page.keyboard().press("Backspace");
|
||||||
|
// Result text will end up saying "Hello!"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.keyboard.type("Hello World!")
|
await page.keyboard.type("Hello World!")
|
||||||
await page.keyboard.press("ArrowLeft")
|
await page.keyboard.press("ArrowLeft")
|
||||||
|
|
@ -51,6 +62,12 @@ await page.keyboard.press('Shift+KeyA');
|
||||||
await page.keyboard.press('Shift+A');
|
await page.keyboard.press('Shift+A');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.keyboard().press("Shift+KeyA");
|
||||||
|
// or
|
||||||
|
page.keyboard().press("Shift+A");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.keyboard.press("Shift+KeyA")
|
await page.keyboard.press("Shift+KeyA")
|
||||||
# or
|
# or
|
||||||
|
|
@ -72,6 +89,13 @@ await page.keyboard.press('Control+A');
|
||||||
await page.keyboard.press('Meta+A');
|
await page.keyboard.press('Meta+A');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// on Windows and Linux
|
||||||
|
page.keyboard().press("Control+A");
|
||||||
|
// on macOS
|
||||||
|
page.keyboard().press("Meta+A");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# on windows and linux
|
# on windows and linux
|
||||||
await page.keyboard.press("Control+A")
|
await page.keyboard.press("Control+A")
|
||||||
|
|
@ -129,6 +153,10 @@ Dispatches only `input` event, does not emit the `keydown`, `keyup` or `keypress
|
||||||
page.keyboard.insertText('嗨');
|
page.keyboard.insertText('嗨');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.keyboard().insertText("嗨");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.keyboard.insert_text("嗨")
|
await page.keyboard.insert_text("嗨")
|
||||||
```
|
```
|
||||||
|
|
@ -178,6 +206,18 @@ await page.screenshot({ path: 'O.png' });
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("https://keycode.info");
|
||||||
|
page.keyboard().press("A");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("A.png"));
|
||||||
|
page.keyboard().press("ArrowLeft");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("ArrowLeft.png")));
|
||||||
|
page.keyboard().press("Shift+O");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("O.png")));
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
await page.goto("https://keycode.info")
|
await page.goto("https://keycode.info")
|
||||||
|
|
@ -225,6 +265,13 @@ await page.keyboard.type('Hello'); // Types instantly
|
||||||
await page.keyboard.type('World', {delay: 100}); // Types slower, like a user
|
await page.keyboard.type('World', {delay: 100}); // Types slower, like a user
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Types instantly
|
||||||
|
page.keyboard().type("Hello");
|
||||||
|
// Types slower, like a user
|
||||||
|
page.keyboard().type("World", new Keyboard.TypeOptions().withDelay(100));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.keyboard.type("Hello") # types instantly
|
await page.keyboard.type("Hello") # types instantly
|
||||||
await page.keyboard.type("World", delay=100) # types slower, like a user
|
await page.keyboard.type("World", delay=100) # types slower, like a user
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,17 @@ await page.mouse.move(0, 0);
|
||||||
await page.mouse.up();
|
await page.mouse.up();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Using ‘page.mouse’ to trace a 100x100 square.
|
||||||
|
page.mouse().move(0, 0);
|
||||||
|
page.mouse().down();
|
||||||
|
page.mouse().move(0, 100);
|
||||||
|
page.mouse().move(100, 100);
|
||||||
|
page.mouse().move(100, 0);
|
||||||
|
page.mouse().move(0, 0);
|
||||||
|
page.mouse().up();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# using ‘page.mouse’ to trace a 100x100 square.
|
# using ‘page.mouse’ to trace a 100x100 square.
|
||||||
await page.mouse.move(0, 0)
|
await page.mouse.move(0, 0)
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,24 @@ const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit();
|
||||||
|
Browser browser = webkit.launch();
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("screenshot.png")));
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -65,6 +83,10 @@ This example logs a message for a single page `load` event:
|
||||||
page.once('load', () => console.log('Page loaded!'));
|
page.once('load', () => console.log('Page loaded!'));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onLoad(p -> System.out.println("Page loaded!"));
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
page.once("load", lambda: print("page loaded!"))
|
page.once("load", lambda: print("page loaded!"))
|
||||||
```
|
```
|
||||||
|
|
@ -80,6 +102,15 @@ page.on('request', logRequest);
|
||||||
page.removeListener('request', logRequest);
|
page.removeListener('request', logRequest);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Consumer<Request> logRequest = interceptedRequest -> {
|
||||||
|
System.out.println("A request was made: " + interceptedRequest.url());
|
||||||
|
};
|
||||||
|
page.onRequest(logRequest);
|
||||||
|
// Sometime later...
|
||||||
|
page.offRequest(logRequest);
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
def log_request(intercepted_request):
|
def log_request(intercepted_request):
|
||||||
print("a request was made:", intercepted_request.url)
|
print("a request was made:", intercepted_request.url)
|
||||||
|
|
@ -111,6 +142,14 @@ page.on('console', msg => {
|
||||||
page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
|
page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onConsole(msg -> {
|
||||||
|
for (int i = 0; i < msg.args().size(); ++i)
|
||||||
|
System.out.println(i + ": " + msg.args().get(i).jsonValue());
|
||||||
|
});
|
||||||
|
page.evaluate("() => console.log('hello', 5, {foo: 'bar'})");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async def print_args(msg):
|
async def print_args(msg):
|
||||||
for arg in msg.args:
|
for arg in msg.args:
|
||||||
|
|
@ -148,6 +187,17 @@ try {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
try {
|
||||||
|
// Crash might happen during a click.
|
||||||
|
page.click("button");
|
||||||
|
// Or while waiting for an event.
|
||||||
|
page.waitForPopup(() -> {});
|
||||||
|
} catch (PlaywrightException e) {
|
||||||
|
// When the page crashes, exception message contains "crash".
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
try:
|
try:
|
||||||
# crash might happen during a click.
|
# crash might happen during a click.
|
||||||
|
|
@ -207,6 +257,12 @@ page.on('filechooser', async (fileChooser) => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onFileChooser(fileChooser -> {
|
||||||
|
fileChooser.setFiles(Paths.get("/tmp/myfile.pdf"));
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
page.on("filechooser", lambda file_chooser: file_chooser.set_files("/tmp/myfile.pdf"))
|
page.on("filechooser", lambda file_chooser: file_chooser.set_files("/tmp/myfile.pdf"))
|
||||||
```
|
```
|
||||||
|
|
@ -258,6 +314,13 @@ const [popup] = await Promise.all([
|
||||||
console.log(await popup.evaluate('location.href'));
|
console.log(await popup.evaluate('location.href'));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page popup = page.waitForPopup(() -> {
|
||||||
|
page.evaluate("() => window.open('https://example.com')");
|
||||||
|
});
|
||||||
|
System.out.println(popup.evaluate("location.href"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_event("popup") as page_info:
|
async with page.expect_event("popup") as page_info:
|
||||||
page.evaluate("window.open('https://example.com')")
|
page.evaluate("window.open('https://example.com')")
|
||||||
|
|
@ -341,6 +404,11 @@ Math.random = () => 42;
|
||||||
await page.addInitScript({ path: './preload.js' });
|
await page.addInitScript({ path: './preload.js' });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// In your playwright script, assuming the preload.js file is in same directory
|
||||||
|
page.addInitScript(Paths.get("./preload.js"));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# in your playwright script, assuming the preload.js file is in same directory
|
# in your playwright script, assuming the preload.js file is in same directory
|
||||||
await page.add_init_script(path="./preload.js")
|
await page.add_init_script(path="./preload.js")
|
||||||
|
|
@ -578,6 +646,10 @@ is dispatched. This is equivalend to calling
|
||||||
await page.dispatchEvent('button#submit', 'click');
|
await page.dispatchEvent('button#submit', 'click');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.dispatchEvent("button#submit", "click");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.dispatch_event("button#submit", "click")
|
await page.dispatch_event("button#submit", "click")
|
||||||
```
|
```
|
||||||
|
|
@ -608,6 +680,14 @@ const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
|
||||||
await page.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
await page.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Note you can only create DataTransfer in Chromium and Firefox
|
||||||
|
JSHandle dataTransfer = page.evaluateHandle("() => new DataTransfer()");
|
||||||
|
Map<String, Object> arg = new HashMap<>();
|
||||||
|
arg.put("dataTransfer", dataTransfer);
|
||||||
|
page.dispatchEvent("#source", "dragstart", arg);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# note you can only create data_transfer in chromium and firefox
|
# note you can only create data_transfer in chromium and firefox
|
||||||
data_transfer = await page.evaluate_handle("new DataTransfer()")
|
data_transfer = await page.evaluate_handle("new DataTransfer()")
|
||||||
|
|
@ -655,6 +735,25 @@ await page.evaluate(() => matchMedia('print').matches);
|
||||||
// → false
|
// → false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.evaluate("() => matchMedia('screen').matches");
|
||||||
|
// → true
|
||||||
|
page.evaluate("() => matchMedia('print').matches");
|
||||||
|
// → false
|
||||||
|
|
||||||
|
page.emulateMedia(new Page.EmulateMediaOptions().withMedia(Media.PRINT));
|
||||||
|
page.evaluate("() => matchMedia('screen').matches");
|
||||||
|
// → false
|
||||||
|
page.evaluate("() => matchMedia('print').matches");
|
||||||
|
// → true
|
||||||
|
|
||||||
|
page.emulateMedia(new Page.EmulateMediaOptions());
|
||||||
|
page.evaluate("() => matchMedia('screen').matches");
|
||||||
|
// → true
|
||||||
|
page.evaluate("() => matchMedia('print').matches");
|
||||||
|
// → false
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.evaluate("matchMedia('screen').matches")
|
await page.evaluate("matchMedia('screen').matches")
|
||||||
# → True
|
# → True
|
||||||
|
|
@ -703,6 +802,16 @@ await page.evaluate(() => matchMedia('(prefers-color-scheme: no-preference)').ma
|
||||||
// → false
|
// → false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.emulateMedia(new Page.EmulateMediaOptions().withColorScheme(ColorScheme.DARK));
|
||||||
|
page.evaluate("() => matchMedia('(prefers-color-scheme: dark)').matches");
|
||||||
|
// → true
|
||||||
|
page.evaluate("() => matchMedia('(prefers-color-scheme: light)').matches");
|
||||||
|
// → false
|
||||||
|
page.evaluate("() => matchMedia('(prefers-color-scheme: no-preference)').matches");
|
||||||
|
// → false
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.emulate_media(color_scheme="dark")
|
await page.emulate_media(color_scheme="dark")
|
||||||
await page.evaluate("matchMedia('(prefers-color-scheme: dark)').matches")
|
await page.evaluate("matchMedia('(prefers-color-scheme: dark)').matches")
|
||||||
|
|
@ -755,6 +864,12 @@ const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
|
||||||
const html = await page.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
const html = await page.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
String searchValue = (String) page.evalOnSelector("#search", "el => el.value");
|
||||||
|
String preloadHref = (String) page.evalOnSelector("link[rel=preload]", "el => el.href");
|
||||||
|
String html = (String) page.evalOnSelector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
search_value = await page.eval_on_selector("#search", "el => el.value")
|
search_value = await page.eval_on_selector("#search", "el => el.value")
|
||||||
preload_href = await page.eval_on_selector("link[rel=preload]", "el => el.href")
|
preload_href = await page.eval_on_selector("link[rel=preload]", "el => el.href")
|
||||||
|
|
@ -796,6 +911,10 @@ Examples:
|
||||||
const divCounts = await page.$$eval('div', (divs, min) => divs.length >= min, 10);
|
const divCounts = await page.$$eval('div', (divs, min) => divs.length >= min, 10);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
boolean divCounts = (boolean) page.evalOnSelectorAll("div", "(divs, min) => divs.length >= min", 10);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
div_counts = await page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
div_counts = await page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
||||||
```
|
```
|
||||||
|
|
@ -834,6 +953,13 @@ const result = await page.evaluate(([x, y]) => {
|
||||||
console.log(result); // prints "56"
|
console.log(result); // prints "56"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Object result = page.evaluate("([x, y]) => {\n" +
|
||||||
|
" return Promise.resolve(x * y);\n" +
|
||||||
|
"}", Arrays.asList(7, 8));
|
||||||
|
System.out.println(result); // prints "56"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
result = await page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
result = await page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
||||||
print(result) # prints "56"
|
print(result) # prints "56"
|
||||||
|
|
@ -852,6 +978,10 @@ const x = 10;
|
||||||
console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
|
console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
System.out.println(page.evaluate("1 + 2")); // prints "3"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
print(await page.evaluate("1 + 2")) # prints "3"
|
print(await page.evaluate("1 + 2")) # prints "3"
|
||||||
x = 10
|
x = 10
|
||||||
|
|
@ -872,6 +1002,12 @@ const html = await page.evaluate(([body, suffix]) => body.innerHTML + suffix, [b
|
||||||
await bodyHandle.dispose();
|
await bodyHandle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
ElementHandle bodyHandle = page.querySelector("body");
|
||||||
|
String html = (String) page.evaluate("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(bodyHandle, "hello"));
|
||||||
|
bodyHandle.dispose();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
body_handle = await page.query_selector("body")
|
body_handle = await page.query_selector("body")
|
||||||
html = await page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
html = await page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
||||||
|
|
@ -908,6 +1044,11 @@ const aWindowHandle = await page.evaluateHandle(() => Promise.resolve(window));
|
||||||
aWindowHandle; // Handle for the window object.
|
aWindowHandle; // Handle for the window object.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Handle for the window object.
|
||||||
|
JSHandle aWindowHandle = page.evaluateHandle("() => Promise.resolve(window)");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_window_handle = await page.evaluate_handle("Promise.resolve(window)")
|
a_window_handle = await page.evaluate_handle("Promise.resolve(window)")
|
||||||
a_window_handle # handle for the window object.
|
a_window_handle # handle for the window object.
|
||||||
|
|
@ -924,6 +1065,10 @@ A string can also be passed in instead of a function:
|
||||||
const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
|
const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle aHandle = page.evaluateHandle("document"); // Handle for the "document".
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_handle = await page.evaluate_handle("document") # handle for the "document"
|
a_handle = await page.evaluate_handle("document") # handle for the "document"
|
||||||
```
|
```
|
||||||
|
|
@ -941,6 +1086,13 @@ console.log(await resultHandle.jsonValue());
|
||||||
await resultHandle.dispose();
|
await resultHandle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
JSHandle aHandle = page.evaluateHandle("() => document.body");
|
||||||
|
JSHandle resultHandle = page.evaluateHandle("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(aHandle, "hello"));
|
||||||
|
System.out.println(resultHandle.jsonValue());
|
||||||
|
resultHandle.dispose();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
a_handle = await page.evaluate_handle("document.body")
|
a_handle = await page.evaluate_handle("document.body")
|
||||||
result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
||||||
|
|
@ -1000,6 +1152,30 @@ const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit();
|
||||||
|
Browser browser = webkit.launch({ headless: false });
|
||||||
|
BrowserContext context = browser.newContext();
|
||||||
|
Page page = context.newPage();
|
||||||
|
page.exposeBinding("pageURL", (source, args) -> source.page().url());
|
||||||
|
page.setContent("<script>\n" +
|
||||||
|
" async function onClick() {\n" +
|
||||||
|
" document.querySelector('div').textContent = await window.pageURL();\n" +
|
||||||
|
" }\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<button onclick=\"onClick()\">Click me</button>\n" +
|
||||||
|
"<div></div>");
|
||||||
|
page.click("button");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -1066,6 +1242,20 @@ await page.setContent(`
|
||||||
`);
|
`);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.exposeBinding("clicked", (source, args) -> {
|
||||||
|
ElementHandle element = (ElementHandle) args[0];
|
||||||
|
System.out.println(element.textContent());
|
||||||
|
return null;
|
||||||
|
}, new Page.ExposeBindingOptions().withHandle(true));
|
||||||
|
page.setContent("" +
|
||||||
|
"<script>\n" +
|
||||||
|
" document.addEventListener('click', event => window.clicked(event.target));\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<div>Click me</div>\n" +
|
||||||
|
"<div>Or click me</div>\n");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async def print(source, element):
|
async def print(source, element):
|
||||||
print(await element.text_content())
|
print(await element.text_content())
|
||||||
|
|
@ -1146,6 +1336,44 @@ const crypto = require('crypto');
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit();
|
||||||
|
Browser browser = webkit.launch({ headless: false });
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.exposeFunction("sha1", args -> {
|
||||||
|
String text = (String) args[0];
|
||||||
|
MessageDigest crypto;
|
||||||
|
try {
|
||||||
|
crypto = MessageDigest.getInstance("SHA-1");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] token = crypto.digest(text.getBytes(StandardCharsets.UTF_8));
|
||||||
|
return Base64.getEncoder().encodeToString(token);
|
||||||
|
});
|
||||||
|
page.setContent("<script>\n" +
|
||||||
|
" async function onClick() {\n" +
|
||||||
|
" document.querySelector('div').textContent = await window.sha1('PLAYWRIGHT');\n" +
|
||||||
|
" }\n" +
|
||||||
|
"</script>\n" +
|
||||||
|
"<button onclick=\"onClick()\">Click me</button>\n" +
|
||||||
|
"<div></div>\n");
|
||||||
|
page.click("button");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
@ -1261,6 +1489,10 @@ Returns frame matching the specified criteria. Either `name` or `url` must be sp
|
||||||
const frame = page.frame('frame-name');
|
const frame = page.frame('frame-name');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Frame frame = page.frame("frame-name");
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
frame = page.frame(name="frame-name")
|
frame = page.frame(name="frame-name")
|
||||||
```
|
```
|
||||||
|
|
@ -1269,6 +1501,10 @@ frame = page.frame(name="frame-name")
|
||||||
const frame = page.frame({ url: /.*domain.*/ });
|
const frame = page.frame({ url: /.*domain.*/ });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Frame frame = page.frameByUrl(Pattern.compile(".*domain.*");
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
frame = page.frame(url=r".*domain.*")
|
frame = page.frame(url=r".*domain.*")
|
||||||
```
|
```
|
||||||
|
|
@ -1545,6 +1781,12 @@ await page.emulateMedia({media: 'screen'});
|
||||||
await page.pdf({path: 'page.pdf'});
|
await page.pdf({path: 'page.pdf'});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Generates a PDF with "screen" media type.
|
||||||
|
page.emulateMedia(new Page.EmulateMediaOptions().withMedia(Media.SCREEN));
|
||||||
|
page.pdf(new Page.PdfOptions().withPath(Paths.get("page.pdf")));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# generates a pdf with "screen" media type.
|
# generates a pdf with "screen" media type.
|
||||||
await page.emulate_media(media="screen")
|
await page.emulate_media(media="screen")
|
||||||
|
|
@ -1726,6 +1968,17 @@ await page.screenshot({ path: 'O.png' });
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("https://keycode.info");
|
||||||
|
page.press("body", "A");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("A.png")));
|
||||||
|
page.press("body", "ArrowLeft");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("ArrowLeft.png" )));
|
||||||
|
page.press("body", "Shift+O");
|
||||||
|
page.screenshot(new Page.ScreenshotOptions().withPath(Paths.get("O.png" )));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
await page.goto("https://keycode.info")
|
await page.goto("https://keycode.info")
|
||||||
|
|
@ -1821,6 +2074,13 @@ await page.goto('https://example.com');
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.route("**/*.{png,jpg,jpeg}", route -> route.abort());
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
|
await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
|
||||||
|
|
@ -1844,6 +2104,13 @@ await page.goto('https://example.com');
|
||||||
await browser.close();
|
await browser.close();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.route(Pattern.compile("(\\.png$)|(\\.jpg$)"),route -> route.abort());
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
await page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
|
await page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
|
||||||
|
|
@ -1950,6 +2217,15 @@ page.selectOption('select#colors', ['red', 'green', 'blue']);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// single selection matching the value
|
||||||
|
page.selectOption("select#colors", "blue");
|
||||||
|
// single selection matching both the value and the label
|
||||||
|
page.selectOption("select#colors", new SelectOption().withLabel("Blue"));
|
||||||
|
// multiple selection
|
||||||
|
page.selectOption("select#colors", new String[] {"red", "green", "blue"});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# single selection matching the value
|
# single selection matching the value
|
||||||
await page.select_option("select#colors", "blue")
|
await page.select_option("select#colors", "blue")
|
||||||
|
|
@ -2068,6 +2344,12 @@ await page.setViewportSize({
|
||||||
await page.goto('https://example.com');
|
await page.goto('https://example.com');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.setViewportSize(640, 480);
|
||||||
|
page.navigate("https://example.com");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
await page.set_viewport_size({"width": 640, "height": 480})
|
await page.set_viewport_size({"width": 640, "height": 480})
|
||||||
|
|
@ -2146,6 +2428,13 @@ await page.type('#mytextarea', 'Hello'); // Types instantly
|
||||||
await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Types instantly
|
||||||
|
page.type("#mytextarea", "Hello");
|
||||||
|
// Types slower, like a user
|
||||||
|
page.type("#mytextarea", "World", new Page.TypeOptions().withDelay(100));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.type("#mytextarea", "hello") # types instantly
|
await page.type("#mytextarea", "hello") # types instantly
|
||||||
await page.type("#mytextarea", "world", delay=100) # types slower, like a user
|
await page.type("#mytextarea", "world", delay=100) # types slower, like a user
|
||||||
|
|
@ -2352,6 +2641,23 @@ const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType webkit = playwright.webkit();
|
||||||
|
Browser browser = webkit.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.setViewportSize(50, 50);
|
||||||
|
page.waitForFunction("() => window.innerWidth < 100");
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -2392,6 +2698,11 @@ const selector = '.foo';
|
||||||
await page.waitForFunction(selector => !!document.querySelector(selector), selector);
|
await page.waitForFunction(selector => !!document.querySelector(selector), selector);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
String selector = ".foo";
|
||||||
|
page.waitForFunction("selector => !!document.querySelector(selector)", selector);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
selector = ".foo"
|
selector = ".foo"
|
||||||
await page.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
await page.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
||||||
|
|
@ -2429,6 +2740,11 @@ await page.click('button'); // Click triggers navigation.
|
||||||
await page.waitForLoadState(); // The promise resolves after 'load' event.
|
await page.waitForLoadState(); // The promise resolves after 'load' event.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.click("button"); // Click triggers navigation.
|
||||||
|
page.waitForLoadState(); // The promise resolves after "load" event.
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.click("button") # click triggers navigation.
|
await page.click("button") # click triggers navigation.
|
||||||
await page.wait_for_load_state() # the promise resolves after "load" event.
|
await page.wait_for_load_state() # the promise resolves after "load" event.
|
||||||
|
|
@ -2448,6 +2764,14 @@ await popup.waitForLoadState('domcontentloaded'); // The promise resolves after
|
||||||
console.log(await popup.title()); // Popup is ready to use.
|
console.log(await popup.title()); // Popup is ready to use.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page popup = page.waitForPopup(() -> {
|
||||||
|
page.click("button"); // Click triggers a popup.
|
||||||
|
});
|
||||||
|
popup.waitForLoadState(LoadState.DOMCONTENTLOADED);
|
||||||
|
System.out.println(popup.title()); // Popup is ready to use.
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_popup() as page_info:
|
async with page.expect_popup() as page_info:
|
||||||
await page.click("button") # click triggers a popup.
|
await page.click("button") # click triggers a popup.
|
||||||
|
|
@ -2492,6 +2816,13 @@ const [response] = await Promise.all([
|
||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// The method returns after navigation has finished
|
||||||
|
Response response = page.waitForNavigation(() -> {
|
||||||
|
page.click("a.delayed-navigation"); // Clicking the link will indirectly cause a navigation
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_navigation():
|
async with page.expect_navigation():
|
||||||
await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
||||||
|
|
@ -2546,6 +2877,13 @@ const finalRequest = await page.waitForRequest(request => request.url() === 'htt
|
||||||
return firstRequest.url();
|
return firstRequest.url();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Request firstRequest = page.waitForRequest("http://example.com/resource");
|
||||||
|
Object finalRequest = page.waitForRequest(
|
||||||
|
request -> "http://example.com".equals(request.url()) && "GET".equals(request.method()), () -> {});
|
||||||
|
return firstRequest.url();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_request("http://example.com/resource") as first:
|
async with page.expect_request("http://example.com/resource") as first:
|
||||||
await page.click('button')
|
await page.click('button')
|
||||||
|
|
@ -2594,6 +2932,12 @@ const finalResponse = await page.waitForResponse(response => response.url() ===
|
||||||
return finalResponse.ok();
|
return finalResponse.ok();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Response firstResponse = page.waitForResponse("https://example.com/resource", () -> {});
|
||||||
|
Response finalResponse = page.waitForResponse(response -> "https://example.com".equals(response.url()) && response.status() == 200, () -> {});
|
||||||
|
return finalResponse.ok();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
first_response = await page.wait_for_response("https://example.com/resource")
|
first_response = await page.wait_for_response("https://example.com/resource")
|
||||||
final_response = await page.wait_for_response(lambda response: response.url == "https://example.com" and response.status === 200)
|
final_response = await page.wait_for_response(lambda response: response.url == "https://example.com" and response.status === 200)
|
||||||
|
|
@ -2645,6 +2989,26 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
for (String currentURL : Arrays.asList("https://google.com", "https://bbc.com")) {
|
||||||
|
page.navigate(currentURL);
|
||||||
|
ElementHandle element = page.waitForSelector("img");
|
||||||
|
System.out.println("Loaded image: " + element.getAttribute("src"));
|
||||||
|
}
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
@ -2700,6 +3064,11 @@ flaky. Use signals such as network events, selectors becoming visible and others
|
||||||
await page.waitForTimeout(1000);
|
await page.waitForTimeout(1000);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// wait for 1 second
|
||||||
|
page.waitForTimeout(1000);
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# wait for 1 second
|
# wait for 1 second
|
||||||
await page.wait_for_timeout(1000)
|
await page.wait_for_timeout(1000)
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,23 @@ const { chromium, firefox, webkit } = require('playwright');
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.microsoft.playwright.*;
|
||||||
|
|
||||||
|
public class Example {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try (Playwright playwright = Playwright.create()) {
|
||||||
|
BrowserType chromium = playwright.chromium();
|
||||||
|
Browser browser = chromium.launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.navigate("http://example.com");
|
||||||
|
// other actions...
|
||||||
|
browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
import asyncio
|
import asyncio
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,12 @@ page.on('requestfailed', request => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onRequestFailed(request -> {
|
||||||
|
System.out.println(request.url() + " " + request.failure());
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
page.on("requestfailed", lambda request: print(request.url + " " + request.failure))
|
page.on("requestfailed", lambda request: print(request.url + " " + request.failure))
|
||||||
```
|
```
|
||||||
|
|
@ -88,6 +94,11 @@ const response = await page.goto('http://example.com');
|
||||||
console.log(response.request().redirectedFrom().url()); // 'http://example.com'
|
console.log(response.request().redirectedFrom().url()); // 'http://example.com'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Response response = page.navigate("http://example.com");
|
||||||
|
System.out.println(response.request().redirectedFrom().url()); // "http://example.com"
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
response = await page.goto("http://example.com")
|
response = await page.goto("http://example.com")
|
||||||
print(response.request.redirected_from.url) # "http://example.com"
|
print(response.request.redirected_from.url) # "http://example.com"
|
||||||
|
|
@ -105,6 +116,11 @@ const response = await page.goto('https://google.com');
|
||||||
console.log(response.request().redirectedFrom()); // null
|
console.log(response.request().redirectedFrom()); // null
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Response response = page.navigate("https://google.com");
|
||||||
|
System.out.println(response.request().redirectedFrom()); // null
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
response = await page.goto("https://google.com")
|
response = await page.goto("https://google.com")
|
||||||
print(response.request.redirected_from) # None
|
print(response.request.redirected_from) # None
|
||||||
|
|
@ -126,6 +142,10 @@ This method is the opposite of [`method: Request.redirectedFrom`]:
|
||||||
console.log(request.redirectedFrom().redirectedTo() === request); // true
|
console.log(request.redirectedFrom().redirectedTo() === request); // true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
System.out.println(request.redirectedFrom().redirectedTo() == request); // true
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
assert request.redirected_from.redirected_to == request
|
assert request.redirected_from.redirected_to == request
|
||||||
```
|
```
|
||||||
|
|
@ -175,6 +195,14 @@ const [request] = await Promise.all([
|
||||||
console.log(request.timing());
|
console.log(request.timing());
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onRequestFinished(request -> {
|
||||||
|
Timing timing = request.timing();
|
||||||
|
System.out.println(timing.responseEnd - timing.startTime);
|
||||||
|
});
|
||||||
|
page.navigate("http://example.com");
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async with page.expect_event("requestfinished") as request_info:
|
async with page.expect_event("requestfinished") as request_info:
|
||||||
await page.goto("http://example.com")
|
await page.goto("http://example.com")
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,16 @@ await page.route('**/*', (route, request) => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.route("**/*", route -> {
|
||||||
|
// Override headers
|
||||||
|
Map<String, String> headers = new HashMap<>(route.request().headers());
|
||||||
|
headers.put("foo", "bar"); // set "foo" header
|
||||||
|
headers.remove("origin"); // remove "origin" header
|
||||||
|
route.resume(new Route.ResumeOptions().withHeaders(headers));
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
async def handle(route, request):
|
async def handle(route, request):
|
||||||
# override headers
|
# override headers
|
||||||
|
|
@ -110,6 +120,15 @@ await page.route('**/*', route => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.route("**/*", route -> {
|
||||||
|
route.fulfill(new Route.FulfillOptions()
|
||||||
|
.withStatus(404)
|
||||||
|
.withContentType("text/plain")
|
||||||
|
.withBody("Not Found!"));
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.route("**/*", lambda route: route.fulfill(
|
await page.route("**/*", lambda route: route.fulfill(
|
||||||
status=404,
|
status=404,
|
||||||
|
|
@ -130,6 +149,11 @@ An example of serving static file:
|
||||||
await page.route('**/xhr_endpoint', route => route.fulfill({ path: 'mock_data.json' }));
|
await page.route('**/xhr_endpoint', route => route.fulfill({ path: 'mock_data.json' }));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.route("**/xhr_endpoint", route -> route.fulfill(
|
||||||
|
new Route.FulfillOptions().withPath(Paths.get("mock_data.json")));
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
await page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
|
await page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# class: Selectors
|
# class: Selectors
|
||||||
|
|
||||||
Selectors can be used to install custom selector engines. See
|
Selectors can be used to install custom selector engines. See [Working with selectors](./selectors.md) for more
|
||||||
[Working with selectors](./selectors.md) for more information.
|
information.
|
||||||
|
|
||||||
## async method: Selectors.register
|
## async method: Selectors.register
|
||||||
|
|
||||||
|
|
@ -42,6 +42,32 @@ const { selectors, firefox } = require('playwright'); // Or 'chromium' or 'webk
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Script that evaluates to a selector engine instance.
|
||||||
|
String createTagNameEngine = "{\n" +
|
||||||
|
" // Returns the first element matching given selector in the root's subtree.\n" +
|
||||||
|
" query(root, selector) {\n" +
|
||||||
|
" return root.querySelector(selector);\n" +
|
||||||
|
" },\n" +
|
||||||
|
" // Returns all elements matching given selector in the root's subtree.\n" +
|
||||||
|
" queryAll(root, selector) {\n" +
|
||||||
|
" return Array.from(root.querySelectorAll(selector));\n" +
|
||||||
|
" }\n" +
|
||||||
|
"}";
|
||||||
|
// Register the engine. Selectors will be prefixed with "tag=".
|
||||||
|
playwright.selectors().register("tag", createTagNameEngine);
|
||||||
|
Browser browser = playwright.firefox().launch();
|
||||||
|
Page page = browser.newPage();
|
||||||
|
page.setContent("<div><button>Click me</button></div>");
|
||||||
|
// Use the selector prefixed with its name.
|
||||||
|
ElementHandle button = page.querySelector("tag=button");
|
||||||
|
// Combine it with other selector engines.
|
||||||
|
page.click("tag=div >> text=\"Click me\"");
|
||||||
|
// Can use it in any methods supporting selectors.
|
||||||
|
int buttonCount = (int) page.evalOnSelectorAll("tag=button", "buttons => buttons.length");
|
||||||
|
browser.close();
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
# FIXME: add snippet
|
# FIXME: add snippet
|
||||||
```
|
```
|
||||||
|
|
@ -76,4 +102,4 @@ Script that evaluates to a selector engine instance.
|
||||||
|
|
||||||
Whether to run this selector engine in isolated JavaScript environment. This environment has access to the same DOM, but
|
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
|
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.
|
guaranteed when this engine is used together with other registered engines.
|
||||||
|
|
@ -6,6 +6,10 @@ When browser context is created with the `videosPath` option, each page has a vi
|
||||||
console.log(await page.video().path());
|
console.log(await page.video().path());
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
System.out.println(page.video().path());
|
||||||
|
```
|
||||||
|
|
||||||
```python async
|
```python async
|
||||||
print(await page.video.path())
|
print(await page.video.path())
|
||||||
```
|
```
|
||||||
|
|
@ -18,4 +22,4 @@ print(page.video.path())
|
||||||
- returns: <[path]>
|
- returns: <[path]>
|
||||||
|
|
||||||
Returns the file system path this video will be recorded to. The video is guaranteed to be written to the filesystem
|
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.
|
upon closing the browser context.
|
||||||
|
|
@ -15,6 +15,16 @@ for (const worker of page.workers())
|
||||||
console.log(' ' + worker.url());
|
console.log(' ' + worker.url());
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
page.onWorker(worker -> {
|
||||||
|
System.out.println("Worker created: " + worker.url());
|
||||||
|
worker.onClose(worker1 -> System.out.println("Worker destroyed: " + worker1.url()));
|
||||||
|
});
|
||||||
|
System.out.println("Current workers:");
|
||||||
|
for (Worker worker : page.workers())
|
||||||
|
System.out.println(" " + worker.url());
|
||||||
|
```
|
||||||
|
|
||||||
```py
|
```py
|
||||||
def handle_worker(worker):
|
def handle_worker(worker):
|
||||||
print("worker created: " + worker.url)
|
print("worker created: " + worker.url)
|
||||||
|
|
|
||||||
52
types/types.d.ts
vendored
52
types/types.d.ts
vendored
|
|
@ -4576,11 +4576,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -4607,11 +4607,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -4638,11 +4638,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -4669,11 +4669,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -4700,11 +4700,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -5113,11 +5113,11 @@ export interface BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8627,11 +8627,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8670,11 +8670,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8713,11 +8713,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8756,11 +8756,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8799,11 +8799,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -8858,11 +8858,11 @@ export interface ChromiumBrowserContext extends BrowserContext {
|
||||||
* done and its response has started loading in the popup.
|
* done and its response has started loading in the popup.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* const [page] = await Promise.all([
|
* const [newPage] = await Promise.all([
|
||||||
* context.waitForEvent('page'),
|
* context.waitForEvent('page'),
|
||||||
* page.click('a[target=_blank]'),
|
* page.click('a[target=_blank]'),
|
||||||
* ]);
|
* ]);
|
||||||
* console.log(await page.evaluate('location.href'));
|
* console.log(await newPage.evaluate('location.href'));
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* > NOTE: Use
|
* > NOTE: Use
|
||||||
|
|
@ -9052,9 +9052,9 @@ export interface ConsoleMessage {
|
||||||
* page.on('dialog', async dialog => {
|
* page.on('dialog', async dialog => {
|
||||||
* console.log(dialog.message());
|
* console.log(dialog.message());
|
||||||
* await dialog.dismiss();
|
* await dialog.dismiss();
|
||||||
* await browser.close();
|
|
||||||
* });
|
* });
|
||||||
* page.evaluate(() => alert('1'));
|
* await page.evaluate(() => alert('1'));
|
||||||
|
* await browser.close();
|
||||||
* })();
|
* })();
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
|
|
|
||||||
154
utils/doclint/generateJavaSnippets.js
Normal file
154
utils/doclint/generateJavaSnippets.js
Normal file
|
|
@ -0,0 +1,154 @@
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const md = require("../markdown");
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string[]} input
|
||||||
|
*/
|
||||||
|
function transformValue(input) {
|
||||||
|
const out = [];
|
||||||
|
const suffix = [];
|
||||||
|
for (let line of input) {
|
||||||
|
let match = line.match(/const { (\w+) } = require\('playwright'\);/);
|
||||||
|
if (match) {
|
||||||
|
out.push('import com.microsoft.playwright.*;');
|
||||||
|
out.push('');
|
||||||
|
out.push('public class Example {');
|
||||||
|
out.push(' public static void main(String[] args) {');
|
||||||
|
out.push(' try (Playwright playwright = Playwright.create()) {');
|
||||||
|
out.push(` BrowserType ${match[1]} = playwright.${match[1]}();`);
|
||||||
|
suffix.push(' }');
|
||||||
|
suffix.push(' }');
|
||||||
|
suffix.push('}');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (line.trim() === '(async () => {' || line.trim() === '})();')
|
||||||
|
continue;
|
||||||
|
if (!line)
|
||||||
|
continue;
|
||||||
|
if (line.trim() === '}')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Remove await/Promise.all
|
||||||
|
line = line.replace(/const \[(.+)\] = await Promise.all\(\[/g, '$1 =');
|
||||||
|
line = line.replace(/Promise\.all\(\[/g, '');
|
||||||
|
line = line.replace(/await /g, '');
|
||||||
|
|
||||||
|
// Rename some methods
|
||||||
|
line = line.replace(/\.goto\(/g, '.navigate(');
|
||||||
|
line = line.replace(/\.continue\(/g, '.resume(');
|
||||||
|
line = line.replace(/\.\$eval\(/g, '.evalOnSelector(');
|
||||||
|
line = line.replace(/\.\$\$eval\(/g, '.evalOnSelectorAll(');
|
||||||
|
line = line.replace(/\.\$\(/g, '.querySelector(');
|
||||||
|
line = line.replace(/\.\$\$\(/g, '.querySelectorAll(');
|
||||||
|
|
||||||
|
line = line.replace(/console.log/g, 'System.out.println');
|
||||||
|
|
||||||
|
line = line.replace(/page.evaluate\((\(\) => [^\)]+)\)/g, 'page.evaluate("$1")');
|
||||||
|
|
||||||
|
// Convert properties to methods
|
||||||
|
line = line.replace(/\.keyboard\./g, '.keyboard().');
|
||||||
|
line = line.replace(/\.mouse\./g, '.mouse().');
|
||||||
|
line = line.replace(/\.coverage\./g, '.coverage().');
|
||||||
|
line = line.replace(/\.accessibility\./g, '.accessibility().');
|
||||||
|
line = line.replace(/\.chromium\./g, '.chromium().');
|
||||||
|
line = line.replace(/\.webkit\./g, '.webkit().');
|
||||||
|
line = line.replace(/\.firefox\./g, '.firefox().');
|
||||||
|
line = line.replace(/\.length/g, '.size()');
|
||||||
|
|
||||||
|
// JUnit asserts
|
||||||
|
line = line.replace(/expect\((.+)\).toBeTruthy\(\);/g, 'assertNotNull($1);');
|
||||||
|
line = line.replace(/expect\(error.message\)\.toContain\((.+)\);/g, 'assertTrue(e.getMessage().contains($1));');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toContain\((.+)\);/g, 'assertTrue($1.contains($2));');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toBe\(null\);/g, 'assertNull($1);');
|
||||||
|
line = line.replace(/expect\((.+)\)\.not.toBe\(null\);/g, 'assertNotNull($1);');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toBe\(true\);/g, 'assertTrue($1);');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toBe\((.+)\);/g, 'assertEquals($2, $1);');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toEqual\(\[(.+)\]\);/g, 'assertEquals(Arrays.asList($2), $1);');
|
||||||
|
line = line.replace(/expect\((.+)\)\.toEqual\((.+)\);/g, 'assertEquals($2, $1);');
|
||||||
|
|
||||||
|
line = line.replace(/\[('[^']+')\]/g, '.get("$1")');
|
||||||
|
line = line.replace(/.push\(/g, '.add(');
|
||||||
|
|
||||||
|
// Define common types
|
||||||
|
line = line.replace(/const browser = /g, 'Browser browser = ');
|
||||||
|
line = line.replace(/const context = /g, 'BrowserContext context = ');
|
||||||
|
line = line.replace(/const page = /g, 'Page page = ');
|
||||||
|
line = line.replace(/const newPage = /g, 'Page newPage = ');
|
||||||
|
line = line.replace(/const button/g, 'ElementHandle button');
|
||||||
|
line = line.replace(/const result = /g, 'Object result = ');
|
||||||
|
line = line.replace(/const response = /g, 'Response response = ');
|
||||||
|
line = line.replace(/const request = /g, 'Request request = ');
|
||||||
|
line = line.replace(/const requests = \[\];/g, 'List<Request> requests = new ArrayList<>();');
|
||||||
|
line = line.replace(/const snapshot = page.accessibility/g, 'String snapshot = page.accessibility');
|
||||||
|
line = line.replace(/snapshot\.children\./g, 'snapshot.children().');
|
||||||
|
line = line.replace(/const (.+) = \[\];/g, 'List<> $1 = new ArrayList<>();');
|
||||||
|
line = line.replace(/const (\w+ = .+evalOnSelector)/g, 'Object $1');
|
||||||
|
line = line.replace(/const (\w+ = .+querySelector)/g, 'ElementHandle $1');
|
||||||
|
line = line.replace(/const (.+= page.waitForNavigation)/g, 'Response $1');
|
||||||
|
line = line.replace(/const messages = \[\]/g, 'List<String> messages = new ArrayList<>()');
|
||||||
|
line = line.replace(/const frame = /g, 'Frame frame = ');
|
||||||
|
line = line.replace(/const elementHandle = (.+)/g, 'JSHandle jsHandle = $1\n ElementHandle elementHandle = jsHandle.asElement();\n');
|
||||||
|
line = line.replace(/const (\w+ = \w+\.boundingBox)/g, 'BoundingBox $1');
|
||||||
|
line = line.replace(/setViewportSize\({ width: (\d+), height: (\d+) }\)/g, 'setViewportSize($1, $2)');
|
||||||
|
line = line.replace(/\.on\('([^']+)'/g, (match, p1, offset, string) => `.on${toTitleCase(p1)}(`);
|
||||||
|
line = line.replace(/\.waitForEvent\('([^']+)'/g, (match, p1, offset, string) => `page.waitFor${toTitleCase(p1)}(() -> {})`);
|
||||||
|
|
||||||
|
line = line.replace(/[`']/g, '"');
|
||||||
|
|
||||||
|
out.push(line)
|
||||||
|
}
|
||||||
|
return [...out, ...suffix].join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
*/
|
||||||
|
function toTitleCase(name) {
|
||||||
|
return name[0].toUpperCase() + name.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {md.MarkdownNode} node
|
||||||
|
*/
|
||||||
|
function generateComment(node) {
|
||||||
|
const commentNode = md.clone(node)
|
||||||
|
commentNode.codeLang = 'java';
|
||||||
|
commentNode.lines = ['// FIXME', ...transformValue(node.lines).split("\n")];
|
||||||
|
return commentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {md.MarkdownNode[]} spec
|
||||||
|
*/
|
||||||
|
function multiplyComment(spec) {
|
||||||
|
const children = []
|
||||||
|
for (const node of (spec || [])) {
|
||||||
|
if (node.codeLang === "js")
|
||||||
|
children.push(node, generateComment(node));
|
||||||
|
else
|
||||||
|
children.push(node);
|
||||||
|
}
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const name of fs.readdirSync("docs/src/api")) {
|
||||||
|
if (!name.endsWith(".md"))
|
||||||
|
continue;
|
||||||
|
if (name.includes('android'))
|
||||||
|
continue;
|
||||||
|
const inputFile = `docs/src/api/${name}`;
|
||||||
|
const fileline = fs.readFileSync(inputFile).toString();
|
||||||
|
const nodes = md.parse(fileline);
|
||||||
|
|
||||||
|
md.visitAll(nodes, node => {
|
||||||
|
if (node.children)
|
||||||
|
node.children = multiplyComment(node.children);
|
||||||
|
});
|
||||||
|
|
||||||
|
const out = md.render(nodes, 120);
|
||||||
|
fs.writeFileSync(inputFile, out);
|
||||||
|
}
|
||||||
|
|
@ -227,7 +227,7 @@ function render(nodes, maxColumns) {
|
||||||
*/
|
*/
|
||||||
function innerRenderMdNode(indent, node, lastNode, result, maxColumns) {
|
function innerRenderMdNode(indent, node, lastNode, result, maxColumns) {
|
||||||
const newLine = () => {
|
const newLine = () => {
|
||||||
if (result[result.length - 1] !== '')
|
if (result.length && result[result.length - 1] !== '')
|
||||||
result.push('');
|
result.push('');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue