playwright-ruby-client 0.3.0 → 0.5.6

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -5
  3. data/docs/api_coverage.md +14 -25
  4. data/lib/playwright.rb +47 -9
  5. data/lib/playwright/channel.rb +19 -9
  6. data/lib/playwright/channel_owners/artifact.rb +30 -0
  7. data/lib/playwright/channel_owners/browser.rb +21 -0
  8. data/lib/playwright/channel_owners/browser_context.rb +5 -0
  9. data/lib/playwright/channel_owners/browser_type.rb +28 -0
  10. data/lib/playwright/channel_owners/element_handle.rb +7 -7
  11. data/lib/playwright/channel_owners/frame.rb +26 -5
  12. data/lib/playwright/channel_owners/js_handle.rb +2 -2
  13. data/lib/playwright/channel_owners/page.rb +78 -15
  14. data/lib/playwright/channel_owners/playwright.rb +22 -29
  15. data/lib/playwright/channel_owners/stream.rb +15 -0
  16. data/lib/playwright/connection.rb +11 -32
  17. data/lib/playwright/download.rb +27 -0
  18. data/lib/playwright/errors.rb +6 -0
  19. data/lib/playwright/events.rb +2 -5
  20. data/lib/playwright/keyboard_impl.rb +1 -1
  21. data/lib/playwright/mouse_impl.rb +41 -0
  22. data/lib/playwright/playwright_api.rb +5 -3
  23. data/lib/playwright/route_handler_entry.rb +1 -9
  24. data/lib/playwright/select_option_values.rb +31 -22
  25. data/lib/playwright/transport.rb +29 -7
  26. data/lib/playwright/url_matcher.rb +1 -1
  27. data/lib/playwright/utils.rb +8 -0
  28. data/lib/playwright/version.rb +1 -1
  29. data/lib/playwright/video.rb +51 -0
  30. data/lib/playwright/wait_helper.rb +2 -2
  31. data/lib/playwright_api/accessibility.rb +39 -1
  32. data/lib/playwright_api/android.rb +10 -10
  33. data/lib/playwright_api/android_device.rb +10 -9
  34. data/lib/playwright_api/browser.rb +83 -8
  35. data/lib/playwright_api/browser_context.rb +157 -9
  36. data/lib/playwright_api/browser_type.rb +35 -4
  37. data/lib/playwright_api/console_message.rb +6 -6
  38. data/lib/playwright_api/dialog.rb +28 -8
  39. data/lib/playwright_api/element_handle.rb +111 -37
  40. data/lib/playwright_api/file_chooser.rb +5 -0
  41. data/lib/playwright_api/frame.rb +228 -37
  42. data/lib/playwright_api/js_handle.rb +26 -3
  43. data/lib/playwright_api/keyboard.rb +48 -1
  44. data/lib/playwright_api/mouse.rb +26 -5
  45. data/lib/playwright_api/page.rb +454 -46
  46. data/lib/playwright_api/playwright.rb +26 -9
  47. data/lib/playwright_api/request.rb +34 -6
  48. data/lib/playwright_api/response.rb +6 -6
  49. data/lib/playwright_api/route.rb +30 -6
  50. data/lib/playwright_api/selectors.rb +32 -6
  51. data/lib/playwright_api/touchscreen.rb +1 -1
  52. data/lib/playwright_api/worker.rb +25 -1
  53. data/playwright.gemspec +4 -2
  54. metadata +37 -14
  55. data/lib/playwright/channel_owners/chromium_browser.rb +0 -8
  56. data/lib/playwright/channel_owners/chromium_browser_context.rb +0 -8
  57. data/lib/playwright/channel_owners/download.rb +0 -27
  58. data/lib/playwright/channel_owners/firefox_browser.rb +0 -8
  59. data/lib/playwright/channel_owners/webkit_browser.rb +0 -8
  60. data/lib/playwright_api/binding_call.rb +0 -32
  61. data/lib/playwright_api/chromium_browser_context.rb +0 -59
  62. data/lib/playwright_api/download.rb +0 -95
  63. 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,10 +140,9 @@ module Playwright
