playwright-ruby-client 0.3.0 → 0.5.2

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 (61) 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/channel.rb +19 -9
  5. data/lib/playwright/channel_owners/artifact.rb +30 -0
  6. data/lib/playwright/channel_owners/browser.rb +21 -0
  7. data/lib/playwright/channel_owners/browser_context.rb +5 -0
  8. data/lib/playwright/channel_owners/browser_type.rb +28 -0
  9. data/lib/playwright/channel_owners/element_handle.rb +1 -1
  10. data/lib/playwright/channel_owners/frame.rb +25 -2
  11. data/lib/playwright/channel_owners/js_handle.rb +2 -2
  12. data/lib/playwright/channel_owners/page.rb +78 -15
  13. data/lib/playwright/channel_owners/playwright.rb +22 -29
  14. data/lib/playwright/channel_owners/stream.rb +15 -0
  15. data/lib/playwright/connection.rb +11 -32
  16. data/lib/playwright/download.rb +27 -0
  17. data/lib/playwright/errors.rb +6 -0
  18. data/lib/playwright/events.rb +2 -5
  19. data/lib/playwright/keyboard_impl.rb +1 -1
  20. data/lib/playwright/mouse_impl.rb +41 -0
  21. data/lib/playwright/route_handler_entry.rb +1 -9
  22. data/lib/playwright/transport.rb +27 -6
  23. data/lib/playwright/url_matcher.rb +1 -1
  24. data/lib/playwright/utils.rb +8 -0
  25. data/lib/playwright/version.rb +1 -1
  26. data/lib/playwright/video.rb +51 -0
  27. data/lib/playwright/wait_helper.rb +2 -2
  28. data/lib/playwright.rb +47 -9
  29. data/lib/playwright_api/accessibility.rb +39 -1
  30. data/lib/playwright_api/android.rb +10 -10
  31. data/lib/playwright_api/android_device.rb +10 -9
  32. data/lib/playwright_api/browser.rb +83 -8
  33. data/lib/playwright_api/browser_context.rb +163 -15
  34. data/lib/playwright_api/browser_type.rb +35 -4
  35. data/lib/playwright_api/console_message.rb +6 -6
  36. data/lib/playwright_api/dialog.rb +28 -8
  37. data/lib/playwright_api/element_handle.rb +111 -37
  38. data/lib/playwright_api/file_chooser.rb +5 -0
  39. data/lib/playwright_api/frame.rb +228 -37
  40. data/lib/playwright_api/js_handle.rb +26 -3
  41. data/lib/playwright_api/keyboard.rb +48 -1
  42. data/lib/playwright_api/mouse.rb +26 -5
  43. data/lib/playwright_api/page.rb +456 -48
  44. data/lib/playwright_api/playwright.rb +26 -9
  45. data/lib/playwright_api/request.rb +34 -6
  46. data/lib/playwright_api/response.rb +8 -8
  47. data/lib/playwright_api/route.rb +30 -6
  48. data/lib/playwright_api/selectors.rb +32 -6
  49. data/lib/playwright_api/touchscreen.rb +1 -1
  50. data/lib/playwright_api/worker.rb +25 -1
  51. data/playwright.gemspec +4 -2
  52. metadata +37 -14
  53. data/lib/playwright/channel_owners/chromium_browser.rb +0 -8
  54. data/lib/playwright/channel_owners/chromium_browser_context.rb +0 -8
  55. data/lib/playwright/channel_owners/download.rb +0 -27
  56. data/lib/playwright/channel_owners/firefox_browser.rb +0 -8
  57. data/lib/playwright/channel_owners/webkit_browser.rb +0 -8
  58. data/lib/playwright_api/binding_call.rb +0 -32
  59. data/lib/playwright_api/chromium_browser_context.rb +0 -59
  60. data/lib/playwright_api/download.rb +0 -95
  61. data/lib/playwright_api/video.rb +0 -24
@@ -31,6 +31,29 @@ module Playwright
31
31
  # })();
32
32
  # ```
33
33
  #
