playwright-ruby-client 0.2.0 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +17 -5
- data/docs/api_coverage.md +116 -74
- data/lib/playwright.rb +48 -9
- data/lib/playwright/channel.rb +12 -2
- data/lib/playwright/channel_owners/artifact.rb +30 -0
- data/lib/playwright/channel_owners/binding_call.rb +3 -0
- data/lib/playwright/channel_owners/browser.rb +21 -0
- data/lib/playwright/channel_owners/browser_context.rb +154 -3
- data/lib/playwright/channel_owners/browser_type.rb +28 -0
- data/lib/playwright/channel_owners/dialog.rb +28 -0
- data/lib/playwright/channel_owners/element_handle.rb +6 -4
- data/lib/playwright/channel_owners/frame.rb +25 -2
- data/lib/playwright/channel_owners/js_handle.rb +2 -2
- data/lib/playwright/channel_owners/page.rb +141 -25
- data/lib/playwright/channel_owners/playwright.rb +24 -27
- data/lib/playwright/channel_owners/request.rb +26 -2
- data/lib/playwright/channel_owners/response.rb +60 -0
- data/lib/playwright/channel_owners/route.rb +78 -0
- data/lib/playwright/channel_owners/selectors.rb +19 -1
- data/lib/playwright/channel_owners/stream.rb +15 -0
- data/lib/playwright/connection.rb +11 -32
- data/lib/playwright/download.rb +27 -0
- data/lib/playwright/errors.rb +6 -0
- data/lib/playwright/events.rb +2 -5
- data/lib/playwright/keyboard_impl.rb +1 -1
- data/lib/playwright/mouse_impl.rb +41 -0
- data/lib/playwright/playwright_api.rb +3 -1
- data/lib/playwright/route_handler_entry.rb +28 -0
- data/lib/playwright/transport.rb +29 -7
- data/lib/playwright/url_matcher.rb +1 -1
- data/lib/playwright/utils.rb +9 -0
- data/lib/playwright/version.rb +1 -1
- data/lib/playwright/video.rb +51 -0
- data/lib/playwright/wait_helper.rb +2 -2
- data/lib/playwright_api/accessibility.rb +39 -1
- data/lib/playwright_api/android.rb +74 -2
- data/lib/playwright_api/android_device.rb +141 -23
- data/lib/playwright_api/android_input.rb +17 -13
- data/lib/playwright_api/android_socket.rb +16 -0
- data/lib/playwright_api/android_web_view.rb +21 -0
- data/lib/playwright_api/browser.rb +77 -2
- data/lib/playwright_api/browser_context.rb +182 -29
- data/lib/playwright_api/browser_type.rb +40 -9
- data/lib/playwright_api/dialog.rb +54 -7
- data/lib/playwright_api/element_handle.rb +105 -31
- data/lib/playwright_api/file_chooser.rb +6 -1
- data/lib/playwright_api/frame.rb +229 -36
- data/lib/playwright_api/js_handle.rb +23 -0
- data/lib/playwright_api/keyboard.rb +48 -1
- data/lib/playwright_api/mouse.rb +26 -5
- data/lib/playwright_api/page.rb +491 -81
- data/lib/playwright_api/playwright.rb +21 -4
- data/lib/playwright_api/request.rb +30 -2
- data/lib/playwright_api/response.rb +21 -11
- data/lib/playwright_api/route.rb +51 -5
- data/lib/playwright_api/selectors.rb +27 -1
- data/lib/playwright_api/touchscreen.rb +1 -1
- data/lib/playwright_api/worker.rb +25 -1
- data/playwright.gemspec +4 -2
- metadata +42 -14
- data/lib/playwright/channel_owners/chromium_browser.rb +0 -8
- data/lib/playwright/channel_owners/chromium_browser_context.rb +0 -8
- data/lib/playwright/channel_owners/download.rb +0 -27
- data/lib/playwright/channel_owners/firefox_browser.rb +0 -8
- data/lib/playwright/channel_owners/webkit_browser.rb +0 -8
- data/lib/playwright_api/binding_call.rb +0 -27
- data/lib/playwright_api/chromium_browser_context.rb +0 -59
- data/lib/playwright_api/download.rb +0 -95
- data/lib/playwright_api/video.rb +0 -24
@@ -8,6 +8,11 @@ module Playwright
|
|
8
8
|
# // ...
|
9
9
|
# ```
|
10
10
|
#
|
11
|
+
# ```java
|
12
|
+
# JSHandle windowHandle = page.evaluateHandle("() => window");
|
13
|
+
# // ...
|
14
|
+
# ```
|
15
|
+
#
|
11
16
|
# ```python async
|
12
17
|
# window_handle = await page.evaluate_handle("window")
|
13
18
|
# # ...
|
@@ -50,6 +55,11 @@ module Playwright
|
|
50
55
|
# expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10 retweets');
|
51
56
|
# ```
|
52
57
|
#
|
58
|
+
# ```java
|
59
|
+
# ElementHandle tweetHandle = page.querySelector(".tweet .retweets");
|
60
|
+
# assertEquals("10 retweets", tweetHandle.evaluate("node => node.innerText"));
|
61
|
+
# ```
|
62
|
+
#
|
53
63
|
# ```python async
|
54
64
|
# tweet_handle = await page.query_selector(".tweet .retweets")
|
55
65
|
# assert await tweet_handle.evaluate("node => node.innerText") == "10 retweets"
|
@@ -89,6 +99,14 @@ module Playwright
|
|
89
99
|
# await handle.dispose();
|
90
100
|
# ```
|
91
101
|
#
|
102
|
+
# ```java
|
103
|
+
# JSHandle handle = page.evaluateHandle("() => ({window, document}"););
|
104
|
+
# Map<String, JSHandle> properties = handle.getProperties();
|
105
|
+
# JSHandle windowHandle = properties.get("window");
|
106
|
+
# JSHandle documentHandle = properties.get("document");
|
107
|
+
# handle.dispose();
|
108
|
+
# ```
|
109
|
+
#
|
92
110
|
# ```python async
|
93
111
|
# handle = await page.evaluate_handle("{window, document}")
|
94
112
|
# properties = await handle.get_properties()
|
@@ -122,6 +140,11 @@ module Playwright
|
|
122
140
|
wrap_impl(@impl.json_value)
|
123
141
|
end
|
124
142
|
|
143
|
+
# @nodoc
|
144
|
+
def to_s
|
145
|
+
wrap_impl(@impl.to_s)
|
146
|
+
end
|
147
|
+
|
125
148
|
# -- inherited from EventEmitter --
|
126
149
|
# @nodoc
|
127
150
|
def once(event, callback)
|
@@ -21,6 +21,17 @@ module Playwright
|
|
21
21
|
# // Result text will end up saying 'Hello!'
|
22
22
|
# ```
|
23
23
|
#
|
24
|
+
# ```java
|
25
|
+
# page.keyboard().type("Hello World!");
|
26
|
+
# page.keyboard().press("ArrowLeft");
|
27
|
+
# page.keyboard().down("Shift");
|
28
|
+
# for (int i = 0; i < " World".length(); i++)
|
29
|
+
# page.keyboard().press("ArrowLeft");
|
30
|
+
# page.keyboard().up("Shift");
|
31
|
+
# page.keyboard().press("Backspace");
|
32
|
+
# // Result text will end up saying "Hello!"
|
33
|
+
# ```
|
34
|
+
#
|
24
35
|
# ```python async
|
25
36
|
# await page.keyboard.type("Hello World!")
|
26
37
|
# await page.keyboard.press("ArrowLeft")
|
@@ -52,6 +63,12 @@ module Playwright
|
|
52
63
|
# await page.keyboard.press('Shift+A');
|
53
64
|
# ```
|
54
65
|
#
|
66
|
+
# ```java
|
67
|
+
# page.keyboard().press("Shift+KeyA");
|
68
|
+
# // or
|
69
|
+
# page.keyboard().press("Shift+A");
|
70
|
+
# ```
|
71
|
+
#
|
55
72
|
# ```python async
|
56
73
|
# await page.keyboard.press("Shift+KeyA")
|
57
74
|
# # or
|
@@ -74,6 +91,13 @@ module Playwright
|
|
74
91
|
# await page.keyboard.press('Meta+A');
|
75
92
|
# ```
|
76
93
|
#
|
94
|
+
# ```java
|
95
|
+
# // on Windows and Linux
|
96
|
+
# page.keyboard().press("Control+A");
|
97
|
+
# // on macOS
|
98
|
+
# page.keyboard().press("Meta+A");
|
99
|
+
# ```
|
100
|
+
#
|
77
101
|
# ```python async
|
78
102
|
# # on windows and linux
|
79
103
|
# await page.keyboard.press("Control+A")
|
@@ -124,6 +148,10 @@ module Playwright
|
|
124
148
|
# page.keyboard.insertText('嗨');
|
125
149
|
# ```
|
126
150
|
#
|
151
|
+
# ```java
|
152
|
+
# page.keyboard().insertText("嗨");
|
153
|
+
# ```
|
154
|
+
#
|
127
155
|
# ```python async
|
128
156
|
# await page.keyboard.insert_text("嗨")
|
129
157
|
# ```
|
@@ -151,7 +179,7 @@ module Playwright
|
|
151
179
|
# If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
152
180
|
# texts.
|
153
181
|
#
|
154
|
-
# Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When
|
182
|
+
# Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
|
155
183
|
# modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
156
184
|
#
|
157
185
|
#
|
@@ -167,6 +195,18 @@ module Playwright
|
|
167
195
|
# await browser.close();
|
168
196
|
# ```
|
169
197
|
#
|
198
|
+
# ```java
|
199
|
+
# Page page = browser.newPage();
|
200
|
+
# page.navigate("https://keycode.info");
|
201
|
+
# page.keyboard().press("A");
|
202
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("A.png"));
|
203
|
+
# page.keyboard().press("ArrowLeft");
|
204
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("ArrowLeft.png")));
|
205
|
+
# page.keyboard().press("Shift+O");
|
206
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("O.png")));
|
207
|
+
# browser.close();
|
208
|
+
# ```
|
209
|
+
#
|
170
210
|
# ```python async
|
171
211
|
# page = await browser.new_page()
|
172
212
|
# await page.goto("https://keycode.info")
|
@@ -206,6 +246,13 @@ module Playwright
|
|
206
246
|
# await page.keyboard.type('World', {delay: 100}); // Types slower, like a user
|
207
247
|
# ```
|
208
248
|
#
|
249
|
+
# ```java
|
250
|
+
# // Types instantly
|
251
|
+
# page.keyboard().type("Hello");
|
252
|
+
# // Types slower, like a user
|
253
|
+
# page.keyboard().type("World", new Keyboard.TypeOptions().setDelay(100));
|
254
|
+
# ```
|
255
|
+
#
|
209
256
|
# ```python async
|
210
257
|
# await page.keyboard.type("Hello") # types instantly
|
211
258
|
# await page.keyboard.type("World", delay=100) # types slower, like a user
|
data/lib/playwright_api/mouse.rb
CHANGED
@@ -15,6 +15,17 @@ module Playwright
|
|
15
15
|
# await page.mouse.up();
|
16
16
|
# ```
|
17
17
|
#
|
18
|
+
# ```java
|
19
|
+
# // Using ‘page.mouse’ to trace a 100x100 square.
|
20
|
+
# page.mouse().move(0, 0);
|
21
|
+
# page.mouse().down();
|
22
|
+
# page.mouse().move(0, 100);
|
23
|
+
# page.mouse().move(100, 100);
|
24
|
+
# page.mouse().move(100, 0);
|
25
|
+
# page.mouse().move(0, 0);
|
26
|
+
# page.mouse().up();
|
27
|
+
# ```
|
28
|
+
#
|
18
29
|
# ```python async
|
19
30
|
# # using ‘page.mouse’ to trace a 100x100 square.
|
20
31
|
# await page.mouse.move(0, 0)
|
@@ -36,6 +47,16 @@ module Playwright
|
|
36
47
|
# page.mouse.move(0, 0)
|
37
48
|
# page.mouse.up()
|
38
49
|
# ```
|
50
|
+
#
|
51
|
+
# ```csharp
|
52
|
+
# await Page.Mouse.MoveAsync(0, 0);
|
53
|
+
# await Page.Mouse.DownAsync();
|
54
|
+
# await Page.Mouse.MoveAsync(0, 100);
|
55
|
+
# await Page.Mouse.MoveAsync(100, 100);
|
56
|
+
# await Page.Mouse.MoveAsync(100, 0);
|
57
|
+
# await Page.Mouse.MoveAsync(0, 0);
|
58
|
+
# await Page.Mouse.UpAsync();
|
59
|
+
# ```
|
39
60
|
class Mouse < PlaywrightApi
|
40
61
|
|
41
62
|
# Shortcut for [`method: Mouse.move`], [`method: Mouse.down`], [`method: Mouse.up`].
|
@@ -45,28 +66,28 @@ module Playwright
|
|
45
66
|
button: nil,
|
46
67
|
clickCount: nil,
|
47
68
|
delay: nil)
|
48
|
-
|
69
|
+
wrap_impl(@impl.click(unwrap_impl(x), unwrap_impl(y), button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay)))
|
49
70
|
end
|
50
71
|
|
51
72
|
# Shortcut for [`method: Mouse.move`], [`method: Mouse.down`], [`method: Mouse.up`], [`method: Mouse.down`] and
|
52
73
|
# [`method: Mouse.up`].
|
53
74
|
def dblclick(x, y, button: nil, delay: nil)
|
54
|
-
|
75
|
+
wrap_impl(@impl.dblclick(unwrap_impl(x), unwrap_impl(y), button: unwrap_impl(button), delay: unwrap_impl(delay)))
|
55
76
|
end
|
56
77
|
|
57
78
|
# Dispatches a `mousedown` event.
|
58
79
|
def down(button: nil, clickCount: nil)
|
59
|
-
|
80
|
+
wrap_impl(@impl.down(button: unwrap_impl(button), clickCount: unwrap_impl(clickCount)))
|
60
81
|
end
|
61
82
|
|
62
83
|
# Dispatches a `mousemove` event.
|
63
84
|
def move(x, y, steps: nil)
|
64
|
-
|
85
|
+
wrap_impl(@impl.move(unwrap_impl(x), unwrap_impl(y), steps: unwrap_impl(steps)))
|
65
86
|
end
|
66
87
|
|
67
88
|
# Dispatches a `mouseup` event.
|
68
89
|
def up(button: nil, clickCount: nil)
|
69
|
-
|
90
|
+
wrap_impl(@impl.up(button: unwrap_impl(button), clickCount: unwrap_impl(clickCount)))
|
70
91
|
end
|
71
92
|
end
|
72
93
|
end
|
data/lib/playwright_api/page.rb
CHANGED
@@ -21,6 +21,24 @@ module Playwright
|
|
21
21
|
# })();
|
22
22
|
# ```
|
23
23
|
#
|
24
|
+
# ```java
|
25
|
+
# import com.microsoft.playwright.*;
|
26
|
+
#
|
27
|
+
# public class Example {
|
28
|
+
# public static void main(String[] args) {
|
29
|
+
# try (Playwright playwright = Playwright.create()) {
|
30
|
+
# BrowserType webkit = playwright.webkit();
|
31
|
+
# Browser browser = webkit.launch();
|
32
|
+
# BrowserContext context = browser.newContext();
|
33
|
+
# Page page = context.newPage();
|
34
|
+
# page.navigate("https://example.com");
|
35
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("screenshot.png")));
|
36
|
+
# browser.close();
|
37
|
+
# }
|
38
|
+
# }
|
39
|
+
# }
|
40
|
+
# ```
|
41
|
+
#
|
24
42
|
# ```python async
|
25
43
|
# import asyncio
|
26
44
|
# from playwright.async_api import async_playwright
|
@@ -67,6 +85,10 @@ module Playwright
|
|
67
85
|
# page.once('load', () => console.log('Page loaded!'));
|
68
86
|
# ```
|
69
87
|
#
|
88
|
+
# ```java
|
89
|
+
# page.onLoad(p -> System.out.println("Page loaded!"));
|
90
|
+
# ```
|
91
|
+
#
|
70
92
|
# ```py
|
71
93
|
# page.once("load", lambda: print("page loaded!"))
|
72
94
|
# ```
|
@@ -83,6 +105,15 @@ module Playwright
|
|
83
105
|
# page.removeListener('request', logRequest);
|
84
106
|
# ```
|
85
107
|
#
|
108
|
+
# ```java
|
109
|
+
# Consumer<Request> logRequest = interceptedRequest -> {
|
110
|
+
# System.out.println("A request was made: " + interceptedRequest.url());
|
111
|
+
# };
|
112
|
+
# page.onRequest(logRequest);
|
113
|
+
# // Sometime later...
|
114
|
+
# page.offRequest(logRequest);
|
115
|
+
# ```
|
116
|
+
#
|
86
117
|
# ```py
|
87
118
|
# def log_request(intercepted_request):
|
88
119
|
# print("a request was made:", intercepted_request.url)
|
@@ -130,6 +161,11 @@ module Playwright
|
|
130
161
|
# await page.addInitScript({ path: './preload.js' });
|
131
162
|
# ```
|
132
163
|
#
|
164
|
+
# ```java
|
165
|
+
# // In your playwright script, assuming the preload.js file is in same directory
|
166
|
+
# page.addInitScript(Paths.get("./preload.js"));
|
167
|
+
# ```
|
168
|
+
#
|
133
169
|
# ```python async
|
134
170
|
# # in your playwright script, assuming the preload.js file is in same directory
|
135
171
|
# await page.add_init_script(path="./preload.js")
|
@@ -168,34 +204,39 @@ module Playwright
|
|
168
204
|
end
|
169
205
|
|
170
206
|
# This method checks an element matching `selector` by performing the following steps:
|
171
|
-
# 1. Find an element
|
172
|
-
# 1. Ensure that matched element is a checkbox or a radio input. If not, this method
|
207
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
208
|
+
# 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
|
173
209
|
# checked, this method returns immediately.
|
174
210
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
175
211
|
# element is detached during the checks, the whole action is retried.
|
176
212
|
# 1. Scroll the element into view if needed.
|
177
213
|
# 1. Use [`property: Page.mouse`] to click in the center of the element.
|
178
214
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
179
|
-
# 1. Ensure that the element is now checked. If not, this method
|
215
|
+
# 1. Ensure that the element is now checked. If not, this method throws.
|
180
216
|
#
|
181
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
182
|
-
#
|
217
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
218
|
+
# zero timeout disables this.
|
183
219
|
#
|
184
220
|
# Shortcut for main frame's [`method: Frame.check`].
|
185
|
-
def check(
|
186
|
-
|
221
|
+
def check(
|
222
|
+
selector,
|
223
|
+
force: nil,
|
224
|
+
noWaitAfter: nil,
|
225
|
+
position: nil,
|
226
|
+
timeout: nil)
|
227
|
+
wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout)))
|
187
228
|
end
|
188
229
|
|
189
230
|
# This method clicks an element matching `selector` by performing the following steps:
|
190
|
-
# 1. Find an element
|
231
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
191
232
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
192
233
|
# element is detached during the checks, the whole action is retried.
|
193
234
|
# 1. Scroll the element into view if needed.
|
194
235
|
# 1. Use [`property: Page.mouse`] to click in the center of the element, or the specified `position`.
|
195
236
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
196
237
|
#
|
197
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
198
|
-
#
|
238
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
239
|
+
# zero timeout disables this.
|
199
240
|
#
|
200
241
|
# Shortcut for main frame's [`method: Frame.click`].
|
201
242
|
def click(
|
@@ -233,16 +274,16 @@ module Playwright
|
|
233
274
|
end
|
234
275
|
|
235
276
|
# This method double clicks an element matching `selector` by performing the following steps:
|
236
|
-
# 1. Find an element
|
277
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
237
278
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
238
279
|
# element is detached during the checks, the whole action is retried.
|
239
280
|
# 1. Scroll the element into view if needed.
|
240
281
|
# 1. Use [`property: Page.mouse`] to double click in the center of the element, or the specified `position`.
|
241
282
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the
|
242
|
-
# first click of the `dblclick()` triggers a navigation event, this method will
|
283
|
+
# first click of the `dblclick()` triggers a navigation event, this method will throw.
|
243
284
|
#
|
244
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
245
|
-
#
|
285
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
286
|
+
# zero timeout disables this.
|
246
287
|
#
|
247
288
|
# > NOTE: `page.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
248
289
|
#
|
@@ -259,8 +300,8 @@ module Playwright
|
|
259
300
|
wrap_impl(@impl.dblclick(unwrap_impl(selector), button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout)))
|
260
301
|
end
|
261
302
|
|
262
|
-
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the
|
263
|
-
# is dispatched. This is
|
303
|
+
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
304
|
+
# `click` is dispatched. This is equivalent to calling
|
264
305
|
# [element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
|
265
306
|
#
|
266
307
|
#
|
@@ -268,6 +309,10 @@ module Playwright
|
|
268
309
|
# await page.dispatchEvent('button#submit', 'click');
|
269
310
|
# ```
|
270
311
|
#
|
312
|
+
# ```java
|
313
|
+
# page.dispatchEvent("button#submit", "click");
|
314
|
+
# ```
|
315
|
+
#
|
271
316
|
# ```python async
|
272
317
|
# await page.dispatch_event("button#submit", "click")
|
273
318
|
# ```
|
@@ -297,6 +342,14 @@ module Playwright
|
|
297
342
|
# await page.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
298
343
|
# ```
|
299
344
|
#
|
345
|
+
# ```java
|
346
|
+
# // Note you can only create DataTransfer in Chromium and Firefox
|
347
|
+
# JSHandle dataTransfer = page.evaluateHandle("() => new DataTransfer()");
|
348
|
+
# Map<String, Object> arg = new HashMap<>();
|
349
|
+
# arg.put("dataTransfer", dataTransfer);
|
350
|
+
# page.dispatchEvent("#source", "dragstart", arg);
|
351
|
+
# ```
|
352
|
+
#
|
300
353
|
# ```python async
|
301
354
|
# # note you can only create data_transfer in chromium and firefox
|
302
355
|
# data_transfer = await page.evaluate_handle("new DataTransfer()")
|
@@ -312,7 +365,6 @@ module Playwright
|
|
312
365
|
wrap_impl(@impl.dispatch_event(unwrap_impl(selector), unwrap_impl(type), eventInit: unwrap_impl(eventInit), timeout: unwrap_impl(timeout)))
|
313
366
|
end
|
314
367
|
|
315
|
-
#
|
316
368
|
#
|
317
369
|
# ```js
|
318
370
|
# await page.evaluate(() => matchMedia('screen').matches);
|
@@ -333,6 +385,25 @@ module Playwright
|
|
333
385
|
# // → false
|
334
386
|
# ```
|
335
387
|
#
|
388
|
+
# ```java
|
389
|
+
# page.evaluate("() => matchMedia('screen').matches");
|
390
|
+
# // → true
|
391
|
+
# page.evaluate("() => matchMedia('print').matches");
|
392
|
+
# // → false
|
393
|
+
#
|
394
|
+
# page.emulateMedia(new Page.EmulateMediaOptions().setMedia(Media.PRINT));
|
395
|
+
# page.evaluate("() => matchMedia('screen').matches");
|
396
|
+
# // → false
|
397
|
+
# page.evaluate("() => matchMedia('print').matches");
|
398
|
+
# // → true
|
399
|
+
#
|
400
|
+
# page.emulateMedia(new Page.EmulateMediaOptions());
|
401
|
+
# page.evaluate("() => matchMedia('screen').matches");
|
402
|
+
# // → true
|
403
|
+
# page.evaluate("() => matchMedia('print').matches");
|
404
|
+
# // → false
|
405
|
+
# ```
|
406
|
+
#
|
336
407
|
# ```python async
|
337
408
|
# await page.evaluate("matchMedia('screen').matches")
|
338
409
|
# # → True
|
@@ -382,6 +453,16 @@ module Playwright
|
|
382
453
|
# // → false
|
383
454
|
# ```
|
384
455
|
#
|
456
|
+
# ```java
|
457
|
+
# page.emulateMedia(new Page.EmulateMediaOptions().setColorScheme(ColorScheme.DARK));
|
458
|
+
# page.evaluate("() => matchMedia('(prefers-color-scheme: dark)').matches");
|
459
|
+
# // → true
|
460
|
+
# page.evaluate("() => matchMedia('(prefers-color-scheme: light)').matches");
|
461
|
+
# // → false
|
462
|
+
# page.evaluate("() => matchMedia('(prefers-color-scheme: no-preference)').matches");
|
463
|
+
# // → false
|
464
|
+
# ```
|
465
|
+
#
|
385
466
|
# ```python async
|
386
467
|
# await page.emulate_media(color_scheme="dark")
|
387
468
|
# await page.evaluate("matchMedia('(prefers-color-scheme: dark)').matches")
|
@@ -419,6 +500,12 @@ module Playwright
|
|
419
500
|
# const html = await page.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
420
501
|
# ```
|
421
502
|
#
|
503
|
+
# ```java
|
504
|
+
# String searchValue = (String) page.evalOnSelector("#search", "el => el.value");
|
505
|
+
# String preloadHref = (String) page.evalOnSelector("link[rel=preload]", "el => el.href");
|
506
|
+
# String html = (String) page.evalOnSelector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
|
507
|
+
# ```
|
508
|
+
#
|
422
509
|
# ```python async
|
423
510
|
# search_value = await page.eval_on_selector("#search", "el => el.value")
|
424
511
|
# preload_href = await page.eval_on_selector("link[rel=preload]", "el => el.href")
|
@@ -449,6 +536,10 @@ module Playwright
|
|
449
536
|
# const divCounts = await page.$$eval('div', (divs, min) => divs.length >= min, 10);
|
450
537
|
# ```
|
451
538
|
#
|
539
|
+
# ```java
|
540
|
+
# boolean divCounts = (boolean) page.evalOnSelectorAll("div", "(divs, min) => divs.length >= min", 10);
|
541
|
+
# ```
|
542
|
+
#
|
452
543
|
# ```python async
|
453
544
|
# div_counts = await page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
454
545
|
# ```
|
@@ -479,6 +570,13 @@ module Playwright
|
|
479
570
|
# console.log(result); // prints "56"
|
480
571
|
# ```
|
481
572
|
#
|
573
|
+
# ```java
|
574
|
+
# Object result = page.evaluate("([x, y]) => {\n" +
|
575
|
+
# " return Promise.resolve(x * y);\n" +
|
576
|
+
# "}", Arrays.asList(7, 8));
|
577
|
+
# System.out.println(result); // prints "56"
|
578
|
+
# ```
|
579
|
+
#
|
482
580
|
# ```python async
|
483
581
|
# result = await page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
484
582
|
# print(result) # prints "56"
|
@@ -498,6 +596,10 @@ module Playwright
|
|
498
596
|
# console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
|
499
597
|
# ```
|
500
598
|
#
|
599
|
+
# ```java
|
600
|
+
# System.out.println(page.evaluate("1 + 2")); // prints "3"
|
601
|
+
# ```
|
602
|
+
#
|
501
603
|
# ```python async
|
502
604
|
# print(await page.evaluate("1 + 2")) # prints "3"
|
503
605
|
# x = 10
|
@@ -519,6 +621,12 @@ module Playwright
|
|
519
621
|
# await bodyHandle.dispose();
|
520
622
|
# ```
|
521
623
|
#
|
624
|
+
# ```java
|
625
|
+
# ElementHandle bodyHandle = page.querySelector("body");
|
626
|
+
# String html = (String) page.evaluate("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(bodyHandle, "hello"));
|
627
|
+
# bodyHandle.dispose();
|
628
|
+
# ```
|
629
|
+
#
|
522
630
|
# ```python async
|
523
631
|
# body_handle = await page.query_selector("body")
|
524
632
|
# html = await page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
@@ -550,6 +658,11 @@ module Playwright
|
|
550
658
|
# aWindowHandle; // Handle for the window object.
|
551
659
|
# ```
|
552
660
|
#
|
661
|
+
# ```java
|
662
|
+
# // Handle for the window object.
|
663
|
+
# JSHandle aWindowHandle = page.evaluateHandle("() => Promise.resolve(window)");
|
664
|
+
# ```
|
665
|
+
#
|
553
666
|
# ```python async
|
554
667
|
# a_window_handle = await page.evaluate_handle("Promise.resolve(window)")
|
555
668
|
# a_window_handle # handle for the window object.
|
@@ -567,6 +680,10 @@ module Playwright
|
|
567
680
|
# const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
|
568
681
|
# ```
|
569
682
|
#
|
683
|
+
# ```java
|
684
|
+
# JSHandle aHandle = page.evaluateHandle("document"); // Handle for the "document".
|
685
|
+
# ```
|
686
|
+
#
|
570
687
|
# ```python async
|
571
688
|
# a_handle = await page.evaluate_handle("document") # handle for the "document"
|
572
689
|
# ```
|
@@ -585,6 +702,13 @@ module Playwright
|
|
585
702
|
# await resultHandle.dispose();
|
586
703
|
# ```
|
587
704
|
#
|
705
|
+
# ```java
|
706
|
+
# JSHandle aHandle = page.evaluateHandle("() => document.body");
|
707
|
+
# JSHandle resultHandle = page.evaluateHandle("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(aHandle, "hello"));
|
708
|
+
# System.out.println(resultHandle.jsonValue());
|
709
|
+
# resultHandle.dispose();
|
710
|
+
# ```
|
711
|
+
#
|
588
712
|
# ```python async
|
589
713
|
# a_handle = await page.evaluate_handle("document.body")
|
590
714
|
# result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
@@ -637,6 +761,30 @@ module Playwright
|
|
637
761
|
# })();
|
638
762
|
# ```
|
639
763
|
#
|
764
|
+
# ```java
|
765
|
+
# import com.microsoft.playwright.*;
|
766
|
+
#
|
767
|
+
# public class Example {
|
768
|
+
# public static void main(String[] args) {
|
769
|
+
# try (Playwright playwright = Playwright.create()) {
|
770
|
+
# BrowserType webkit = playwright.webkit();
|
771
|
+
# Browser browser = webkit.launch({ headless: false });
|
772
|
+
# BrowserContext context = browser.newContext();
|
773
|
+
# Page page = context.newPage();
|
774
|
+
# page.exposeBinding("pageURL", (source, args) -> source.page().url());
|
775
|
+
# page.setContent("<script>\n" +
|
776
|
+
# " async function onClick() {\n" +
|
777
|
+
# " document.querySelector('div').textContent = await window.pageURL();\n" +
|
778
|
+
# " }\n" +
|
779
|
+
# "</script>\n" +
|
780
|
+
# "<button onclick=\"onClick()\">Click me</button>\n" +
|
781
|
+
# "<div></div>");
|
782
|
+
# page.click("button");
|
783
|
+
# }
|
784
|
+
# }
|
785
|
+
# }
|
786
|
+
# ```
|
787
|
+
#
|
640
788
|
# ```python async
|
641
789
|
# import asyncio
|
642
790
|
# from playwright.async_api import async_playwright
|
@@ -704,6 +852,20 @@ module Playwright
|
|
704
852
|
# `);
|
705
853
|
# ```
|
706
854
|
#
|
855
|
+
# ```java
|
856
|
+
# page.exposeBinding("clicked", (source, args) -> {
|
857
|
+
# ElementHandle element = (ElementHandle) args[0];
|
858
|
+
# System.out.println(element.textContent());
|
859
|
+
# return null;
|
860
|
+
# }, new Page.ExposeBindingOptions().setHandle(true));
|
861
|
+
# page.setContent("" +
|
862
|
+
# "<script>\n" +
|
863
|
+
# " document.addEventListener('click', event => window.clicked(event.target));\n" +
|
864
|
+
# "</script>\n" +
|
865
|
+
# "<div>Click me</div>\n" +
|
866
|
+
# "<div>Or click me</div>\n");
|
867
|
+
# ```
|
868
|
+
#
|
707
869
|
# ```python async
|
708
870
|
# async def print(source, element):
|
709
871
|
# print(await element.text_content())
|
@@ -768,6 +930,44 @@ module Playwright
|
|
768
930
|
# })();
|
769
931
|
# ```
|
770
932
|
#
|
933
|
+
# ```java
|
934
|
+
# import com.microsoft.playwright.*;
|
935
|
+
#
|
936
|
+
# import java.nio.charset.StandardCharsets;
|
937
|
+
# import java.security.MessageDigest;
|
938
|
+
# import java.security.NoSuchAlgorithmException;
|
939
|
+
# import java.util.Base64;
|
940
|
+
#
|
941
|
+
# public class Example {
|
942
|
+
# public static void main(String[] args) {
|
943
|
+
# try (Playwright playwright = Playwright.create()) {
|
944
|
+
# BrowserType webkit = playwright.webkit();
|
945
|
+
# Browser browser = webkit.launch({ headless: false });
|
946
|
+
# Page page = browser.newPage();
|
947
|
+
# page.exposeFunction("sha1", args -> {
|
948
|
+
# String text = (String) args[0];
|
949
|
+
# MessageDigest crypto;
|
950
|
+
# try {
|
951
|
+
# crypto = MessageDigest.getInstance("SHA-1");
|
952
|
+
# } catch (NoSuchAlgorithmException e) {
|
953
|
+
# return null;
|
954
|
+
# }
|
955
|
+
# byte[] token = crypto.digest(text.getBytes(StandardCharsets.UTF_8));
|
956
|
+
# return Base64.getEncoder().encodeToString(token);
|
957
|
+
# });
|
958
|
+
# page.setContent("<script>\n" +
|
959
|
+
# " async function onClick() {\n" +
|
960
|
+
# " document.querySelector('div').textContent = await window.sha1('PLAYWRIGHT');\n" +
|
961
|
+
# " }\n" +
|
962
|
+
# "</script>\n" +
|
963
|
+
# "<button onclick=\"onClick()\">Click me</button>\n" +
|
964
|
+
# "<div></div>\n");
|
965
|
+
# page.click("button");
|
966
|
+
# }
|
967
|
+
# }
|
968
|
+
# }
|
969
|
+
# ```
|
970
|
+
#
|
771
971
|
# ```python async
|
772
972
|
# import asyncio
|
773
973
|
# import hashlib
|
@@ -862,6 +1062,10 @@ module Playwright
|
|
862
1062
|
# const frame = page.frame('frame-name');
|
863
1063
|
# ```
|
864
1064
|
#
|
1065
|
+
# ```java
|
1066
|
+
# Frame frame = page.frame("frame-name");
|
1067
|
+
# ```
|
1068
|
+
#
|
865
1069
|
# ```py
|
866
1070
|
# frame = page.frame(name="frame-name")
|
867
1071
|
# ```
|
@@ -871,6 +1075,10 @@ module Playwright
|
|
871
1075
|
# const frame = page.frame({ url: /.*domain.*/ });
|
872
1076
|
# ```
|
873
1077
|
#
|
1078
|
+
# ```java
|
1079
|
+
# Frame frame = page.frameByUrl(Pattern.compile(".*domain.*");
|
1080
|
+
# ```
|
1081
|
+
#
|
874
1082
|
# ```py
|
875
1083
|
# frame = page.frame(url=r".*domain.*")
|
876
1084
|
# ```
|
@@ -929,15 +1137,15 @@ module Playwright
|
|
929
1137
|
end
|
930
1138
|
|
931
1139
|
# This method hovers over an element matching `selector` by performing the following steps:
|
932
|
-
# 1. Find an element
|
1140
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
933
1141
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
934
1142
|
# element is detached during the checks, the whole action is retried.
|
935
1143
|
# 1. Scroll the element into view if needed.
|
936
1144
|
# 1. Use [`property: Page.mouse`] to hover over the center of the element, or the specified `position`.
|
937
1145
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
938
1146
|
#
|
939
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
940
|
-
#
|
1147
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
1148
|
+
# zero timeout disables this.
|
941
1149
|
#
|
942
1150
|
# Shortcut for main frame's [`method: Frame.hover`].
|
943
1151
|
def hover(
|
@@ -984,12 +1192,14 @@ module Playwright
|
|
984
1192
|
wrap_impl(@impl.enabled?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
985
1193
|
end
|
986
1194
|
|
987
|
-
# Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible).
|
1195
|
+
# Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible). `selector` that does not
|
1196
|
+
# match any elements is considered hidden.
|
988
1197
|
def hidden?(selector, timeout: nil)
|
989
1198
|
wrap_impl(@impl.hidden?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
990
1199
|
end
|
991
1200
|
|
992
|
-
# Returns whether the element is [visible](./actionability.md#visible).
|
1201
|
+
# Returns whether the element is [visible](./actionability.md#visible). `selector` that does not match any elements is
|
1202
|
+
# considered not visible.
|
993
1203
|
def visible?(selector, timeout: nil)
|
994
1204
|
wrap_impl(@impl.visible?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
995
1205
|
end
|
@@ -1010,7 +1220,7 @@ module Playwright
|
|
1010
1220
|
# User can inspect selectors or perform manual steps while paused. Resume will continue running the original script from
|
1011
1221
|
# the place it was paused.
|
1012
1222
|
#
|
1013
|
-
# > NOTE: This method requires Playwright to be started in a headed mode, with a falsy
|
1223
|
+
# > NOTE: This method requires Playwright to be started in a headed mode, with a falsy `headless` value in the
|
1014
1224
|
# [`method: BrowserType.launch`].
|
1015
1225
|
def pause
|
1016
1226
|
raise NotImplementedError.new('pause is not implemented yet.')
|
@@ -1034,6 +1244,12 @@ module Playwright
|
|
1034
1244
|
# await page.pdf({path: 'page.pdf'});
|
1035
1245
|
# ```
|
1036
1246
|
#
|
1247
|
+
# ```java
|
1248
|
+
# // Generates a PDF with "screen" media type.
|
1249
|
+
# page.emulateMedia(new Page.EmulateMediaOptions().setMedia(Media.SCREEN));
|
1250
|
+
# page.pdf(new Page.PdfOptions().setPath(Paths.get("page.pdf")));
|
1251
|
+
# ```
|
1252
|
+
#
|
1037
1253
|
# ```python async
|
1038
1254
|
# # generates a pdf with "screen" media type.
|
1039
1255
|
# await page.emulate_media(media="screen")
|
@@ -1107,7 +1323,7 @@ module Playwright
|
|
1107
1323
|
# If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
1108
1324
|
# texts.
|
1109
1325
|
#
|
1110
|
-
# Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When
|
1326
|
+
# Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
|
1111
1327
|
# modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
1112
1328
|
#
|
1113
1329
|
#
|
@@ -1123,6 +1339,17 @@ module Playwright
|
|
1123
1339
|
# await browser.close();
|
1124
1340
|
# ```
|
1125
1341
|
#
|
1342
|
+
# ```java
|
1343
|
+
# Page page = browser.newPage();
|
1344
|
+
# page.navigate("https://keycode.info");
|
1345
|
+
# page.press("body", "A");
|
1346
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("A.png")));
|
1347
|
+
# page.press("body", "ArrowLeft");
|
1348
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("ArrowLeft.png" )));
|
1349
|
+
# page.press("body", "Shift+O");
|
1350
|
+
# page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("O.png" )));
|
1351
|
+
# ```
|
1352
|
+
#
|
1126
1353
|
# ```python async
|
1127
1354
|
# page = await browser.new_page()
|
1128
1355
|
# await page.goto("https://keycode.info")
|
@@ -1183,7 +1410,7 @@ module Playwright
|
|
1183
1410
|
#
|
1184
1411
|
# > NOTE: The handler will only be called for the first url if the response is a redirect.
|
1185
1412
|
#
|
1186
|
-
# An example of a
|
1413
|
+
# An example of a naive handler that aborts all image requests:
|
1187
1414
|
#
|
1188
1415
|
#
|
1189
1416
|
# ```js
|
@@ -1193,6 +1420,13 @@ module Playwright
|
|
1193
1420
|
# await browser.close();
|
1194
1421
|
# ```
|
1195
1422
|
#
|
1423
|
+
# ```java
|
1424
|
+
# Page page = browser.newPage();
|
1425
|
+
# page.route("**/*.{png,jpg,jpeg}", route -> route.abort());
|
1426
|
+
# page.navigate("https://example.com");
|
1427
|
+
# browser.close();
|
1428
|
+
# ```
|
1429
|
+
#
|
1196
1430
|
# ```python async
|
1197
1431
|
# page = await browser.new_page()
|
1198
1432
|
# await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
|
@@ -1217,6 +1451,13 @@ module Playwright
|
|
1217
1451
|
# await browser.close();
|
1218
1452
|
# ```
|
1219
1453
|
#
|
1454
|
+
# ```java
|
1455
|
+
# Page page = browser.newPage();
|
1456
|
+
# page.route(Pattern.compile("(\\.png$)|(\\.jpg$)"),route -> route.abort());
|
1457
|
+
# page.navigate("https://example.com");
|
1458
|
+
# browser.close();
|
1459
|
+
# ```
|
1460
|
+
#
|
1220
1461
|
# ```python async
|
1221
1462
|
# page = await browser.new_page()
|
1222
1463
|
# await page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
|
@@ -1234,15 +1475,14 @@ module Playwright
|
|
1234
1475
|
# Page routes take precedence over browser context routes (set up with [`method: BrowserContext.route`]) when request
|
1235
1476
|
# matches both handlers.
|
1236
1477
|
#
|
1478
|
+
# To remove a route with its handler you can use [`method: Page.unroute`].
|
1479
|
+
#
|
1237
1480
|
# > NOTE: Enabling routing disables http cache.
|
1238
1481
|
def route(url, handler)
|
1239
|
-
|
1482
|
+
wrap_impl(@impl.route(unwrap_impl(url), unwrap_impl(handler)))
|
1240
1483
|
end
|
1241
1484
|
|
1242
1485
|
# Returns the buffer with the captured screenshot.
|
1243
|
-
#
|
1244
|
-
# > NOTE: Screenshots take at least 1/6 second on Chromium OS X and Chromium Windows. See https://crbug.com/741689 for
|
1245
|
-
# discussion.
|
1246
1486
|
def screenshot(
|
1247
1487
|
clip: nil,
|
1248
1488
|
fullPage: nil,
|
@@ -1274,6 +1514,15 @@ module Playwright
|
|
1274
1514
|
#
|
1275
1515
|
# ```
|
1276
1516
|
#
|
1517
|
+
# ```java
|
1518
|
+
# // single selection matching the value
|
1519
|
+
# page.selectOption("select#colors", "blue");
|
1520
|
+
# // single selection matching both the value and the label
|
1521
|
+
# page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
1522
|
+
# // multiple selection
|
1523
|
+
# page.selectOption("select#colors", new String[] {"red", "green", "blue"});
|
1524
|
+
# ```
|
1525
|
+
#
|
1277
1526
|
# ```python async
|
1278
1527
|
# # single selection matching the value
|
1279
1528
|
# await page.select_option("select#colors", "blue")
|
@@ -1316,6 +1565,7 @@ module Playwright
|
|
1316
1565
|
# - [`method: Page.reload`]
|
1317
1566
|
# - [`method: Page.setContent`]
|
1318
1567
|
# - [`method: Page.waitForNavigation`]
|
1568
|
+
# - [`method: Page.waitForURL`]
|
1319
1569
|
#
|
1320
1570
|
# > NOTE: [`method: Page.setDefaultNavigationTimeout`] takes priority over [`method: Page.setDefaultTimeout`],
|
1321
1571
|
# [`method: BrowserContext.setDefaultTimeout`] and [`method: BrowserContext.setDefaultNavigationTimeout`].
|
@@ -1365,6 +1615,12 @@ module Playwright
|
|
1365
1615
|
# await page.goto('https://example.com');
|
1366
1616
|
# ```
|
1367
1617
|
#
|
1618
|
+
# ```java
|
1619
|
+
# Page page = browser.newPage();
|
1620
|
+
# page.setViewportSize(640, 480);
|
1621
|
+
# page.navigate("https://example.com");
|
1622
|
+
# ```
|
1623
|
+
#
|
1368
1624
|
# ```python async
|
1369
1625
|
# page = await browser.new_page()
|
1370
1626
|
# await page.set_viewport_size({"width": 640, "height": 480})
|
@@ -1382,15 +1638,15 @@ module Playwright
|
|
1382
1638
|
alias_method :viewport_size=, :set_viewport_size
|
1383
1639
|
|
1384
1640
|
# This method taps an element matching `selector` by performing the following steps:
|
1385
|
-
# 1. Find an element
|
1641
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
1386
1642
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
1387
1643
|
# element is detached during the checks, the whole action is retried.
|
1388
1644
|
# 1. Scroll the element into view if needed.
|
1389
1645
|
# 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
|
1390
1646
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
1391
1647
|
#
|
1392
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
1393
|
-
#
|
1648
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
1649
|
+
# zero timeout disables this.
|
1394
1650
|
#
|
1395
1651
|
# > NOTE: [`method: Page.tap`] requires that the `hasTouch` option of the browser context be set to true.
|
1396
1652
|
#
|
@@ -1426,6 +1682,13 @@ module Playwright
|
|
1426
1682
|
# await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
1427
1683
|
# ```
|
1428
1684
|
#
|
1685
|
+
# ```java
|
1686
|
+
# // Types instantly
|
1687
|
+
# page.type("#mytextarea", "Hello");
|
1688
|
+
# // Types slower, like a user
|
1689
|
+
# page.type("#mytextarea", "World", new Page.TypeOptions().setDelay(100));
|
1690
|
+
# ```
|
1691
|
+
#
|
1429
1692
|
# ```python async
|
1430
1693
|
# await page.type("#mytextarea", "hello") # types instantly
|
1431
1694
|
# await page.type("#mytextarea", "world", delay=100) # types slower, like a user
|
@@ -1447,27 +1710,32 @@ module Playwright
|
|
1447
1710
|
end
|
1448
1711
|
|
1449
1712
|
# This method unchecks an element matching `selector` by performing the following steps:
|
1450
|
-
# 1. Find an element
|
1451
|
-
# 1. Ensure that matched element is a checkbox or a radio input. If not, this method
|
1713
|
+
# 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
|
1714
|
+
# 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
|
1452
1715
|
# unchecked, this method returns immediately.
|
1453
1716
|
# 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
|
1454
1717
|
# element is detached during the checks, the whole action is retried.
|
1455
1718
|
# 1. Scroll the element into view if needed.
|
1456
1719
|
# 1. Use [`property: Page.mouse`] to click in the center of the element.
|
1457
1720
|
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
1458
|
-
# 1. Ensure that the element is now unchecked. If not, this method
|
1721
|
+
# 1. Ensure that the element is now unchecked. If not, this method throws.
|
1459
1722
|
#
|
1460
|
-
# When all steps combined have not finished during the specified `timeout`, this method
|
1461
|
-
#
|
1723
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
1724
|
+
# zero timeout disables this.
|
1462
1725
|
#
|
1463
1726
|
# Shortcut for main frame's [`method: Frame.uncheck`].
|
1464
|
-
def uncheck(
|
1465
|
-
|
1727
|
+
def uncheck(
|
1728
|
+
selector,
|
1729
|
+
force: nil,
|
1730
|
+
noWaitAfter: nil,
|
1731
|
+
position: nil,
|
1732
|
+
timeout: nil)
|
1733
|
+
wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout)))
|
1466
1734
|
end
|
1467
1735
|
|
1468
1736
|
# Removes a route created with [`method: Page.route`]. When `handler` is not specified, removes all routes for the `url`.
|
1469
1737
|
def unroute(url, handler: nil)
|
1470
|
-
|
1738
|
+
wrap_impl(@impl.unroute(unwrap_impl(url), handler: unwrap_impl(handler)))
|
1471
1739
|
end
|
1472
1740
|
|
1473
1741
|
# Shortcut for main frame's [`method: Frame.url`].
|
@@ -1477,13 +1745,27 @@ module Playwright
|
|
1477
1745
|
|
1478
1746
|
# Video object associated with this page.
|
1479
1747
|
def video
|
1480
|
-
|
1748
|
+
wrap_impl(@impl.video)
|
1481
1749
|
end
|
1482
1750
|
|
1483
1751
|
def viewport_size
|
1484
1752
|
wrap_impl(@impl.viewport_size)
|
1485
1753
|
end
|
1486
1754
|
|
1755
|
+
# Performs action and waits for a `ConsoleMessage` to be logged by in the page. If predicate is provided, it passes
|
1756
|
+
# `ConsoleMessage` value into the `predicate` function and waits for `predicate(message)` to return a truthy value. Will
|
1757
|
+
# throw an error if the page is closed before the console event is fired.
|
1758
|
+
def expect_console_message(predicate: nil, timeout: nil, &block)
|
1759
|
+
wrap_impl(@impl.expect_console_message(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
1760
|
+
end
|
1761
|
+
|
1762
|
+
# Performs action and waits for a new `Download`. If predicate is provided, it passes `Download` value into the
|
1763
|
+
# `predicate` function and waits for `predicate(download)` to return a truthy value. Will throw an error if the page is
|
1764
|
+
# closed before the download event is fired.
|
1765
|
+
def expect_download(predicate: nil, timeout: nil, &block)
|
1766
|
+
wrap_impl(@impl.expect_download(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
1767
|
+
end
|
1768
|
+
|
1487
1769
|
# Waits for event to fire and passes its value into the predicate function. Returns when the predicate returns truthy
|
1488
1770
|
# value. Will throw an error if the page is closed before the event is fired. Returns the event data value.
|
1489
1771
|
#
|
@@ -1510,6 +1792,13 @@ module Playwright
|
|
1510
1792
|
wrap_impl(@impl.expect_event(unwrap_impl(event), predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
1511
1793
|
end
|
1512
1794
|
|
1795
|
+
# Performs action and waits for a new `FileChooser` to be created. If predicate is provided, it passes `FileChooser` value
|
1796
|
+
# into the `predicate` function and waits for `predicate(fileChooser)` to return a truthy value. Will throw an error if
|
1797
|
+
# the page is closed before the file chooser is opened.
|
1798
|
+
def expect_file_chooser(predicate: nil, timeout: nil, &block)
|
1799
|
+
wrap_impl(@impl.expect_file_chooser(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
1800
|
+
end
|
1801
|
+
|
1513
1802
|
# Returns when the `expression` returns a truthy value. It resolves to a JSHandle of the truthy value.
|
1514
1803
|
#
|
1515
1804
|
# The [`method: Page.waitForFunction`] can be used to observe viewport size change:
|
@@ -1528,6 +1817,23 @@ module Playwright
|
|
1528
1817
|
# })();
|
1529
1818
|
# ```
|
1530
1819
|
#
|
1820
|
+
# ```java
|
1821
|
+
# import com.microsoft.playwright.*;
|
1822
|
+
#
|
1823
|
+
# public class Example {
|
1824
|
+
# public static void main(String[] args) {
|
1825
|
+
# try (Playwright playwright = Playwright.create()) {
|
1826
|
+
# BrowserType webkit = playwright.webkit();
|
1827
|
+
# Browser browser = webkit.launch();
|
1828
|
+
# Page page = browser.newPage();
|
1829
|
+
# page.setViewportSize(50, 50);
|
1830
|
+
# page.waitForFunction("() => window.innerWidth < 100");
|
1831
|
+
# browser.close();
|
1832
|
+
# }
|
1833
|
+
# }
|
1834
|
+
# }
|
1835
|
+
# ```
|
1836
|
+
#
|
1531
1837
|
# ```python async
|
1532
1838
|
# import asyncio
|
1533
1839
|
# from playwright.async_api import async_playwright
|
@@ -1569,6 +1875,11 @@ module Playwright
|
|
1569
1875
|
# await page.waitForFunction(selector => !!document.querySelector(selector), selector);
|
1570
1876
|
# ```
|
1571
1877
|
#
|
1878
|
+
# ```java
|
1879
|
+
# String selector = ".foo";
|
1880
|
+
# page.waitForFunction("selector => !!document.querySelector(selector)", selector);
|
1881
|
+
# ```
|
1882
|
+
#
|
1572
1883
|
# ```python async
|
1573
1884
|
# selector = ".foo"
|
1574
1885
|
# await page.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
@@ -1595,6 +1906,11 @@ module Playwright
|
|
1595
1906
|
# await page.waitForLoadState(); // The promise resolves after 'load' event.
|
1596
1907
|
# ```
|
1597
1908
|
#
|
1909
|
+
# ```java
|
1910
|
+
# page.click("button"); // Click triggers navigation.
|
1911
|
+
# page.waitForLoadState(); // The promise resolves after "load" event.
|
1912
|
+
# ```
|
1913
|
+
#
|
1598
1914
|
# ```python async
|
1599
1915
|
# await page.click("button") # click triggers navigation.
|
1600
1916
|
# await page.wait_for_load_state() # the promise resolves after "load" event.
|
@@ -1615,6 +1931,14 @@ module Playwright
|
|
1615
1931
|
# console.log(await popup.title()); // Popup is ready to use.
|
1616
1932
|
# ```
|
1617
1933
|
#
|
1934
|
+
# ```java
|
1935
|
+
# Page popup = page.waitForPopup(() -> {
|
1936
|
+
# page.click("button"); // Click triggers a popup.
|
1937
|
+
# });
|
1938
|
+
# popup.waitForLoadState(LoadState.DOMCONTENTLOADED);
|
1939
|
+
# System.out.println(popup.title()); // Popup is ready to use.
|
1940
|
+
# ```
|
1941
|
+
#
|
1618
1942
|
# ```python async
|
1619
1943
|
# async with page.expect_popup() as page_info:
|
1620
1944
|
# await page.click("button") # click triggers a popup.
|
@@ -1654,6 +1978,13 @@ module Playwright
|
|
1654
1978
|
# ]);
|
1655
1979
|
# ```
|
1656
1980
|
#
|
1981
|
+
# ```java
|
1982
|
+
# // The method returns after navigation has finished
|
1983
|
+
# Response response = page.waitForNavigation(() -> {
|
1984
|
+
# page.click("a.delayed-navigation"); // Clicking the link will indirectly cause a navigation
|
1985
|
+
# });
|
1986
|
+
# ```
|
1987
|
+
#
|
1657
1988
|
# ```python async
|
1658
1989
|
# async with page.expect_navigation():
|
1659
1990
|
# await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
@@ -1674,6 +2005,13 @@ module Playwright
|
|
1674
2005
|
wrap_impl(@impl.expect_navigation(timeout: unwrap_impl(timeout), url: unwrap_impl(url), waitUntil: unwrap_impl(waitUntil), &wrap_block_call(block)))
|
1675
2006
|
end
|
1676
2007
|
|
2008
|
+
# Performs action and waits for a popup `Page`. If predicate is provided, it passes [Popup] value into the `predicate`
|
2009
|
+
# function and waits for `predicate(page)` to return a truthy value. Will throw an error if the page is closed before the
|
2010
|
+
# popup event is fired.
|
2011
|
+
def expect_popup(predicate: nil, timeout: nil, &block)
|
2012
|
+
wrap_impl(@impl.expect_popup(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
2013
|
+
end
|
2014
|
+
|
1677
2015
|
# Waits for the matching request and returns it.
|
1678
2016
|
#
|
1679
2017
|
#
|
@@ -1683,6 +2021,13 @@ module Playwright
|
|
1683
2021
|
# return firstRequest.url();
|
1684
2022
|
# ```
|
1685
2023
|
#
|
2024
|
+
# ```java
|
2025
|
+
# Request firstRequest = page.waitForRequest("http://example.com/resource");
|
2026
|
+
# Object finalRequest = page.waitForRequest(
|
2027
|
+
# request -> "http://example.com".equals(request.url()) && "GET".equals(request.method()), () -> {});
|
2028
|
+
# return firstRequest.url();
|
2029
|
+
# ```
|
2030
|
+
#
|
1686
2031
|
# ```python async
|
1687
2032
|
# async with page.expect_request("http://example.com/resource") as first:
|
1688
2033
|
# await page.click('button')
|
@@ -1720,16 +2065,36 @@ module Playwright
|
|
1720
2065
|
# return finalResponse.ok();
|
1721
2066
|
# ```
|
1722
2067
|
#
|
2068
|
+
# ```java
|
2069
|
+
# Response firstResponse = page.waitForResponse("https://example.com/resource", () -> {});
|
2070
|
+
# Response finalResponse = page.waitForResponse(response -> "https://example.com".equals(response.url()) && response.status() == 200, () -> {});
|
2071
|
+
# return finalResponse.ok();
|
2072
|
+
# ```
|
2073
|
+
#
|
1723
2074
|
# ```python async
|
1724
|
-
#
|
1725
|
-
#
|
1726
|
-
#
|
2075
|
+
# async with page.expect_response("https://example.com/resource") as response_info:
|
2076
|
+
# await page.click("input")
|
2077
|
+
# response = response_info.value
|
2078
|
+
# return response.ok
|
2079
|
+
#
|
2080
|
+
# # or with a lambda
|
2081
|
+
# async with page.expect_response(lambda response: response.url == "https://example.com" and response.status === 200) as response_info:
|
2082
|
+
# await page.click("input")
|
2083
|
+
# response = response_info.value
|
2084
|
+
# return response.ok
|
1727
2085
|
# ```
|
1728
2086
|
#
|
1729
2087
|
# ```python sync
|
1730
|
-
#
|
1731
|
-
#
|
1732
|
-
#
|
2088
|
+
# with page.expect_response("https://example.com/resource") as response_info:
|
2089
|
+
# page.click("input")
|
2090
|
+
# response = response_info.value
|
2091
|
+
# return response.ok
|
2092
|
+
#
|
2093
|
+
# # or with a lambda
|
2094
|
+
# with page.expect_response(lambda response: response.url == "https://example.com" and response.status === 200) as response_info:
|
2095
|
+
# page.click("input")
|
2096
|
+
# response = response_info.value
|
2097
|
+
# return response.ok
|
1733
2098
|
# ```
|
1734
2099
|
def expect_response(urlOrPredicate, timeout: nil)
|
1735
2100
|
wrap_impl(@impl.expect_response(unwrap_impl(urlOrPredicate), timeout: unwrap_impl(timeout)))
|
@@ -1760,6 +2125,26 @@ module Playwright
|
|
1760
2125
|
# })();
|
1761
2126
|
# ```
|
1762
2127
|
#
|
2128
|
+
# ```java
|
2129
|
+
# import com.microsoft.playwright.*;
|
2130
|
+
#
|
2131
|
+
# public class Example {
|
2132
|
+
# public static void main(String[] args) {
|
2133
|
+
# try (Playwright playwright = Playwright.create()) {
|
2134
|
+
# BrowserType chromium = playwright.chromium();
|
2135
|
+
# Browser browser = chromium.launch();
|
2136
|
+
# Page page = browser.newPage();
|
2137
|
+
# for (String currentURL : Arrays.asList("https://google.com", "https://bbc.com")) {
|
2138
|
+
# page.navigate(currentURL);
|
2139
|
+
# ElementHandle element = page.waitForSelector("img");
|
2140
|
+
# System.out.println("Loaded image: " + element.getAttribute("src"));
|
2141
|
+
# }
|
2142
|
+
# browser.close();
|
2143
|
+
# }
|
2144
|
+
# }
|
2145
|
+
# }
|
2146
|
+
# ```
|
2147
|
+
#
|
1763
2148
|
# ```python async
|
1764
2149
|
# import asyncio
|
1765
2150
|
# from playwright.async_api import async_playwright
|
@@ -1811,6 +2196,11 @@ module Playwright
|
|
1811
2196
|
# await page.waitForTimeout(1000);
|
1812
2197
|
# ```
|
1813
2198
|
#
|
2199
|
+
# ```java
|
2200
|
+
# // wait for 1 second
|
2201
|
+
# page.waitForTimeout(1000);
|
2202
|
+
# ```
|
2203
|
+
#
|
1814
2204
|
# ```python async
|
1815
2205
|
# # wait for 1 second
|
1816
2206
|
# await page.wait_for_timeout(1000)
|
@@ -1826,47 +2216,47 @@ module Playwright
|
|
1826
2216
|
raise NotImplementedError.new('wait_for_timeout is not implemented yet.')
|
1827
2217
|
end
|
1828
2218
|
|
1829
|
-
#
|
1830
|
-
# associated with the page.
|
2219
|
+
# Waits for the main frame to navigate to the given URL.
|
1831
2220
|
#
|
1832
|
-
#
|
1833
|
-
|
1834
|
-
|
1835
|
-
|
1836
|
-
|
1837
|
-
#
|
1838
|
-
#
|
1839
|
-
#
|
1840
|
-
|
1841
|
-
|
1842
|
-
|
1843
|
-
|
1844
|
-
#
|
1845
|
-
#
|
1846
|
-
#
|
1847
|
-
|
1848
|
-
|
2221
|
+
#
|
2222
|
+
# ```js
|
2223
|
+
# await page.click('a.delayed-navigation'); // Clicking the link will indirectly cause a navigation
|
2224
|
+
# await page.waitForURL('**/target.html');
|
2225
|
+
# ```
|
2226
|
+
#
|
2227
|
+
# ```java
|
2228
|
+
# page.click("a.delayed-navigation"); // Clicking the link will indirectly cause a navigation
|
2229
|
+
# page.waitForURL("**/target.html");
|
2230
|
+
# ```
|
2231
|
+
#
|
2232
|
+
# ```python async
|
2233
|
+
# await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
2234
|
+
# await page.wait_for_url("**/target.html")
|
2235
|
+
# ```
|
2236
|
+
#
|
2237
|
+
# ```python sync
|
2238
|
+
# page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
2239
|
+
# page.wait_for_url("**/target.html")
|
2240
|
+
# ```
|
2241
|
+
#
|
2242
|
+
# Shortcut for main frame's [`method: Frame.waitForURL`].
|
2243
|
+
def wait_for_url(url, timeout: nil, waitUntil: nil)
|
2244
|
+
wrap_impl(@impl.wait_for_url(unwrap_impl(url), timeout: unwrap_impl(timeout), waitUntil: unwrap_impl(waitUntil)))
|
1849
2245
|
end
|
1850
2246
|
|
1851
|
-
# Performs action and waits for
|
1852
|
-
#
|
1853
|
-
#
|
2247
|
+
# Performs action and waits for a new `Worker`. If predicate is provided, it passes `Worker` value into the `predicate`
|
2248
|
+
# function and waits for `predicate(worker)` to return a truthy value. Will throw an error if the page is closed before
|
2249
|
+
# the worker event is fired.
|
1854
2250
|
def expect_worker(predicate: nil, timeout: nil)
|
1855
2251
|
raise NotImplementedError.new('expect_worker is not implemented yet.')
|
1856
2252
|
end
|
1857
2253
|
|
1858
|
-
#
|
1859
|
-
#
|
1860
|
-
#
|
1861
|
-
|
1862
|
-
|
1863
|
-
|
1864
|
-
|
1865
|
-
# Performs action and waits for `filechooser` event to fire. If predicate is provided, it passes `FileChooser` value into
|
1866
|
-
# the `predicate` function and waits for `predicate(event)` to return a truthy value. Will throw an error if the page is
|
1867
|
-
# closed before the worker event is fired.
|
1868
|
-
def expect_file_chooser(predicate: nil, timeout: nil)
|
1869
|
-
raise NotImplementedError.new('expect_file_chooser is not implemented yet.')
|
2254
|
+
# This method returns all of the dedicated [WebWorkers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API)
|
2255
|
+
# associated with the page.
|
2256
|
+
#
|
2257
|
+
# > NOTE: This does not contain ServiceWorkers
|
2258
|
+
def workers
|
2259
|
+
raise NotImplementedError.new('workers is not implemented yet.')
|
1870
2260
|
end
|
1871
2261
|
|
1872
2262
|
# > NOTE: In most cases, you should use [`method: Page.waitForEvent`].
|
@@ -1878,6 +2268,26 @@ module Playwright
|
|
1878
2268
|
raise NotImplementedError.new('wait_for_event is not implemented yet.')
|
1879
2269
|
end
|
1880
2270
|
|
2271
|
+
# @nodoc
|
2272
|
+
def start_js_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
|
2273
|
+
wrap_impl(@impl.start_js_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
|
2274
|
+
end
|
2275
|
+
|
2276
|
+
# @nodoc
|
2277
|
+
def stop_js_coverage
|
2278
|
+
wrap_impl(@impl.stop_js_coverage)
|
2279
|
+
end
|
2280
|
+
|
2281
|
+
# @nodoc
|
2282
|
+
def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
|
2283
|
+
wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
|
2284
|
+
end
|
2285
|
+
|
2286
|
+
# @nodoc
|
2287
|
+
def stop_css_coverage
|
2288
|
+
wrap_impl(@impl.stop_css_coverage)
|
2289
|
+
end
|
2290
|
+
|
1881
2291
|
# @nodoc
|
1882
2292
|
def owned_context=(req)
|
1883
2293
|
wrap_impl(@impl.owned_context=(unwrap_impl(req)))
|