122
140
  wrap_impl(@impl.json_value)
123
141
  end
124
142
 
125
- # -- inherited from EventEmitter --
126
143
  # @nodoc
127
- def off(event, callback)
128
- event_emitter_proxy.off(event, callback)
144
+ def to_s
145
+ wrap_impl(@impl.to_s)
129
146
  end
130
147
 
131
148
  # -- inherited from EventEmitter --
@@ -140,6 +157,12 @@ module Playwright
140
157
  event_emitter_proxy.on(event, callback)
141
158
  end
142
159
 
160
+ # -- inherited from EventEmitter --
161
+ # @nodoc
162
+ def off(event, callback)
163
+ event_emitter_proxy.off(event, callback)
164
+ end
165
+
143
166
  private def event_emitter_proxy
144
167
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
145
168
  end
@@ -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 speficied with the
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
@@ -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
- raise NotImplementedError.new('click is not implemented yet.')
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
- raise NotImplementedError.new('dblclick is not implemented yet.')
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
- raise NotImplementedError.new('down is not implemented yet.')
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
- raise NotImplementedError.new('move is not implemented yet.')
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
- raise NotImplementedError.new('up is not implemented yet.')
90
+ wrap_impl(@impl.up(button: unwrap_impl(button), clickCount: unwrap_impl(clickCount)))
70
91
  end
71
92
  end
72
93
  end