34
+ # ```java
35
+ # import com.microsoft.playwright.*;
36
+ #
37
+ # public class Example {
38
+ # public static void main(String[] args) {
39
+ # try (Playwright playwright = Playwright.create()) {
40
+ # BrowserType firefox = playwright.firefox();
41
+ # Browser browser = firefox.launch();
42
+ # Page page = browser.newPage();
43
+ # page.navigate("https://www.google.com/chrome/browser/canary.html");
44
+ # dumpFrameTree(page.mainFrame(), "");
45
+ # browser.close();
46
+ # }
47
+ # }
48
+ # static void dumpFrameTree(Frame frame, String indent) {
49
+ # System.out.println(indent + frame.url());
50
+ # for (Frame child : frame.childFrames()) {
51
+ # dumpFrameTree(child, indent + " ");
52
+ # }
53
+ # }
54
+ # }
55
+ # ```
56
+ #
34
57
  # ```python async
35
58
  # import asyncio
36
59
  # from playwright.async_api import async_playwright
@@ -91,20 +114,25 @@ module Playwright
91
114
  end
92
115
 
93
116
  # This method checks an element matching `selector` by performing the following steps:
94
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
95
- # 1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
117
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
118
+ # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
96
119
  # checked, this method returns immediately.
97
120
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
98
121
  # element is detached during the checks, the whole action is retried.
99
122
  # 1. Scroll the element into view if needed.
100
123
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
101
124
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
102
- # 1. Ensure that the element is now checked. If not, this method rejects.
125
+ # 1. Ensure that the element is now checked. If not, this method throws.
103
126
  #
104
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
105
- # Passing zero timeout disables this.
106
- def check(selector, force: nil, noWaitAfter: nil, timeout: nil)
107
- wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
127
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
128
+ # zero timeout disables this.
129
+ def check(
130
+ selector,
131
+ force: nil,
132
+ noWaitAfter: nil,
133
+ position: nil,
134
+ timeout: nil)
135
+ wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout)))
108
136
  end
109
137
 
110
138
  def child_frames
@@ -112,15 +140,15 @@ module Playwright
112
140
  end
113
141
 
114
142
  # This method clicks an element matching `selector` by performing the following steps:
115
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
143
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
116
144
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
117
145
  # element is detached during the checks, the whole action is retried.
118
146
  # 1. Scroll the element into view if needed.
119
147
  # 1. Use [`property: Page.mouse`] to click in the center of the element, or the specified `position`.
120
148
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
121
149
  #
122
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
123
- # Passing zero timeout disables this.
150
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
151
+ # zero timeout disables this.
124
152
  def click(
125
153
  selector,
126
154
  button: nil,
@@ -140,16 +168,16 @@ module Playwright
140
168
  end
141
169
 
142
170
  # This method double clicks an element matching `selector` by performing the following steps:
143
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
171
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
144
172
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
145
173
  # element is detached during the checks, the whole action is retried.
146
174
  # 1. Scroll the element into view if needed.
147
175
  # 1. Use [`property: Page.mouse`] to double click in the center of the element, or the specified `position`.
148
176
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the
149
- # first click of the `dblclick()` triggers a navigation event, this method will reject.
177
+ # first click of the `dblclick()` triggers a navigation event, this method will throw.
150
178
  #
151
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
152
- # Passing zero timeout disables this.
179
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
180
+ # zero timeout disables this.
153
181
  #
154
182
  # > NOTE: `frame.dblclick()` dispatches two `click` events and a single `dblclick` event.
155
183
  def dblclick(
@@ -164,8 +192,8 @@ module Playwright
164
192
  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)))
165
193
  end
166
194
 
167
- # The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the elment, `click`
168
- # is dispatched. This is equivalend to calling
195
+ # The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
196
+ # `click` is dispatched. This is equivalent to calling
169
197
  # [element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
170
198
  #
171
199
  #
@@ -173,6 +201,10 @@ module Playwright
173
201
  # await frame.dispatchEvent('button#submit', 'click');
174
202
  # ```
175
203
  #
