playwright-ruby-client 1.38.1 → 1.39.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/browser.md +13 -9
  3. data/documentation/docs/api/browser_context.md +51 -32
  4. data/documentation/docs/api/browser_type.md +12 -7
  5. data/documentation/docs/api/dialog.md +18 -15
  6. data/documentation/docs/api/element_handle.md +6 -5
  7. data/documentation/docs/api/frame.md +54 -24
  8. data/documentation/docs/api/locator.md +26 -0
  9. data/documentation/docs/api/page.md +101 -48
  10. data/documentation/docs/api/playwright.md +23 -20
  11. data/documentation/docs/api/selectors.md +34 -29
  12. data/documentation/docs/include/api_coverage.md +0 -43
  13. data/lib/playwright/channel.rb +9 -1
  14. data/lib/playwright/channel_owner.rb +7 -2
  15. data/lib/playwright/channel_owners/browser_context.rb +1 -1
  16. data/lib/playwright/channel_owners/local_utils.rb +27 -0
  17. data/lib/playwright/channel_owners/playwright.rb +1 -24
  18. data/lib/playwright/connection.rb +1 -1
  19. data/lib/playwright/console_message_impl.rb +29 -0
  20. data/lib/playwright/errors.rb +0 -2
  21. data/lib/playwright/javascript/value_serializer.rb +1 -1
  22. data/lib/playwright/locator_impl.rb +5 -24
  23. data/lib/playwright/version.rb +2 -2
  24. data/lib/playwright_api/browser.rb +2 -2
  25. data/lib/playwright_api/browser_context.rb +4 -4
  26. data/lib/playwright_api/browser_type.rb +2 -2
  27. data/lib/playwright_api/console_message.rb +0 -22
  28. data/lib/playwright_api/dialog.rb +2 -2
  29. data/lib/playwright_api/element_handle.rb +1 -1
  30. data/lib/playwright_api/frame.rb +7 -7
  31. data/lib/playwright_api/locator.rb +26 -5
  32. data/lib/playwright_api/page.rb +23 -23
  33. data/lib/playwright_api/playwright.rb +4 -4
  34. data/lib/playwright_api/selectors.rb +2 -2
  35. data/sig/playwright.rbs +0 -43
  36. metadata +4 -8
  37. data/documentation/docs/api/locator_assertions.md +0 -684
  38. data/lib/playwright/channel_owners/console_message.rb +0 -25
  39. data/lib/playwright/locator_assertions_impl.rb +0 -417
  40. data/lib/playwright/test.rb +0 -68
  41. data/lib/playwright_api/locator_assertions.rb +0 -538
@@ -28,6 +28,8 @@ module Playwright
28
28
  #
29
29
  # Returns an array of `node.innerText` values for all matching nodes.
30
30
  #
31
+ # **NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] with `useInnerText` option to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
32
+ #
31
33
  # **Usage**
32
34
  #
33
35
  # ```python sync
@@ -40,6 +42,8 @@ module Playwright
40
42
  #
41
43
  # Returns an array of `node.textContent` values for all matching nodes.
42
44
  #
45
+ # **NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
46
+ #
43
47
  # **Usage**
44
48
  #
45
49
  # ```python sync
@@ -192,6 +196,8 @@ module Playwright
192
196
  #
193
197
  # Returns the number of elements matching the locator.
194
198
  #
199
+ # **NOTE**: If you need to assert the number of elements on the page, prefer [`method: LocatorAssertions.toHaveCount`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
200
+ #
195
201
  # **Usage**
196
202
  #
197
203
  # ```python sync
@@ -441,6 +447,8 @@ module Playwright
441
447
 
442
448
  #
443
449
  # Returns the matching element's attribute value.
450
+ #
451
+ # **NOTE**: If you need to assert an element's attribute, prefer [`method: LocatorAssertions.toHaveAttribute`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
444
452
  def get_attribute(name, timeout: nil)
445
453
  wrap_impl(@impl.get_attribute(unwrap_impl(name), timeout: unwrap_impl(timeout)))
446
454
  end
@@ -681,6 +689,8 @@ module Playwright
681
689
 
682
690
  #
683
691
  # Returns the [`element.innerText`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText).
692
+ #
693
+ # **NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] with `useInnerText` option to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
684
694
  def inner_text(timeout: nil)
685
695
  wrap_impl(@impl.inner_text(timeout: unwrap_impl(timeout)))