@@ -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 match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
172
- # 1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
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 rejects.
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 rejects with a `TimeoutError`.
182
- # Passing zero timeout disables this.
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(selector, force: nil, noWaitAfter: nil, timeout: nil)
186
- wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
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 match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
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 rejects with a `TimeoutError`.
198
- # Passing zero timeout disables this.
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 match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
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 reject.
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 rejects with a `TimeoutError`.
245
- # Passing zero timeout disables this.
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 elment, `click`
263
- # is dispatched. This is equivalend to calling
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 match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
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 rejects with a `TimeoutError`.
940
- # Passing zero timeout disables this.
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(
@@ -1036,6 +1244,12 @@ module Playwright
1036
1244
  # await page.pdf({path: 'page.pdf'});
1037
1245
  # ```
1038
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
+ #
1039
1253
  # ```python async
1040
1254
  # # generates a pdf with "screen" media type.
1041
1255
  # await page.emulate_media(media="screen")
@@ -1109,7 +1323,7 @@ module Playwright
1109
1323
  # If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
1110
1324
  # texts.
1111
1325
  #
1112
- # Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
1326
+ # Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
1113
1327
  # modifier, modifier is pressed and being held while the subsequent key is being pressed.
1114
1328
  #
1115
1329
  #
@@ -1125,6 +1339,17 @@ module Playwright
1125
1339
  # await browser.close();
1126
1340
  # ```
1127
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
+ #
1128
1353
  # ```python async
1129
1354
  # page = await browser.new_page()
1130
1355
  # await page.goto("https://keycode.info")
@@ -1185,7 +1410,7 @@ module Playwright
1185
1410
  #
1186
1411
  # > NOTE: The handler will only be called for the first url if the response is a redirect.
1187
1412
  #
1188
- # An example of a naïve handler that aborts all image requests:
1413
+ # An example of a naive handler that aborts all image requests:
1189
1414
  #
1190
1415
  #
1191
1416
  # ```js
@@ -1195,6 +1420,13 @@ module Playwright
1195
1420
  # await browser.close();
1196
1421
  # ```
1197
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
+ #
1198
1430
  # ```python async
1199
1431
  # page = await browser.new_page()
1200
1432
  # await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
@@ -1219,6 +1451,13 @@ module Playwright
1219
1451
  # await browser.close();
1220
1452
  # ```
1221
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
+ #
1222
1461
  # ```python async
1223
1462
  # page = await browser.new_page()
1224
1463
  # await page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
@@ -1236,15 +1475,14 @@ module Playwright
1236
1475
  # Page routes take precedence over browser context routes (set up with [`method: BrowserContext.route`]) when request
1237
1476
  # matches both handlers.
1238
1477
  #
1478
+ # To remove a route with its handler you can use [`method: Page.unroute`].
1479
+ #
1239
1480
  # > NOTE: Enabling routing disables http cache.
1240
1481
  def route(url, handler)
1241
1482
  wrap_impl(@impl.route(unwrap_impl(url), unwrap_impl(handler)))
1242
1483
  end
1243
1484
 
1244
1485
  # Returns the buffer with the captured screenshot.
1245
- #
1246
- # > NOTE: Screenshots take at least 1/6 second on Chromium OS X and Chromium Windows. See https://crbug.com/741689 for
1247
- # discussion.
1248
1486
  def screenshot(
1249
1487
  clip: nil,
1250
1488
  fullPage: nil,
@@ -1276,6 +1514,15 @@ module Playwright
1276
1514
  #
1277
1515
  # ```
1278
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
+ #
1279
1526
  # ```python async
1280
1527
  # # single selection matching the value
1281
1528
  # await page.select_option("select#colors", "blue")
@@ -1318,6 +1565,7 @@ module Playwright
1318
1565
  # - [`method: Page.reload`]
1319
1566
  # - [`method: Page.setContent`]
1320
1567
  # - [`method: Page.waitForNavigation`]
1568
+ # - [`method: Page.waitForURL`]
1321
1569
  #
1322
1570
  # > NOTE: [`method: Page.setDefaultNavigationTimeout`] takes priority over [`method: Page.setDefaultTimeout`],
1323
1571
  # [`method: BrowserContext.setDefaultTimeout`] and [`method: BrowserContext.setDefaultNavigationTimeout`].
@@ -1367,6 +1615,12 @@ module Playwright
1367
1615
  # await page.goto('https://example.com');
1368
1616
  # ```
1369
1617
  #
1618
+ # ```java
1619
+ # Page page = browser.newPage();
1620
+ # page.setViewportSize(640, 480);
1621
+ # page.navigate("https://example.com");
1622
+ # ```
1623
+ #
1370
1624
  # ```python async
1371
1625
  # page = await browser.new_page()
1372
1626
  # await page.set_viewport_size({"width": 640, "height": 480})
@@ -1384,15 +1638,15 @@ module Playwright
1384
1638
  alias_method :viewport_size=, :set_viewport_size
1385
1639
 
1386
1640
  # This method taps an element matching `selector` by performing the following steps:
1387
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
1641
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
1388
1642
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
1389
1643
  # element is detached during the checks, the whole action is retried.
1390
1644
  # 1. Scroll the element into view if needed.
1391
1645
  # 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
1392
1646
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
1393
1647
  #
1394
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
1395
- # Passing zero timeout disables this.
1648
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
1649
+ # zero timeout disables this.
1396
1650
  #
1397
1651
  # > NOTE: [`method: Page.tap`] requires that the `hasTouch` option of the browser context be set to true.
1398
1652
  #
@@ -1428,6 +1682,13 @@ module Playwright
1428
1682
  # await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
1429
1683
  # ```
1430
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
+ #
1431
1692
  # ```python async
1432
1693
  # await page.type("#mytextarea", "hello") # types instantly
1433
1694
  # await page.type("#mytextarea", "world", delay=100) # types slower, like a user
@@ -1449,22 +1710,27 @@ module Playwright
1449
1710
  end
1450
1711
 
1451
1712
  # This method unchecks an element matching `selector` by performing the following steps:
1452
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
1453
- # 1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
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
1454
1715
  # unchecked, this method returns immediately.
1455
1716
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
1456
1717
  # element is detached during the checks, the whole action is retried.
1457
1718
  # 1. Scroll the element into view if needed.
1458
1719
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
1459
1720
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
1460
- # 1. Ensure that the element is now unchecked. If not, this method rejects.
1721
+ # 1. Ensure that the element is now unchecked. If not, this method throws.
1461
1722
  #
1462
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
1463
- # Passing zero timeout disables this.
1723
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
1724
+ # zero timeout disables this.
1464
1725
  #
1465
1726
  # Shortcut for main frame's [`method: Frame.uncheck`].
1466
- def uncheck(selector, force: nil, noWaitAfter: nil, timeout: nil)
1467
- wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
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)))
1468
1734
  end