204
+ # ```java
205
+ # frame.dispatchEvent("button#submit", "click");
206
+ # ```
207
+ #
176
208
  # ```python async
177
209
  # await frame.dispatch_event("button#submit", "click")
178
210
  # ```
@@ -202,6 +234,14 @@ module Playwright
202
234
  # await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });
203
235
  # ```
204
236
  #
237
+ # ```java
238
+ # // Note you can only create DataTransfer in Chromium and Firefox
239
+ # JSHandle dataTransfer = frame.evaluateHandle("() => new DataTransfer()");
240
+ # Map<String, Object> arg = new HashMap<>();
241
+ # arg.put("dataTransfer", dataTransfer);
242
+ # frame.dispatchEvent("#source", "dragstart", arg);
243
+ # ```
244
+ #
205
245
  # ```python async
206
246
  # # note you can only create data_transfer in chromium and firefox
207
247
  # data_transfer = await frame.evaluate_handle("new DataTransfer()")
@@ -235,6 +275,12 @@ module Playwright
235
275
  # const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
236
276
  # ```
237
277
  #
278
+ # ```java
279
+ # String searchValue = (String) frame.evalOnSelector("#search", "el => el.value");
280
+ # String preloadHref = (String) frame.evalOnSelector("link[rel=preload]", "el => el.href");
281
+ # String html = (String) frame.evalOnSelector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
282
+ # ```
283
+ #
238
284
  # ```python async
239
285
  # search_value = await frame.eval_on_selector("#search", "el => el.value")
240
286
  # preload_href = await frame.eval_on_selector("link[rel=preload]", "el => el.href")
@@ -265,6 +311,10 @@ module Playwright
265
311
  # const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);
266
312
  # ```
267
313
  #
314
+ # ```java
315
+ # boolean divsCounts = (boolean) page.evalOnSelectorAll("div", "(divs, min) => divs.length >= min", 10);
316
+ # ```
317
+ #
268
318
  # ```python async
269
319
  # divs_counts = await frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
270
320
  # ```
@@ -293,6 +343,13 @@ module Playwright
293
343
  # console.log(result); // prints "56"
294
344
  # ```
295
345
  #
346
+ # ```java
347
+ # Object result = frame.evaluate("([x, y]) => {\n" +
348
+ # " return Promise.resolve(x * y);\n" +
349
+ # "}", Arrays.asList(7, 8));
350
+ # System.out.println(result); // prints "56"
351
+ # ```
352
+ #
296
353
  # ```python async
297
354
  # result = await frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
298
355
  # print(result) # prints "56"
@@ -310,6 +367,10 @@ module Playwright
310
367
  # console.log(await frame.evaluate('1 + 2')); // prints "3"
311
368
  # ```
312
369
  #
370
+ # ```java
371
+ # System.out.println(frame.evaluate("1 + 2")); // prints "3"
372
+ # ```
373
+ #
313
374
  # ```python async
314
375
  # print(await frame.evaluate("1 + 2")) # prints "3"
315
376
  # x = 10
@@ -331,6 +392,12 @@ module Playwright
331
392
  # await bodyHandle.dispose();
332
393
  # ```
333
394
  #
395
+ # ```java
396
+ # ElementHandle bodyHandle = frame.querySelector("body");
397
+ # String html = (String) frame.evaluate("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(bodyHandle, "hello"));
398
+ # bodyHandle.dispose();
399
+ # ```
400
+ #
334
401
  # ```python async
335
402
  # body_handle = await frame.query_selector("body")
336
403
  # html = await frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
@@ -349,7 +416,7 @@ module Playwright
349
416
  # Returns the return value of `expression` as a `JSHandle`.
350
417
  #
351
418
  # The only difference between [`method: Frame.evaluate`] and [`method: Frame.evaluateHandle`] is that
352
- # [method: Frame.evaluateHandle`] returns `JSHandle`.
419
+ # [`method: Frame.evaluateHandle`] returns `JSHandle`.
353
420
  #
354
421
  # If the function, passed to the [`method: Frame.evaluateHandle`], returns a [Promise], then