686
696
  end
@@ -688,6 +698,8 @@ module Playwright
688
698
  #
689
699
  # Returns the value for the matching `<input>` or `<textarea>` or `<select>` element.
690
700
  #
701
+ # **NOTE**: If you need to assert input value, prefer [`method: LocatorAssertions.toHaveValue`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
702
+ #
691
703
  # **Usage**
692
704
  #
693
705
  # ```python sync
@@ -704,6 +716,8 @@ module Playwright
704
716
  #
705
717
  # Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
706
718
  #
719
+ # **NOTE**: If you need to assert that checkbox is checked, prefer [`method: LocatorAssertions.toBeChecked`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
720
+ #
707
721
  # **Usage**
708
722
  #
709
723
  # ```python sync
@@ -716,6 +730,8 @@ module Playwright
716
730
  #
717
731
  # Returns whether the element is disabled, the opposite of [enabled](../actionability.md#enabled).
718
732
  #
733
+ # **NOTE**: If you need to assert that an element is disabled, prefer [`method: LocatorAssertions.toBeDisabled`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
734
+ #
719
735
  # **Usage**
720
736
  #
721
737
  # ```python sync
@@ -728,6 +744,8 @@ module Playwright
728
744
  #
729
745
  # Returns whether the element is [editable](../actionability.md#editable).
730
746
  #
747
+ # **NOTE**: If you need to assert that an element is editable, prefer [`method: LocatorAssertions.toBeEditable`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
748
+ #
731
749
  # **Usage**
732
750
  #
733
751
  # ```python sync
@@ -740,6 +758,8 @@ module Playwright
740
758
  #
741
759
  # Returns whether the element is [enabled](../actionability.md#enabled).
742
760
  #
761
+ # **NOTE**: If you need to assert that an element is enabled, prefer [`method: LocatorAssertions.toBeEnabled`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
762
+ #
743
763
  # **Usage**
744
764
  #
745
765
  # ```python sync
@@ -752,6 +772,8 @@ module Playwright
752
772
  #
753
773
  # Returns whether the element is hidden, the opposite of [visible](../actionability.md#visible).
754
774
  #
775
+ # **NOTE**: If you need to assert that element is hidden, prefer [`method: LocatorAssertions.toBeHidden`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
776
+ #
755
777
  # **Usage**
756
778
  #
757
779
  # ```python sync
@@ -764,6 +786,8 @@ module Playwright
764
786
  #
765
787
  # Returns whether the element is [visible](../actionability.md#visible).
766
788
  #
789
+ # **NOTE**: If you need to assert that element is visible, prefer [`method: LocatorAssertions.toBeVisible`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
790
+ #
767
791
  # **Usage**
768
792
  #
769
793
  # ```python sync
@@ -1087,6 +1111,8 @@ module Playwright
1087
1111
 
1088
1112
  #
1089
1113
  # Returns the [`node.textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent).
1114
+ #
1115
+ # **NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] to avoid flakiness. See [assertions guide](../test-assertions.md) for more details.
1090
1116
  def text_content(timeout: nil)
1091
1117
  wrap_impl(@impl.text_content(timeout: unwrap_impl(timeout)))
1092
1118
  end
