playwright-ruby-client 1.20.2 → 1.23.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/api_request_context.md +15 -2
  3. data/documentation/docs/api/browser.md +16 -0
  4. data/documentation/docs/api/browser_context.md +15 -2
  5. data/documentation/docs/api/browser_type.md +5 -1
  6. data/documentation/docs/api/console_message.md +27 -1
  7. data/documentation/docs/api/element_handle.md +23 -13
  8. data/documentation/docs/api/experimental/android.md +1 -1
  9. data/documentation/docs/api/experimental/android_device.md +4 -0
  10. data/documentation/docs/api/file_chooser.md +1 -1
  11. data/documentation/docs/api/frame.md +12 -5
  12. data/documentation/docs/api/frame_locator.md +1 -1
  13. data/documentation/docs/api/locator.md +44 -13
  14. data/documentation/docs/api/page.md +32 -9
  15. data/documentation/docs/api/request.md +3 -1
  16. data/documentation/docs/api/response.md +12 -1
  17. data/documentation/docs/api/route.md +67 -0
  18. data/documentation/docs/include/api_coverage.md +6 -3
  19. data/documentation/package.json +6 -6
  20. data/documentation/yarn.lock +2931 -3220
  21. data/lib/playwright/channel.rb +1 -3
  22. data/lib/playwright/channel_owners/browser.rb +13 -0
  23. data/lib/playwright/channel_owners/browser_context.rb +89 -13
  24. data/lib/playwright/channel_owners/browser_type.rb +4 -0
  25. data/lib/playwright/channel_owners/element_handle.rb +12 -3
  26. data/lib/playwright/channel_owners/frame.rb +20 -7
  27. data/lib/playwright/channel_owners/local_utils.rb +29 -0
  28. data/lib/playwright/channel_owners/page.rb +54 -22
  29. data/lib/playwright/channel_owners/request.rb +31 -6
  30. data/lib/playwright/channel_owners/response.rb +6 -0
  31. data/lib/playwright/channel_owners/route.rb +104 -45
  32. data/lib/playwright/channel_owners/writable_stream.rb +14 -0
  33. data/lib/playwright/connection.rb +6 -1
  34. data/lib/playwright/har_router.rb +82 -0
  35. data/lib/playwright/http_headers.rb +1 -1
  36. data/lib/playwright/input_files.rb +60 -8
  37. data/lib/playwright/javascript/regex.rb +23 -0
  38. data/lib/playwright/javascript/value_parser.rb +17 -2
  39. data/lib/playwright/javascript/value_serializer.rb +16 -6
  40. data/lib/playwright/javascript/visitor_info.rb +26 -0
  41. data/lib/playwright/javascript.rb +1 -0
  42. data/lib/playwright/locator_impl.rb +18 -5
  43. data/lib/playwright/playwright_api.rb +26 -6
  44. data/lib/playwright/route_handler.rb +2 -6
  45. data/lib/playwright/transport.rb +12 -2
  46. data/lib/playwright/utils.rb +31 -6
  47. data/lib/playwright/version.rb +2 -2
  48. data/lib/playwright.rb +2 -0
  49. data/lib/playwright_api/accessibility.rb +2 -1
  50. data/lib/playwright_api/android.rb +2 -2
  51. data/lib/playwright_api/android_device.rb +5 -1
  52. data/lib/playwright_api/api_request.rb +3 -3
  53. data/lib/playwright_api/api_request_context.rb +15 -2
  54. data/lib/playwright_api/browser.rb +15 -2
  55. data/lib/playwright_api/browser_context.rb +17 -7
  56. data/lib/playwright_api/browser_type.rb +7 -3
  57. data/lib/playwright_api/console_message.rb +20 -1
  58. data/lib/playwright_api/element_handle.rb +53 -49
  59. data/lib/playwright_api/file_chooser.rb +1 -1
  60. data/lib/playwright_api/frame.rb +30 -23
  61. data/lib/playwright_api/frame_locator.rb +1 -1
  62. data/lib/playwright_api/locator.rb +58 -38
  63. data/lib/playwright_api/page.rb +52 -32
  64. data/lib/playwright_api/playwright.rb +1 -1
  65. data/lib/playwright_api/request.rb +8 -1
  66. data/lib/playwright_api/response.rb +14 -1
  67. data/lib/playwright_api/route.rb +63 -2
  68. data/lib/playwright_api/selectors.rb +1 -1
  69. data/lib/playwright_api/tracing.rb +1 -1
  70. metadata +7 -4
  71. data/lib/playwright_api/local_utils.rb +0 -9