355
422
  # [`method: Frame.evaluateHandle`] would wait for the promise to resolve and return its value.
@@ -360,6 +427,11 @@ module Playwright
360
427
  # aWindowHandle; // Handle for the window object.
361
428
  # ```
362
429
  #
430
+ # ```java
431
+ # // Handle for the window object.
432
+ # JSHandle aWindowHandle = frame.evaluateHandle("() => Promise.resolve(window)");
433
+ # ```
434
+ #
363
435
  # ```python async
364
436
  # a_window_handle = await frame.evaluate_handle("Promise.resolve(window)")
365
437
  # a_window_handle # handle for the window object.
@@ -377,6 +449,10 @@ module Playwright
377
449
  # const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.
378
450
  # ```
379
451
  #
452
+ # ```java
453
+ # JSHandle aHandle = frame.evaluateHandle("document"); // Handle for the "document".
454
+ # ```
455
+ #
380
456
  # ```python async
381
457
  # a_handle = await page.evaluate_handle("document") # handle for the "document"
382
458
  # ```
@@ -395,6 +471,13 @@ module Playwright
395
471
  # await resultHandle.dispose();
396
472
  # ```
397
473
  #
474
+ # ```java
475
+ # JSHandle aHandle = frame.evaluateHandle("() => document.body");
476
+ # JSHandle resultHandle = frame.evaluateHandle("([body, suffix]) => body.innerHTML + suffix", Arrays.asList(aHandle, "hello"));
477
+ # System.out.println(resultHandle.jsonValue());
478
+ # resultHandle.dispose();
479
+ # ```
480
+ #
398
481
  # ```python async
399
482
  # a_handle = await page.evaluate_handle("document.body")
400
483
  # result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
@@ -443,6 +526,12 @@ module Playwright
443
526
  # console.log(frame === contentFrame); // -> true
444
527
  # ```
445
528
  #
529
+ # ```java
530
+ # ElementHandle frameElement = frame.frameElement();
531
+ # Frame contentFrame = frameElement.contentFrame();
532
+ # System.out.println(frame == contentFrame); // -> true
533
+ # ```
534
+ #
446
535
  # ```python async
447
536
  # frame_element = await frame.frame_element()
448
537
  # content_frame = await frame_element.content_frame()
@@ -486,15 +575,15 @@ module Playwright
486
575
  end
487
576
 
488
577
  # This method hovers over an element matching `selector` by performing the following steps:
489
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
578
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
490
579
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
491
580
  # element is detached during the checks, the whole action is retried.
492
581
  # 1. Scroll the element into view if needed.
493
582
  # 1. Use [`property: Page.mouse`] to hover over the center of the element, or the specified `position`.
494
583
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
495
584
  #