@@ -1149,11 +1175,6 @@ module Playwright
1149
1175
  wrap_impl(@impl.wait_for(state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
1150
1176
  end
1151
1177
 
1152
- # @nodoc
1153
- def expect(expression, options)
1154
- wrap_impl(@impl.expect(unwrap_impl(expression), unwrap_impl(options)))
1155
- end
1156
-
1157
1178
  # @nodoc
1158
1179
  def to_s
1159
1180
  wrap_impl(@impl.to_s)
@@ -8,9 +8,9 @@ module Playwright
8
8
  # This example creates a page, navigates it to a URL, and then saves a screenshot:
9
9
  #
10
10
  # ```python sync
11
- # from playwright.sync_api import sync_playwright
11
+ # from playwright.sync_api import sync_playwright, Playwright
12
12
  #
13
- # def run(playwright):
13
+ # def run(playwright: Playwright):
14
14
  # webkit = playwright.webkit
15
15
  # browser = webkit.launch()
16
16
  # context = browser.new_context()
@@ -438,9 +438,9 @@ module Playwright
438
438
  # An example of exposing page URL to all frames in a page:
439
439
  #
440
440
  # ```python sync
441
- # from playwright.sync_api import sync_playwright
441
+ # from playwright.sync_api import sync_playwright, Playwright
442
442
  #
443
- # def run(playwright):
443
+ # def run(playwright: Playwright):
444
444
  # webkit = playwright.webkit
445
445
  # browser = webkit.launch(headless=false)
446
446
  # context = browser.new_context()
@@ -496,7 +496,7 @@ module Playwright
496
496
  #
497
497
  # ```python sync
498
498
  # import hashlib
499
- # from playwright.sync_api import sync_playwright
499
+ # from playwright.sync_api import sync_playwright, Playwright
500
500
  #
501
501
  # def sha256(text):
502
502
  # m = hashlib.sha256()
@@ -504,7 +504,7 @@ module Playwright
504
504
  # return m.hexdigest()
505
505
  #
506
506
  #
507
- # def run(playwright):
507
+ # def run(playwright: Playwright):
508
508
  # webkit = playwright.webkit
509
509
  # browser = webkit.launch(headless=False)
510
510
  # page = browser.new_page()
@@ -1176,7 +1176,7 @@ module Playwright
1176
1176
  # **Usage**
1177
1177
  #
1178
1178
  # ```python sync
1179
- # # single selection matching the value
1179
+ # # Single selection matching the value or label
1180
1180
  # page.select_option("select#colors", "blue")
1181
1181
  # # single selection matching both the label
1182
1182
  # page.select_option("select#colors", label="blue")
@@ -1441,9 +1441,9 @@ module Playwright
1441
1441
  # The [`method: Page.waitForFunction`] can be used to observe viewport size change:
1442
1442
  #
1443
1443
  # ```python sync
1444
- # from playwright.sync_api import sync_playwright
1444
+ # from playwright.sync_api import sync_playwright, Playwright
1445
1445
  #
1446
- # def run(playwright):
1446
+ # def run(playwright: Playwright):
1447
1447
  # webkit = playwright.webkit
1448
1448
  # browser = webkit.launch()
1449
1449
  # page = browser.new_page()
@@ -1587,9 +1587,9 @@ module Playwright
1587
1587
  # This method works across navigations:
1588
1588
  #
1589
1589
  # ```python sync
1590
- # from playwright.sync_api import sync_playwright
1590
+ # from playwright.sync_api import sync_playwright, Playwright
1591
1591
  #
1592
- # def run(playwright):
1592
+ # def run(playwright: Playwright):
1593
1593
  # chromium = playwright.chromium
1594
1594
  # browser = chromium.launch()
1595
1595
  # page = browser.new_page()
@@ -1671,33 +1671,33 @@ module Playwright
1671
1671
  end
1672
1672
 
1673
1673
  # @nodoc
1674
- def owned_context=(req)
1675
- wrap_impl(@impl.owned_context=(unwrap_impl(req)))
1674
+ def stop_css_coverage
1675
+ wrap_impl(@impl.stop_css_coverage)
1676
1676
  end
1677
1677
 
1678
1678
  # @nodoc
1679
- def guid
1680
- wrap_impl(@impl.guid)
1679
+ def stop_js_coverage
1680
+ wrap_impl(@impl.stop_js_coverage)
1681
1681
  end
1682
1682
 
1683
1683
  # @nodoc
1684
- def start_js_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1685
- wrap_impl(@impl.start_js_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1684
+ def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1685
+ wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1686
1686
  end
1687
1687
 
1688
1688
  # @nodoc
1689
- def stop_js_coverage
1690
- wrap_impl(@impl.stop_js_coverage)
1689
+ def owned_context=(req)
1690
+ wrap_impl(@impl.owned_context=(unwrap_impl(req)))
1691
1691
  end
1692
1692
 
1693
1693
  # @nodoc
1694
- def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1695
- wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1694
+ def guid
1695
+ wrap_impl(@impl.guid)
1696
1696
  end
1697
1697
 
1698
1698
  # @nodoc
1699
- def stop_css_coverage
1700
- wrap_impl(@impl.stop_css_coverage)
1699
+ def start_js_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
1700
+ wrap_impl(@impl.start_js_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
1701
1701
  end
1702
1702
 
1703
1703
  # -- inherited from EventEmitter --
@@ -4,9 +4,9 @@ module Playwright
4
4
  # to drive automation:
5
5
  #
6
6
  # ```python sync
7
- # from playwright.sync_api import sync_playwright
7
+ # from playwright.sync_api import sync_playwright, Playwright
8
8
  #
9
- # def run(playwright):
9
+ # def run(playwright: Playwright):
10
10
  # chromium = playwright.chromium # or "firefox" or "webkit".
11
11
  # browser = chromium.launch()
12
12
  # page = browser.new_page()
@@ -29,9 +29,9 @@ module Playwright
29
29
  # Returns a dictionary of devices to be used with [`method: Browser.newContext`] or [`method: Browser.newPage`].
30
30
  #
31
31
  # ```python sync
32
- # from playwright.sync_api import sync_playwright
32
+ # from playwright.sync_api import sync_playwright, Playwright
33
33
  #
34
- # def run(playwright):
34
+ # def run(playwright: Playwright):
35
35
  # webkit = playwright.webkit
36
36
  # iphone = playwright.devices["iPhone 6"]
37
37
  # browser = webkit.launch()
@@ -12,9 +12,9 @@ module Playwright
12
12
  # An example of registering selector engine that queries elements based on a tag name:
13
13
  #
14
14
  # ```python sync
15
- # from playwright.sync_api import sync_playwright
15
+ # from playwright.sync_api import sync_playwright, Playwright
16
16
  #
17
- # def run(playwright):
17
+ # def run(playwright: Playwright):
18
18
  # tag_selector = """
19
19
  # {
20
20
  # // Returns the first element matching given selector in the root's subtree.
data/sig/playwright.rbs CHANGED
@@ -538,49 +538,6 @@ module Playwright
538
538
  def put: (String url, ?data: (String | String | untyped), ?failOnStatusCode: bool, ?form: Hash[untyped, untyped], ?headers: Hash[untyped, untyped], ?ignoreHTTPSErrors: bool, ?maxRedirects: Integer, ?multipart: Hash[untyped, untyped], ?params: Hash[untyped, untyped], ?timeout: Float) -> APIResponse
539
539
  end
540
540
 
541
- class LocatorAssertions
542
- def not_to_be_attached: (?attached: bool, ?timeout: Float) -> void
543
- def not_to_be_checked: (?timeout: Float) -> void
544
- def not_to_be_disabled: (?timeout: Float) -> void
545
- def not_to_be_editable: (?editable: bool, ?timeout: Float) -> void
546
- def not_to_be_empty: (?timeout: Float) -> void
547
- def not_to_be_enabled: (?enabled: bool, ?timeout: Float) -> void
548
- def not_to_be_focused: (?timeout: Float) -> void
549
- def not_to_be_hidden: (?timeout: Float) -> void
550
- def not_to_be_in_viewport: (?ratio: Float, ?timeout: Float) -> void
551
- def not_to_be_visible: (?timeout: Float, ?visible: bool) -> void
552
- def not_to_contain_text: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?ignoreCase: bool, ?timeout: Float, ?useInnerText: bool) -> void
553
- def not_to_have_attribute: (String name, (String | Regexp) value, ?timeout: Float) -> void
554
- def not_to_have_class: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?timeout: Float) -> void
555
- def not_to_have_count: (Integer count, ?timeout: Float) -> void
556
- def not_to_have_css: (String name, (String | Regexp) value, ?timeout: Float) -> void
557
- def not_to_have_id: ((String | Regexp) id, ?timeout: Float) -> void
558
- def not_to_have_js_property: (String name, untyped value, ?timeout: Float) -> void
559
- def not_to_have_text: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?ignoreCase: bool, ?timeout: Float, ?useInnerText: bool) -> void
560
- def not_to_have_value: ((String | Regexp) value, ?timeout: Float) -> void
561
- def not_to_have_values: ((Array[untyped] | Array[untyped] | Array[untyped]) values, ?timeout: Float) -> void
562
- def to_be_attached: (?attached: bool, ?timeout: Float) -> void
563
- def to_be_checked: (?checked: bool, ?timeout: Float) -> void
564
- def to_be_disabled: (?timeout: Float) -> void
565
- def to_be_editable: (?editable: bool, ?timeout: Float) -> void
566
- def to_be_empty: (?timeout: Float) -> void
567
- def to_be_enabled: (?enabled: bool, ?timeout: Float) -> void
568
- def to_be_focused: (?timeout: Float) -> void
569
- def to_be_hidden: (?timeout: Float) -> void
570
- def to_be_in_viewport: (?ratio: Float, ?timeout: Float) -> void
571
- def to_be_visible: (?timeout: Float, ?visible: bool) -> void
572
- def to_contain_text: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?ignoreCase: bool, ?timeout: Float, ?useInnerText: bool) -> void
573
- def to_have_attribute: (String name, (String | Regexp) value, ?timeout: Float) -> void
574
- def to_have_class: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?timeout: Float) -> void
575
- def to_have_count: (Integer count, ?timeout: Float) -> void
576
- def to_have_css: (String name, (String | Regexp) value, ?timeout: Float) -> void
577
- def to_have_id: ((String | Regexp) id, ?timeout: Float) -> void
578
- def to_have_js_property: (String name, untyped value, ?timeout: Float) -> void
579
- def to_have_text: ((String | Regexp | Array[untyped] | Array[untyped] | Array[untyped]) expected, ?ignoreCase: bool, ?timeout: Float, ?useInnerText: bool) -> void
580
- def to_have_value: ((String | Regexp) value, ?timeout: Float) -> void
581
- def to_have_values: ((Array[untyped] | Array[untyped] | Array[untyped]) values, ?timeout: Float) -> void
582
- end
583
-
584
541
  class Android