@@ -2,7 +2,7 @@ module Playwright
2
2
  # Locators are the central piece of Playwright's auto-waiting and retry-ability. In a nutshell, locators represent a way
3
3
  # to find element(s) on the page at any moment. Locator can be created with the [`method: Page.locator`] method.
4
4
  #
5
- # [Learn more about locators](./locators.md).
5
+ # [Learn more about locators](../locators.md).
6
6
  class Locator < PlaywrightApi
7
7
 
8
8
  # Returns an array of `node.innerText` values for all matching nodes.
@@ -39,7 +39,7 @@ module Playwright
39
39
  # This method checks the element by performing the following steps:
40
40
  # 1. Ensure that element is a checkbox or a radio input. If not, this method throws. If the element is already checked,
41
41
  # this method returns immediately.
42
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
42
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
43
43
  # 1. Scroll the element into view if needed.
44
44
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
45
45
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
@@ -59,7 +59,7 @@ module Playwright
59
59
  end
60
60
 
61
61
  # This method clicks the element by performing the following steps:
62
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
62
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
63
63
  # 1. Scroll the element into view if needed.
64
64
  # 1. Use [`property: Page.mouse`] to click in the center of the element, or the specified `position`.
65
65
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
@@ -87,7 +87,7 @@ module Playwright
87
87
  end
88
88
 
89
89
  # This method double clicks the element by performing the following steps:
90
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
90
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
91
91
  # 1. Scroll the element into view if needed.
92
92
  # 1. Use [`property: Page.mouse`] to double click in the center of the element, or the specified `position`.
93
93
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the
@@ -211,7 +211,7 @@ module Playwright
211
211
  wrap_impl(@impl.evaluate_handle(unwrap_impl(expression), arg: unwrap_impl(arg), timeout: unwrap_impl(timeout)))
212
212
  end
213
213
 
214
- # This method waits for [actionability](./actionability.md) checks, focuses the element, fills it and triggers an `input`
214
+ # This method waits for [actionability](../actionability.md) checks, focuses the element, fills it and triggers an `input`
215
215
  # event after filling. Note that you can pass an empty string to clear the input field.
216
216
  #
217
217
  # If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error.