496
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
497
- # Passing zero timeout disables this.
585
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
586
+ # zero timeout disables this.
498
587
  def hover(
499
588
  selector,
500
589
  force: nil,
@@ -584,7 +673,7 @@ module Playwright
584
673
  # If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
585
674
  # texts.
586
675
  #
587
- # Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When speficied with the
676
+ # Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
588
677
  # modifier, modifier is pressed and being held while the subsequent key is being pressed.
589
678
  def press(
590
679
  selector,
@@ -630,6 +719,15 @@ module Playwright
630
719
  # frame.selectOption('select#colors', 'red', 'green', 'blue');
631
720
  # ```
632
721
  #
722
+ # ```java
723
+ # // single selection matching the value
724
+ # frame.selectOption("select#colors", "blue");
725
+ # // single selection matching both the value and the label
726
+ # frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
727
+ # // multiple selection
728
+ # frame.selectOption("select#colors", new String[] {"red", "green", "blue"});
729
+ # ```
730
+ #
633
731
  # ```python async
634
732
  # # single selection matching the value
635
733
  # await frame.select_option("select#colors", "blue")
@@ -673,15 +771,15 @@ module Playwright
673
771
  end
674
772
 
675
773
  # This method taps an element matching `selector` by performing the following steps:
676
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
774
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
677
775
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
678
776
  # element is detached during the checks, the whole action is retried.
679
777
  # 1. Scroll the element into view if needed.
680
778
  # 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
681
779
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
682
780
  #
683
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
684
- # Passing zero timeout disables this.
781
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
782
+ # zero timeout disables this.
685
783
  #
686
784
  # > NOTE: `frame.tap()` requires that the `hasTouch` option of the browser context be set to true.
687
785
  def tap_point(
@@ -715,6 +813,13 @@ module Playwright
715
813
  # await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
716
814
  # ```
717
815
  #
816
+ # ```java
817
+ # // Types instantly
818
+ # frame.type("#mytextarea", "Hello");
819
+ # // Types slower, like a user
820
+ # frame.type("#mytextarea", "World", new Frame.TypeOptions().setDelay(100));
821
+ # ```
822
+ #
718
823
  # ```python async
719
824
  # await frame.type("#mytextarea", "hello") # types instantly
720
825
  # await frame.type("#mytextarea", "world", delay=100) # types slower, like a user
@@ -734,20 +839,25 @@ module Playwright
734
839
  end
735
840
 
736
841
  # This method checks an element matching `selector` by performing the following steps:
737
- # 1. Find an element match matching `selector`. If there is none, wait until a matching element is attached to the DOM.
738
- # 1. Ensure that matched element is a checkbox or a radio input. If not, this method rejects. If the element is already
842
+ # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
843
+ # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
739
844
  # unchecked, this method returns immediately.
740
845
  # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
741
846
  # element is detached during the checks, the whole action is retried.
742
847
  # 1. Scroll the element into view if needed.
743
848
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
744
849
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
745
- # 1. Ensure that the element is now unchecked. If not, this method rejects.
850
+ # 1. Ensure that the element is now unchecked. If not, this method throws.
746
851
  #
747
- # When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
748
- # Passing zero timeout disables this.
749
- def uncheck(selector, force: nil, noWaitAfter: nil, timeout: nil)
750
- wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
852
+ # When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
853
+ # zero timeout disables this.
854
+ def uncheck(
855
+ selector,
856
+ force: nil,
857
+ noWaitAfter: nil,
858
+ position: nil,
859
+ timeout: nil)
860
+ wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout)))
751
861
  end
752
862
 
753
863
  # Returns frame's url.
@@ -773,6 +883,23 @@ module Playwright
773
883
  # })();
774
884
  # ```
775
885
  #
886
+ # ```java
887
+ # import com.microsoft.playwright.*;
888
+ #
889
+ # public class Example {
890
+ # public static void main(String[] args) {
891
+ # try (Playwright playwright = Playwright.create()) {
892
+ # BrowserType firefox = playwright.firefox();
893
+ # Browser browser = firefox.launch();
894
+ # Page page = browser.newPage();
895
+ # page.setViewportSize(50, 50);
896
+ # page.mainFrame().waitForFunction("window.innerWidth < 100");
897
+ # browser.close();
898
+ # }
899
+ # }
900
+ # }
901
+ # ```
902
+ #
776
903
  # ```python async
777
904
  # import asyncio
778
905
  # from playwright.async_api import async_playwright
@@ -814,6 +941,11 @@ module Playwright
814
941
  # await frame.waitForFunction(selector => !!document.querySelector(selector), selector);
815
942
  # ```
816
943
  #
944
+ # ```java
945
+ # String selector = ".foo";
946
+ # frame.waitForFunction("selector => !!document.querySelector(selector)", selector);
947
+ # ```
948
+ #
817
949
  # ```python async
818
950
  # selector = ".foo"
819
951
  # await frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
@@ -838,6 +970,11 @@ module Playwright
838
970
  # await frame.waitForLoadState(); // Waits for 'load' state by default.
839
971
  # ```
840
972
  #
973
+ # ```java
974
+ # frame.click("button"); // Click triggers navigation.
975
+ # frame.waitForLoadState(); // Waits for "load" state by default.
976
+ # ```
977
+ #
841
978
  # ```python async
842
979
  # await frame.click("button") # click triggers navigation.