1469
1735
 
1470
1736
  # Removes a route created with [`method: Page.route`]. When `handler` is not specified, removes all routes for the `url`.
@@ -1479,14 +1745,14 @@ module Playwright
1479
1745
 
1480
1746
  # Video object associated with this page.
1481
1747
  def video
1482
- raise NotImplementedError.new('video is not implemented yet.')
1748
+ wrap_impl(@impl.video)
1483
1749
  end
1484
1750
 
1485
1751
  def viewport_size
1486
1752
  wrap_impl(@impl.viewport_size)
1487
1753
  end
1488
1754
 
1489
- # Performs action and waits for a [ConoleMessage] to be logged by in the page. If predicate is provided, it passes
1755
+ # Performs action and waits for a `ConsoleMessage` to be logged by in the page. If predicate is provided, it passes
1490
1756
  # `ConsoleMessage` value into the `predicate` function and waits for `predicate(message)` to return a truthy value. Will
1491
1757
  # throw an error if the page is closed before the console event is fired.
1492
1758
  def expect_console_message(predicate: nil, timeout: nil, &block)
@@ -1551,6 +1817,23 @@ module Playwright
1551
1817
  # })();
1552
1818
  # ```
1553
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
+ #
1554
1837
  # ```python async
1555
1838
  # import asyncio
1556
1839
  # from playwright.async_api import async_playwright
@@ -1592,6 +1875,11 @@ module Playwright
1592
1875
  # await page.waitForFunction(selector => !!document.querySelector(selector), selector);
1593
1876
  # ```
1594
1877
  #
1878
+ # ```java
1879
+ # String selector = ".foo";
1880
+ # page.waitForFunction("selector => !!document.querySelector(selector)", selector);
1881
+ # ```
1882
+ #
1595
1883
  # ```python async
1596
1884
  # selector = ".foo"
1597
1885
  # await page.wait_for_function("selector => !!document.querySelector(selector)", selector)
@@ -1618,6 +1906,11 @@ module Playwright
1618
1906
  # await page.waitForLoadState(); // The promise resolves after 'load' event.
1619
1907
  # ```
1620
1908
  #
1909
+ # ```java
1910
+ # page.click("button"); // Click triggers navigation.
1911
+ # page.waitForLoadState(); // The promise resolves after "load" event.
1912
+ # ```
1913
+ #
1621
1914
  # ```python async
1622
1915
  # await page.click("button") # click triggers navigation.
1623
1916
  # await page.wait_for_load_state() # the promise resolves after "load" event.
@@ -1638,6 +1931,14 @@ module Playwright
1638
1931
  # console.log(await popup.title()); // Popup is ready to use.
1639
1932
  # ```
1640
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
+ #
1641
1942
  # ```python async
1642
1943
  # async with page.expect_popup() as page_info:
1643
1944
  # await page.click("button") # click triggers a popup.
@@ -1677,6 +1978,13 @@ module Playwright
1677
1978
  # ]);
1678
1979
  # ```
1679
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
+ #
1680
1988
  # ```python async
1681
1989
  # async with page.expect_navigation():
1682
1990
  # await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
@@ -1713,6 +2021,13 @@ module Playwright
1713
2021
  # return firstRequest.url();
1714
2022
  # ```