@@ -224,6 +224,21 @@ module Playwright
224
224
  wrap_impl(@impl.fill(unwrap_impl(value), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
225
225
  end
226
226
 
227
+ # This method narrows existing locator according to the options, for example filters by text. It can be chained to filter
228
+ # multiple times.
229
+ #
230
+ # ```python sync
231
+ # row_locator = page.lsocator("tr")
232
+ # # ...
233
+ # row_locator
234
+ # .filter(has_text="text in column 1")
235
+ # .filter(has=page.locator("tr", has_text="column 2 button"))
236
+ # .screenshot()
237
+ # ```
238
+ def filter(has: nil, hasText: nil)
239
+ wrap_impl(@impl.filter(has: unwrap_impl(has), hasText: unwrap_impl(hasText)))
240
+ end
241
+
227
242
  # Returns locator to the first matching element.
228
243
  def first
229
244
  wrap_impl(@impl.first)
@@ -257,7 +272,7 @@ module Playwright
257
272
  end
258
273
 
259
274
  # This method hovers over the element by performing the following steps:
260
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
275
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
261
276
  # 1. Scroll the element into view if needed.
262
277
  # 1. Use [`property: Page.mouse`] to hover over the center of the element, or the specified `position`.
263
278
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
@@ -285,7 +300,10 @@ module Playwright
285
300
  wrap_impl(@impl.inner_text(timeout: unwrap_impl(timeout)))
286
301
  end
287
302
 
288
- # Returns `input.value` for `<input>` or `<textarea>` or `<select>` element. Throws for non-input elements.
303
+ # Returns `input.value` for the selected `<input>` or `<textarea>` or `<select>` element.
304
+ #
305
+ # Throws for non-input elements. However, if the element is inside the `<label>` element that has an associated
306
+ # [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), returns the value of the control.
289
307
  def input_value(timeout: nil)
290
308
  wrap_impl(@impl.input_value(timeout: unwrap_impl(timeout)))
291
309
  end
@@ -295,27 +313,27 @@ module Playwright
295
313
  wrap_impl(@impl.checked?(timeout: unwrap_impl(timeout)))
296
314
  end
297
315
 
298
- # Returns whether the element is disabled, the opposite of [enabled](./actionability.md#enabled).
316
+ # Returns whether the element is disabled, the opposite of [enabled](../actionability.md#enabled).
299
317
  def disabled?(timeout: nil)
300
318
  wrap_impl(@impl.disabled?(timeout: unwrap_impl(timeout)))
301
319
  end
302
320
 
303
- # Returns whether the element is [editable](./actionability.md#editable).
321
+ # Returns whether the element is [editable](../actionability.md#editable).
304
322
  def editable?(timeout: nil)
305
323
  wrap_impl(@impl.editable?(timeout: unwrap_impl(timeout)))
306
324
  end
307
325
 
308
- # Returns whether the element is [enabled](./actionability.md#enabled).
326
+ # Returns whether the element is [enabled](../actionability.md#enabled).
309
327
  def enabled?(timeout: nil)
310
328
  wrap_impl(@impl.enabled?(timeout: unwrap_impl(timeout)))
311
329
  end
312
330
 
313
- # Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible).
331
+ # Returns whether the element is hidden, the opposite of [visible](../actionability.md#visible).
314
332
  def hidden?(timeout: nil)
315
333
  wrap_impl(@impl.hidden?(timeout: unwrap_impl(timeout)))
316
334
  end
317
335
 
318
- # Returns whether the element is [visible](./actionability.md#visible).
336
+ # Returns whether the element is [visible](../actionability.md#visible).
319
337
  def visible?(timeout: nil)
320
338
  wrap_impl(@impl.visible?(timeout: unwrap_impl(timeout)))
321
339
  end
@@ -325,12 +343,13 @@ module Playwright
325
343
  wrap_impl(@impl.last)
326
344
  end
327
345
 
328
- # The method finds an element matching the specified selector in the `Locator`'s subtree.
346
+ # The method finds an element matching the specified selector in the `Locator`'s subtree. It also accepts filter options,
347
+ # similar to [`method: Locator.filter`] method.
329
348
  def locator(selector, has: nil, hasText: nil)
330
349
  wrap_impl(@impl.locator(unwrap_impl(selector), has: unwrap_impl(has), hasText: unwrap_impl(hasText)))
331
350
  end
332
351
 
333
- # Returns locator to the n-th matching element.
352
+ # Returns locator to the n-th matching element. It's zero based, `nth(0)` selects the first element.
334
353
  def nth(index)
335
354
  wrap_impl(@impl.nth(unwrap_impl(index)))
336
355
  end
@@ -362,29 +381,35 @@ module Playwright
362
381
  wrap_impl(@impl.press(unwrap_impl(key), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
363
382
  end
364
383
 
365
- # Returns the buffer with the captured screenshot.
384
+ # This method captures a screenshot of the page, clipped to the size and position of a particular element matching the
385
+ # locator. If the element is covered by other elements, it will not be actually visible on the screenshot. If the element
386
+ # is a scrollable container, only the currently scrolled content will be visible on the screenshot.
366
387
  #
367
- # This method waits for the [actionability](./actionability.md) checks, then scrolls element into view before taking a
388
+ # This method waits for the [actionability](../actionability.md) checks, then scrolls element into view before taking a
368
389
  # screenshot. If the element is detached from DOM, the method throws an error.
390
+ #
391
+ # Returns the buffer with the captured screenshot.
369
392
  def screenshot(
370
393
  animations: nil,
394
+ caret: nil,
371
395
  mask: nil,
372
396
  omitBackground: nil,
373
397
  path: nil,
374
398
  quality: nil,
399
+ scale: nil,
375
400
  timeout: nil,
376
401
  type: nil)
377
- wrap_impl(@impl.screenshot(animations: unwrap_impl(animations), mask: unwrap_impl(mask), omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
402
+ wrap_impl(@impl.screenshot(animations: unwrap_impl(animations), caret: unwrap_impl(caret), mask: unwrap_impl(mask), omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), scale: unwrap_impl(scale), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
378
403
  end
379
404
 
380
- # This method waits for [actionability](./actionability.md) checks, then tries to scroll element into view, unless it is
405
+ # This method waits for [actionability](../actionability.md) checks, then tries to scroll element into view, unless it is
381
406
  # completely visible as defined by
382
407
  # [IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)'s `ratio`.
383
408
  def scroll_into_view_if_needed(timeout: nil)
384
409
  wrap_impl(@impl.scroll_into_view_if_needed(timeout: unwrap_impl(timeout)))
385
410
  end
386
411
 
387
- # This method waits for [actionability](./actionability.md) checks, waits until all specified options are present in the
412
+ # This method waits for [actionability](../actionability.md) checks, waits until all specified options are present in the
388
413
  # `<select>` element and selects these options.
389
414
  #
390
415
  # If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
@@ -403,17 +428,6 @@ module Playwright
403
428
  # # multiple selection
404
429
  # element.select_option(value=["red", "green", "blue"])
405
430
  # ```
406
- #
407
- # ```python sync
408
- # # single selection matching the value
409
- # element.select_option("blue")
410
- # # single selection matching both the value and the label
411
- # element.select_option(label="blue")
412
- # # multiple selection
413
- # element.select_option("red", "green", "blue")
414
- # # multiple selection for blue, red and second option
415
- # element.select_option(value="blue", { index: 2 }, "red")
416
- # ```
417
431
  def select_option(
418
432
  element: nil,
419
433
  index: nil,
@@ -425,8 +439,12 @@ module Playwright
425
439
  wrap_impl(@impl.select_option(element: unwrap_impl(element), index: unwrap_impl(index), value: unwrap_impl(value), label: unwrap_impl(label), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
426
440
  end
427
441
 
428
- # This method waits for [actionability](./actionability.md) checks, then focuses the element and selects all its text
442
+ # This method waits for [actionability](../actionability.md) checks, then focuses the element and selects all its text
429
443
  # content.
444
+ #
445
+ # If the element is inside the `<label>` element that has an associated
446
+ # [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), focuses and selects text in the
447
+ # control instead.
430
448
  def select_text(force: nil, timeout: nil)
431
449
  wrap_impl(@impl.select_text(force: unwrap_impl(force), timeout: unwrap_impl(timeout)))
432
450
  end
@@ -434,7 +452,7 @@ module Playwright
434
452
  # This method checks or unchecks an element by performing the following steps:
435
453
  # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws.
436
454
  # 1. If the element already has the right checked state, this method returns immediately.
437
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
455
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
438
456
  # element is detached during the checks, the whole action is retried.
439
457
  # 1. Scroll the element into view if needed.
440
458
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
@@ -454,18 +472,20 @@ module Playwright
454
472
  end
455
473
  alias_method :checked=, :set_checked
456
474
 
457
- # This method expects `element` to point to an
458
- # [input element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
459
- #
460
475
  # Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
461
- # are resolved relative to the the current working directory. For empty array, clears the selected files.
476
+ # are resolved relative to the current working directory. For empty array, clears the selected files.
477
+ #
478
+ # This method expects `Locator` to point to an
479
+ # [input element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input). However, if the element is inside the
480
+ # `<label>` element that has an associated
481
+ # [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), targets the control instead.
462
482
  def set_input_files(files, noWaitAfter: nil, timeout: nil)
463
483
  wrap_impl(@impl.set_input_files(unwrap_impl(files), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
464
484
  end
465
485
  alias_method :input_files=, :set_input_files
466
486
 
467
487
  # This method taps the element by performing the following steps:
468
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
488
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
469
489
  # 1. Scroll the element into view if needed.
470
490
  # 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
471
491
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
@@ -514,7 +534,7 @@ module Playwright
514
534
  # This method checks the element by performing the following steps:
515
535
  # 1. Ensure that element is a checkbox or a radio input. If not, this method throws. If the element is already
516
536
  # unchecked, this method returns immediately.
517
- # 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
537
+ # 1. Wait for [actionability](../actionability.md) checks on the element, unless `force` option is set.
518
538
  # 1. Scroll the element into view if needed.
519
539
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
520
540
  # 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
@@ -56,7 +56,8 @@ module Playwright
56
56
  wrap_impl(@impl.mouse)
57
57
  end
58
58
 
59
- # API testing helper associated with this page. Requests made with this API will use page cookies.
59
+ # API testing helper associated with this page. This method returns the same instance as
60
+ # [`property: BrowserContext.request`] on the page's context. See [`property: BrowserContext.request`] for more details.
60
61
  def request # property
61
62
  wrap_impl(@impl.request)
62
63
  end
@@ -111,7 +112,7 @@ module Playwright
111
112
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
112
113
  # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
113
114
  # checked, this method returns immediately.
114
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
115
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
115
116
  # element is detached during the checks, the whole action is retried.
116
117
  # 1. Scroll the element into view if needed.
117
118
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
@@ -135,7 +136,7 @@ module Playwright
135
136
 
136
137
  # This method clicks an element matching `selector` by performing the following steps:
137
138
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
138
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
139
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
139
140
  # element is detached during the checks, the whole action is retried.
140
141
  # 1. Scroll the element into view if needed.
141
142
  # 1. Use [`property: Page.mouse`] to click in the center of the element, or the specified `position`.
@@ -183,7 +184,7 @@ module Playwright
183
184
 
184
185
  # This method double clicks an element matching `selector` by performing the following steps:
185
186
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
186
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
187
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
187
188
  # element is detached during the checks, the whole action is retried.
188
189
  # 1. Scroll the element into view if needed.
189
190
  # 1. Use [`property: Page.mouse`] to double click in the center of the element, or the specified `position`.
@@ -501,7 +502,7 @@ module Playwright
501
502
  wrap_impl(@impl.expose_function(unwrap_impl(name), unwrap_impl(callback)))
502
503
  end
503
504
 
504
- # This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
505
+ # This method waits for an element matching `selector`, waits for [actionability](../actionability.md) checks, focuses the
505
506
  # element, fills it and triggers an `input` event after filling. Note that you can pass an empty string to clear the input
506
507
  # field.
507
508
  #
@@ -582,8 +583,8 @@ module Playwright
582
583
  wrap_impl(@impl.go_forward(timeout: unwrap_impl(timeout), waitUntil: unwrap_impl(waitUntil)))
583
584
  end
584
585
 
585
- # Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
586
- # last redirect.
586
+ # Returns the main resource response. In case of multiple redirects, the navigation will resolve with the first
587
+ # non-redirect response.
587
588
  #
588
589
  # The method will throw an error if:
589
590
  # - there's an SSL error (e.g. in case of self-signed certificates).
@@ -608,7 +609,7 @@ module Playwright
608
609
 
609
610
  # This method hovers over an element matching `selector` by performing the following steps:
610
611
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
611
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
612
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
612
613
  # element is detached during the checks, the whole action is retried.
613
614
  # 1. Scroll the element into view if needed.
614
615
  # 1. Use [`property: Page.mouse`] to hover over the center of the element, or the specified `position`.
@@ -639,7 +640,10 @@ module Playwright
639
640
  wrap_impl(@impl.inner_text(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
640
641
  end
641
642
 
642
- # Returns `input.value` for the selected `<input>` or `<textarea>` or `<select>` element. Throws for non-input elements.
643
+ # Returns `input.value` for the selected `<input>` or `<textarea>` or `<select>` element.
644
+ #
645
+ # Throws for non-input elements. However, if the element is inside the `<label>` element that has an associated
646
+ # [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), returns the value of the control.
643
647
  def input_value(selector, strict: nil, timeout: nil)
644
648
  wrap_impl(@impl.input_value(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
645
649
  end
@@ -654,28 +658,28 @@ module Playwright
654
658
  wrap_impl(@impl.closed?)
655
659
  end
656
660
 
657
- # Returns whether the element is disabled, the opposite of [enabled](./actionability.md#enabled).
661
+ # Returns whether the element is disabled, the opposite of [enabled](../actionability.md#enabled).
658
662
  def disabled?(selector, strict: nil, timeout: nil)
659
663
  wrap_impl(@impl.disabled?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
660
664
  end
661
665
 
662
- # Returns whether the element is [editable](./actionability.md#editable).
666
+ # Returns whether the element is [editable](../actionability.md#editable).
663
667
  def editable?(selector, strict: nil, timeout: nil)
664
668
  wrap_impl(@impl.editable?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
665
669
  end
666
670
 
667
- # Returns whether the element is [enabled](./actionability.md#enabled).
671
+ # Returns whether the element is [enabled](../actionability.md#enabled).
668
672
  def enabled?(selector, strict: nil, timeout: nil)
669
673
  wrap_impl(@impl.enabled?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
670
674
  end
671
675
 
672
- # Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible). `selector` that does not
676
+ # Returns whether the element is hidden, the opposite of [visible](../actionability.md#visible). `selector` that does not
673
677
  # match any elements is considered hidden.
674
678
  def hidden?(selector, strict: nil, timeout: nil)
675
679
  wrap_impl(@impl.hidden?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
676
680
  end
677
681
 
678
- # Returns whether the element is [visible](./actionability.md#visible). `selector` that does not match any elements is
682
+ # Returns whether the element is [visible](../actionability.md#visible). `selector` that does not match any elements is
679
683
  # considered not visible.
680
684
  def visible?(selector, strict: nil, timeout: nil)
681
685
  wrap_impl(@impl.visible?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
@@ -685,6 +689,8 @@ module Playwright
685
689
  # element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
686
690
  # different DOM elements. That would happen if the DOM structure between those actions has changed.
687
691
  #
692
+ # [Learn more about locators](../locators.md).
693
+ #
688
694
  # Shortcut for main frame's [`method: Frame.locator`].
689
695
  def locator(selector, has: nil, hasText: nil)
690
696
  wrap_impl(@impl.locator(unwrap_impl(selector), has: unwrap_impl(has), hasText: unwrap_impl(hasText)))
@@ -847,7 +853,7 @@ module Playwright
847
853
  # > NOTE: The handler will only be called for the first url if the response is a redirect.
848
854
  # > NOTE: [`method: Page.route`] will not intercept requests intercepted by Service Worker. See
849
855
  # [this](https://github.com/microsoft/playwright/issues/1090) issue. We recommend disabling Service Workers when using
850
- # request interception. Via `await context.addInitScript(() => delete window.navigator.serviceWorker);`
856
+ # request interception by setting `Browser.newContext.serviceWorkers` to `'block'`.
851
857
  #
852
858
  # An example of a naive handler that aborts all image requests:
853
859
  #
@@ -889,21 +895,33 @@ module Playwright
889
895
  wrap_impl(@impl.route(unwrap_impl(url), unwrap_impl(handler), times: unwrap_impl(times)))
890
896
  end
891
897
 
898
+ # If specified the network requests that are made in the page will be served from the HAR file. Read more about
899
+ # [Replaying from HAR](../network.md#replaying-from-har).
900
+ #
901
+ # Playwright will not serve requests intercepted by Service Worker from the HAR file. See
902
+ # [this](https://github.com/microsoft/playwright/issues/1090) issue. We recommend disabling Service Workers when using
903
+ # request interception by setting `Browser.newContext.serviceWorkers` to `'block'`.
904
+ def route_from_har(har, notFound: nil, update: nil, url: nil)
905
+ wrap_impl(@impl.route_from_har(unwrap_impl(har), notFound: unwrap_impl(notFound), update: unwrap_impl(update), url: unwrap_impl(url)))
906
+ end
907
+
892
908
  # Returns the buffer with the captured screenshot.
893
909
  def screenshot(
894
910
  animations: nil,
911
+ caret: nil,
895
912
  clip: nil,
896
913
  fullPage: nil,
897
914
  mask: nil,
898
915
  omitBackground: nil,
899
916
  path: nil,
900
917
  quality: nil,
918
+ scale: nil,
901
919
  timeout: nil,
902
920
  type: nil)
903
- wrap_impl(@impl.screenshot(animations: unwrap_impl(animations), clip: unwrap_impl(clip), fullPage: unwrap_impl(fullPage), mask: unwrap_impl(mask), omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
921
+ wrap_impl(@impl.screenshot(animations: unwrap_impl(animations), caret: unwrap_impl(caret), clip: unwrap_impl(clip), fullPage: unwrap_impl(fullPage), mask: unwrap_impl(mask), omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), scale: unwrap_impl(scale), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
904
922
  end
905
923
 
906
- # This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, waits until
924
+ # This method waits for an element matching `selector`, waits for [actionability](../actionability.md) checks, waits until
907
925
  # all specified options are present in the `<select>` element and selects these options.
908
926
  #
909
927
  # If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
@@ -941,7 +959,7 @@ module Playwright
941
959
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
942
960
  # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws.
943
961
  # 1. If the element already has the right checked state, this method returns immediately.
944
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
962
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
945
963
  # element is detached during the checks, the whole action is retried.
946
964
  # 1. Scroll the element into view if needed.
947
965
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
@@ -1001,11 +1019,13 @@ module Playwright
1001
1019
  end
1002
1020
  alias_method :extra_http_headers=, :set_extra_http_headers
1003
1021
 
1004
- # This method expects `selector` to point to an
1005
- # [input element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
1006
- #
1007
1022
  # Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
1008
- # are resolved relative to the the current working directory. For empty array, clears the selected files.
1023
+ # are resolved relative to the current working directory. For empty array, clears the selected files.
1024
+ #
1025
+ # This method expects `selector` to point to an
1026
+ # [input element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input). However, if the element is inside the
1027
+ # `<label>` element that has an associated
1028
+ # [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), targets the control instead.
1009
1029
  def set_input_files(
1010
1030
  selector,
1011
1031
  files,
@@ -1035,7 +1055,7 @@ module Playwright
1035
1055
 
1036
1056
  # This method taps an element matching `selector` by performing the following steps:
1037
1057
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
1038
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
1058
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
1039
1059
  # element is detached during the checks, the whole action is retried.
1040
1060
  # 1. Scroll the element into view if needed.
1041
1061
  # 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
@@ -1094,7 +1114,7 @@ module Playwright
1094
1114
  # 1. Find an element matching `selector`. If there is none, wait until a matching element is attached to the DOM.
1095
1115
  # 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already
1096
1116
  # unchecked, this method returns immediately.
1097
- # 1. Wait for [actionability](./actionability.md) checks on the matched element, unless `force` option is set. If the
1117
+ # 1. Wait for [actionability](../actionability.md) checks on the matched element, unless `force` option is set. If the
1098
1118
  # element is detached during the checks, the whole action is retried.
1099
1119
  # 1. Scroll the element into view if needed.
1100
1120
  # 1. Use [`property: Page.mouse`] to click in the center of the element.
@@ -1252,7 +1272,7 @@ module Playwright
1252
1272
  wrap_impl(@impl.expect_popup(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
1253
1273
  end
1254
1274
 
1255
- # Waits for the matching request and returns it. See [waiting for event](./events.md#waiting-for-event) for more details
1275
+ # Waits for the matching request and returns it. See [waiting for event](../events.md#waiting-for-event) for more details
1256
1276
  # about events.
1257
1277
  #
1258
1278
  # ```python sync
@@ -1276,7 +1296,7 @@ module Playwright
1276
1296
  wrap_impl(@impl.expect_request_finished(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
1277
1297
  end
1278
1298
 
1279
- # Returns the matched response. See [waiting for event](./events.md#waiting-for-event) for more details about events.
1299
+ # Returns the matched response. See [waiting for event](../events.md#waiting-for-event) for more details about events.
1280
1300
  #
1281
1301
  # ```python sync
1282
1302
  # with page.expect_response("https://example.com/resource") as response_info:
@@ -1395,8 +1415,8 @@ module Playwright
1395
1415
  end
1396
1416
 
1397
1417
  # @nodoc
1398
- def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1399
- wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1418
+ def guid
1419
+ wrap_impl(@impl.guid)
1400
1420
  end
1401
1421
 
1402
1422
  # @nodoc
@@ -1405,13 +1425,13 @@ module Playwright
1405
1425
  end
1406
1426
 
1407
1427
  # @nodoc
1408
- def stop_css_coverage
1409
- wrap_impl(@impl.stop_css_coverage)
1428
+ def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1429
+ wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1410
1430
  end
1411
1431
 
1412
1432
  # @nodoc
1413
- def guid
1414
- wrap_impl(@impl.guid)
1433
+ def stop_css_coverage
1434
+ wrap_impl(@impl.stop_css_coverage)
1415
1435
  end
1416
1436
 
1417
1437
  # -- inherited from EventEmitter --
@@ -55,7 +55,7 @@ module Playwright
55
55
  raise NotImplementedError.new('request is not implemented yet.')
56
56
  end
57
57
 
58
- # Selectors can be used to install custom selector engines. See [Working with selectors](./selectors.md) for more
58
+ # Selectors can be used to install custom selector engines. See [Working with selectors](../selectors.md) for more
59
59
  # information.
60
60
  def selectors # property
61
61
  wrap_impl(@impl.selectors)
@@ -35,7 +35,9 @@ module Playwright
35
35
  wrap_impl(@impl.frame)
36
36
  end
37
37
 
38
- # **DEPRECATED** Incomplete list of headers as seen by the rendering engine. Use [`method: Request.allHeaders`] instead.
38
+ # An object with the request HTTP headers. The header names are lower-cased. Note that this method does not return
39
+ # security-related headers, including cookie-related ones. You can use [`method: Request.allHeaders`] for complete list of
40
+ # headers that include `cookie` information.
39
41
  def headers
40
42
  wrap_impl(@impl.headers)
41
43
  end
@@ -149,6 +151,11 @@ module Playwright
149
151
  wrap_impl(@impl.url)
150
152
  end
151
153
 
154
+ # @nodoc
155
+ def apply_fallback_overrides(overrides)
156
+ wrap_impl(@impl.apply_fallback_overrides(unwrap_impl(overrides)))
157
+ end
158
+
152
159
  # @nodoc
153
160
  def header_values(name)
154
161
  wrap_impl(@impl.header_values(unwrap_impl(name)))
@@ -22,7 +22,15 @@ module Playwright
22
22
  wrap_impl(@impl.frame)
23
23
  end
24
24
 
25
- # **DEPRECATED** Incomplete list of headers as seen by the rendering engine. Use [`method: Response.allHeaders`] instead.
25
+ # Indicates whether this Response was fullfilled by a Service Worker's Fetch Handler (i.e. via
26
+ # [FetchEvent.respondWith](https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent/respondWith)).
27
+ def from_service_worker
28
+ wrap_impl(@impl.from_service_worker)
29
+ end
30
+
31
+ # An object with the response HTTP headers. The header names are lower-cased. Note that this method does not return
32
+ # security-related headers, including cookie-related ones. You can use [`method: Response.allHeaders`] for complete list
33
+ # of headers that include `cookie` information.
26
34
  def headers
27
35
  wrap_impl(@impl.headers)
28
36
  end
@@ -92,6 +100,11 @@ module Playwright
92
100
  wrap_impl(@impl.url)
93
101
  end
94
102
 
103
+ # @nodoc
104
+ def from_service_worker?
105
+ wrap_impl(@impl.from_service_worker?)
106
+ end
107
+
95
108
  # @nodoc
96
109
  def ok?
97
110
  wrap_impl(@impl.ok?)
@@ -1,6 +1,8 @@
1
1
  module Playwright
2
2
  # Whenever a network route is set up with [`method: Page.route`] or [`method: BrowserContext.route`], the `Route` object
3
3
  # allows to handle the route.
4
+ #
5
+ # Learn more about [networking](../network.md).
4
6
  class Route < PlaywrightApi
5
7
 
6
8
  # Aborts the route's request.
@@ -15,8 +17,8 @@ module Playwright
15
17
  # # override headers
16
18
  # headers = {
17
19
  # **request.headers,
18
- # "foo": "bar" # set "foo" header
19
- # "origin": None # remove "origin" header
20
+ # "foo": "foo-value" # set "foo" header
21
+ # "bar": None # remove "bar" header
20
22
  # }
21
23
  # route.continue_(headers=headers)
22
24
  # }
@@ -26,6 +28,60 @@ module Playwright
26
28
  wrap_impl(@impl.continue(headers: unwrap_impl(headers), method: unwrap_impl(method), postData: unwrap_impl(postData), url: unwrap_impl(url)))
27
29
  end
28
30
 
31
+ # When several routes match the given pattern, they run in the order opposite to their registration. That way the last
32
+ # registered route can always override all the previos ones. In the example below, request will be handled by the
33
+ # bottom-most handler first, then it'll fall back to the previous one and in the end will be aborted by the first
34
+ # registered route.
35
+ #
36
+ # ```python sync
37
+ # page.route("**/*", lambda route: route.abort()) # Runs last.
38
+ # page.route("**/*", lambda route: route.fallback()) # Runs second.
39
+ # page.route("**/*", lambda route: route.fallback()) # Runs first.
40
+ # ```
41
+ #
42
+ # Registering multiple routes is useful when you want separate handlers to handle different kinds of requests, for example
43
+ # API calls vs page resources or GET requests vs POST requests as in the example below.
44
+ #
45
+ # ```python sync
46
+ # # Handle GET requests.
47
+ # def handle_post(route):
48
+ # if route.request.method != "GET":
49
+ # route.fallback()
50
+ # return
51
+ # # Handling GET only.
52
+ # # ...
53
+ #
54
+ # # Handle POST requests.
55
+ # def handle_post(route):
56
+ # if route.request.method != "POST":
57
+ # route.fallback()
58
+ # return
59
+ # # Handling POST only.
60
+ # # ...
61
+ #
62
+ # page.route("**/*", handle_get)
63
+ # page.route("**/*", handle_post)
64
+ # ```
65
+ #
66
+ # One can also modify request while falling back to the subsequent handler, that way intermediate route handler can modify
67
+ # url, method, headers and postData of the request.
68
+ #
69
+ # ```python sync
70
+ # def handle(route, request):
71
+ # # override headers
72
+ # headers = {
73
+ # **request.headers,
74
+ # "foo": "foo-value" # set "foo" header
75
+ # "bar": None # remove "bar" header
76
+ # }
77
+ # route.fallback(headers=headers)
78
+ # }
79
+ # page.route("**/*", handle)
80
+ # ```
81
+ def fallback(headers: nil, method: nil, postData: nil, url: nil)
82
+ wrap_impl(@impl.fallback(headers: unwrap_impl(headers), method: unwrap_impl(method), postData: unwrap_impl(postData), url: unwrap_impl(url)))
83
+ end
84
+
29
85
  # Fulfills route's request with given response.
30
86
  #
31
87
  # An example of fulfilling all requests with 404 responses:
@@ -57,6 +113,11 @@ module Playwright
57
113
  wrap_impl(@impl.request)
58
114
  end
59
115
 
116
+ # @nodoc
117
+ def redirect_navigation_request(url)
118
+ wrap_impl(@impl.redirect_navigation_request(unwrap_impl(url)))
119
+ end
120
+
60
121
  # -- inherited from EventEmitter --
61
122
  # @nodoc
62
123
  def off(event, callback)