843
980
  # await frame.wait_for_load_state() # the promise resolves after "load" event.
@@ -866,6 +1003,14 @@ module Playwright
866
1003
  # ]);
867
1004
  # ```
868
1005
  #
1006
+ # ```java
1007
+ # // The method returns after navigation has finished
1008
+ # Response response = frame.waitForNavigation(() -> {
1009
+ # // Clicking the link will indirectly cause a navigation
1010
+ # frame.click("a.delayed-navigation");
1011
+ # });
1012
+ # ```
1013
+ #
869
1014
  # ```python async
870
1015
  # async with frame.expect_navigation():
871
1016
  # await frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
@@ -909,6 +1054,26 @@ module Playwright
909
1054
  # })();
910
1055
  # ```
911
1056
  #
1057
+ # ```java
1058
+ # import com.microsoft.playwright.*;
1059
+ #
1060
+ # public class Example {
1061
+ # public static void main(String[] args) {
1062
+ # try (Playwright playwright = Playwright.create()) {
1063
+ # BrowserType chromium = playwright.chromium();
1064
+ # Browser browser = chromium.launch();
1065
+ # Page page = browser.newPage();
1066
+ # for (String currentURL : Arrays.asList("https://google.com", "https://bbc.com")) {
1067
+ # page.navigate(currentURL);
1068
+ # ElementHandle element = page.mainFrame().waitForSelector("img");
1069
+ # System.out.println("Loaded image: " + element.getAttribute("src"));
1070
+ # }
1071
+ # browser.close();
1072
+ # }
1073
+ # }
1074
+ # }
1075
+ # ```
1076
+ #
912
1077
  # ```python async
913
1078
  # import asyncio
914
1079
  # from playwright.async_api import async_playwright
@@ -957,15 +1122,35 @@ module Playwright
957
1122
  raise NotImplementedError.new('wait_for_timeout is not implemented yet.')
958
1123
  end
959
1124
 
960
- # @nodoc
961
- def detached=(req)
962
- wrap_impl(@impl.detached=(unwrap_impl(req)))
1125
+ # Waits for the frame to navigate to the given URL.
1126
+ #
1127
+ #
1128
+ # ```js
1129
+ # await frame.click('a.delayed-navigation'); // Clicking the link will indirectly cause a navigation
1130
+ # await frame.waitForURL('**/target.html');
1131
+ # ```
1132
+ #
1133
+ # ```java
1134
+ # frame.click("a.delayed-navigation"); // Clicking the link will indirectly cause a navigation
1135
+ # frame.waitForURL("**/target.html");
1136
+ # ```
1137
+ #
1138
+ # ```python async
1139
+ # await frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
1140
+ # await frame.wait_for_url("**/target.html")
1141
+ # ```
1142
+ #
1143
+ # ```python sync
1144
+ # frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
1145
+ # frame.wait_for_url("**/target.html")
1146
+ # ```
1147
+ def wait_for_url(url, timeout: nil, waitUntil: nil)
1148
+ wrap_impl(@impl.wait_for_url(unwrap_impl(url), timeout: unwrap_impl(timeout), waitUntil: unwrap_impl(waitUntil)))
963
1149
  end
964
1150
 
965
- # -- inherited from EventEmitter --
966
1151
  # @nodoc
967
- def off(event, callback)
968
- event_emitter_proxy.off(event, callback)
1152
+ def detached=(req)
1153
+ wrap_impl(@impl.detached=(unwrap_impl(req)))
969
1154
  end
970
1155
 
971
1156
  # -- inherited from EventEmitter --
@@ -980,6 +1165,12 @@ module Playwright
980
1165
  event_emitter_proxy.on(event, callback)
981
1166
  end
982
1167
 
1168
+ # -- inherited from EventEmitter --
1169
+ # @nodoc
1170
+ def off(event, callback)
1171
+ event_emitter_proxy.off(event, callback)
1172
+ end
1173
+
983
1174
  private def event_emitter_proxy
984
1175
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
985
1176
  end
@@ -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