585
542
  def devices: (?host: String, ?omitDriverInstall: bool, ?port: Integer) -> Array[untyped]
586
543
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playwright-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.38.1
4
+ version: 1.39.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - YusukeIwaki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-05 00:00:00.000000000 Z
11
+ date: 2023-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -233,7 +233,6 @@ files:
233
233
  - documentation/docs/api/js_handle.md
234
234
  - documentation/docs/api/keyboard.md
235
235
  - documentation/docs/api/locator.md
236
- - documentation/docs/api/locator_assertions.md
237
236
  - documentation/docs/api/mouse.md
238
237
  - documentation/docs/api/page.md
239
238
  - documentation/docs/api/playwright.md
@@ -290,7 +289,6 @@ files:
290
289
  - lib/playwright/channel_owners/browser_context.rb
291
290
  - lib/playwright/channel_owners/browser_type.rb
292
291
  - lib/playwright/channel_owners/cdp_session.rb
293
- - lib/playwright/channel_owners/console_message.rb
294
292
  - lib/playwright/channel_owners/dialog.rb
295
293
  - lib/playwright/channel_owners/electron.rb
296
294
  - lib/playwright/channel_owners/element_handle.rb
@@ -310,6 +308,7 @@ files:
310
308
  - lib/playwright/channel_owners/worker.rb