1715
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
+ #
1716
2031
  # ```python async
1717
2032
  # async with page.expect_request("http://example.com/resource") as first:
1718
2033
  # await page.click('button')
@@ -1750,16 +2065,36 @@ module Playwright
1750
2065
  # return finalResponse.ok();
1751
2066
  # ```
1752
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
+ #
1753
2074
  # ```python async
1754
- # first_response = await page.wait_for_response("https://example.com/resource")
1755
- # final_response = await page.wait_for_response(lambda response: response.url == "https://example.com" and response.status === 200)
1756
- # return final_response.ok
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
1757
2085
  # ```
1758
2086
  #
1759
2087
  # ```python sync
1760
- # first_response = page.wait_for_response("https://example.com/resource")
1761
- # final_response = page.wait_for_response(lambda response: response.url == "https://example.com" and response.status === 200)
1762
- # return final_response.ok
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
1763
2098
  # ```
1764
2099
  def expect_response(urlOrPredicate, timeout: nil)
1765
2100
  wrap_impl(@impl.expect_response(unwrap_impl(urlOrPredicate), timeout: unwrap_impl(timeout)))
@@ -1790,6 +2125,26 @@ module Playwright
1790
2125
  # })();
1791
2126
  # ```
1792
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
+ #
1793
2148
  # ```python async
1794
2149
  # import asyncio
1795
2150
  # from playwright.async_api import async_playwright
@@ -1841,6 +2196,11 @@ module Playwright
1841
2196
  # await page.waitForTimeout(1000);
1842
2197
  # ```
1843
2198
  #
2199
+ # ```java
2200
+ # // wait for 1 second
2201
+ # page.waitForTimeout(1000);
2202
+ # ```
2203
+ #
1844
2204
  # ```python async
1845
2205
  # # wait for 1 second
1846
2206
  # await page.wait_for_timeout(1000)
@@ -1856,6 +2216,34 @@ module Playwright
1856
2216
  raise NotImplementedError.new('wait_for_timeout is not implemented yet.')
1857
2217
  end
1858
2218
 
2219
+ # Waits for the main frame to navigate to the given URL.
2220
+ #
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)))
2245
+ end
2246
+
1859
2247
  # Performs action and waits for a new `Worker`. If predicate is provided, it passes `Worker` value into the `predicate`
1860
2248
  # function and waits for `predicate(worker)` to return a truthy value. Will throw an error if the page is closed before
1861
2249
  # the worker event is fired.
@@ -1885,10 +2273,24 @@ module Playwright
1885
2273
  wrap_impl(@impl.owned_context=(unwrap_impl(req)))
1886
2274
  end
1887
2275
 
1888
- # -- inherited from EventEmitter --
1889
2276
  # @nodoc
1890
- def off(event, callback)
1891
- event_emitter_proxy.off(event, callback)
2277
+ def start_js_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
2278
+ wrap_impl(@impl.start_js_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
2279
+ end
2280
+
2281
+ # @nodoc
2282
+ def stop_js_coverage
2283
+ wrap_impl(@impl.stop_js_coverage)
2284
+ end
2285
+
2286
+ # @nodoc
2287
+ def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
2288
+ wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
2289
+ end
2290
+
2291
+ # @nodoc
2292
+ def stop_css_coverage
2293
+ wrap_impl(@impl.stop_css_coverage)
1892
2294
  end
1893
2295
 
1894
2296
  # -- inherited from EventEmitter --
@@ -1903,6 +2305,12 @@ module Playwright
1903
2305
  event_emitter_proxy.on(event, callback)
1904
2306
  end
1905
2307
 
2308
+ # -- inherited from EventEmitter --
2309
+ # @nodoc
2310
+ def off(event, callback)
2311
+ event_emitter_proxy.off(event, callback)
2312
+ end
2313
+
1906
2314
  private def event_emitter_proxy
1907
2315
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
1908
2316
  end