311
309
  - lib/playwright/channel_owners/writable_stream.rb
312
310
  - lib/playwright/connection.rb
311
+ - lib/playwright/console_message_impl.rb
313
312
  - lib/playwright/download_impl.rb
314
313
  - lib/playwright/errors.rb
315
314
  - lib/playwright/event_emitter.rb
@@ -327,7 +326,6 @@ files:
327
326
  - lib/playwright/javascript/value_serializer.rb
328
327
  - lib/playwright/javascript/visitor_info.rb
329
328
  - lib/playwright/keyboard_impl.rb
330
- - lib/playwright/locator_assertions_impl.rb
331
329
  - lib/playwright/locator_impl.rb
332
330
  - lib/playwright/locator_utils.rb
333
331
  - lib/playwright/mouse_impl.rb
@@ -335,7 +333,6 @@ files:
335
333
  - lib/playwright/raw_headers.rb
336
334
  - lib/playwright/route_handler.rb
337
335
  - lib/playwright/select_option_values.rb
338
- - lib/playwright/test.rb
339
336
  - lib/playwright/timeout_settings.rb
340
337
  - lib/playwright/touchscreen_impl.rb
341
338
  - lib/playwright/transport.rb
@@ -369,7 +366,6 @@ files:
369
366
  - lib/playwright_api/js_handle.rb
370
367
  - lib/playwright_api/keyboard.rb
371
368
  - lib/playwright_api/locator.rb
372
- - lib/playwright_api/locator_assertions.rb
373
369
  - lib/playwright_api/mouse.rb
374
370
  - lib/playwright_api/page.rb
375
371
  - lib/playwright_api/playwright.rb
@@ -405,5 +401,5 @@ requirements: []
405
401
  rubygems_version: 3.3.26
406
402
  signing_key:
407
403
  specification_version: 4
408
- summary: The Ruby binding of playwright driver 1.38.1
404
+ summary: The Ruby binding of playwright driver 1.39.0
409
405
  test_files: []