playwright-ruby-client 0.5.7 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/documentation/README.md +33 -0
  4. data/documentation/babel.config.js +3 -0
  5. data/documentation/docs/api/accessibility.md +7 -0
  6. data/documentation/docs/api/browser.md +185 -0
  7. data/documentation/docs/api/browser_context.md +398 -0
  8. data/documentation/docs/api/browser_type.md +105 -0
  9. data/documentation/docs/api/cdp_session.md +7 -0
  10. data/documentation/docs/api/console_message.md +41 -0
  11. data/documentation/docs/api/dialog.md +74 -0
  12. data/documentation/docs/api/element_handle.md +640 -0
  13. data/documentation/docs/api/experimental/_category_.yml +3 -0
  14. data/documentation/docs/api/experimental/android.md +25 -0
  15. data/documentation/docs/api/experimental/android_device.md +91 -0
  16. data/documentation/docs/api/experimental/android_input.md +38 -0
  17. data/documentation/docs/api/experimental/android_socket.md +7 -0
  18. data/documentation/docs/api/experimental/android_web_view.md +7 -0
  19. data/documentation/docs/api/file_chooser.md +51 -0
  20. data/documentation/docs/api/frame.md +867 -0
  21. data/documentation/docs/api/js_handle.md +116 -0
  22. data/documentation/docs/api/keyboard.md +157 -0
  23. data/documentation/docs/api/mouse.md +69 -0
  24. data/documentation/docs/api/page.md +1469 -0
  25. data/documentation/docs/api/playwright.md +63 -0
  26. data/documentation/docs/api/request.md +188 -0
  27. data/documentation/docs/api/response.md +97 -0
  28. data/documentation/docs/api/route.md +80 -0
  29. data/documentation/docs/api/selectors.md +23 -0
  30. data/documentation/docs/api/touchscreen.md +8 -0
  31. data/documentation/docs/api/tracing.md +54 -0
  32. data/documentation/docs/api/web_socket.md +7 -0
  33. data/documentation/docs/api/worker.md +7 -0
  34. data/documentation/docs/article/api_coverage.mdx +11 -0
  35. data/documentation/docs/article/getting_started.md +152 -0
  36. data/documentation/docs/article/guides/_category_.yml +3 -0
  37. data/documentation/docs/article/guides/download_playwright_driver.md +49 -0
  38. data/documentation/docs/article/guides/launch_browser.md +119 -0
  39. data/documentation/docs/article/guides/rails_integration.md +51 -0
  40. data/{docs → documentation/docs/include}/api_coverage.md +10 -1
  41. data/documentation/docusaurus.config.js +107 -0
  42. data/documentation/package.json +39 -0
  43. data/documentation/sidebars.js +15 -0
  44. data/documentation/src/components/HomepageFeatures.js +61 -0
  45. data/documentation/src/components/HomepageFeatures.module.css +13 -0
  46. data/documentation/src/css/custom.css +44 -0
  47. data/documentation/src/pages/index.js +50 -0
  48. data/documentation/src/pages/index.module.css +41 -0
  49. data/documentation/src/pages/markdown-page.md +7 -0
  50. data/documentation/static/.nojekyll +0 -0
  51. data/documentation/static/img/playwright-logo.svg +9 -0
  52. data/documentation/static/img/undraw_dropdown_menu.svg +1 -0
  53. data/documentation/static/img/undraw_web_development.svg +1 -0
  54. data/documentation/static/img/undraw_windows.svg +1 -0
  55. data/documentation/yarn.lock +8805 -0
  56. data/lib/playwright/channel_owner.rb +3 -0
  57. data/lib/playwright/channel_owners/binding_call.rb +33 -0
  58. data/lib/playwright/channel_owners/browser.rb +27 -2
  59. data/lib/playwright/channel_owners/browser_context.rb +54 -3
  60. data/lib/playwright/channel_owners/browser_type.rb +8 -1
  61. data/lib/playwright/channel_owners/element_handle.rb +17 -16
  62. data/lib/playwright/channel_owners/frame.rb +29 -34
  63. data/lib/playwright/channel_owners/js_handle.rb +2 -10
  64. data/lib/playwright/channel_owners/page.rb +29 -45
  65. data/lib/playwright/download.rb +3 -2
  66. data/lib/playwright/events.rb +4 -0
  67. data/lib/playwright/input_files.rb +0 -8
  68. data/lib/playwright/javascript.rb +0 -10
  69. data/lib/playwright/javascript/expression.rb +2 -7
  70. data/lib/playwright/playwright_api.rb +1 -5
  71. data/lib/playwright/tracing_impl.rb +31 -0
  72. data/lib/playwright/version.rb +2 -1
  73. data/lib/playwright_api/accessibility.rb +7 -88
  74. data/lib/playwright_api/android.rb +8 -65
  75. data/lib/playwright_api/android_device.rb +8 -8
  76. data/lib/playwright_api/browser.rb +15 -126
  77. data/lib/playwright_api/browser_context.rb +63 -429
  78. data/lib/playwright_api/browser_type.rb +33 -84
  79. data/lib/playwright_api/cdp_session.rb +2 -25
  80. data/lib/playwright_api/console_message.rb +8 -6
  81. data/lib/playwright_api/dialog.rb +11 -69
  82. data/lib/playwright_api/element_handle.rb +102 -300
  83. data/lib/playwright_api/file_chooser.rb +0 -21
  84. data/lib/playwright_api/frame.rb +105 -571
  85. data/lib/playwright_api/js_handle.rb +16 -73
  86. data/lib/playwright_api/keyboard.rb +22 -166
  87. data/lib/playwright_api/mouse.rb +1 -45
  88. data/lib/playwright_api/page.rb +202 -1217
  89. data/lib/playwright_api/playwright.rb +14 -99
  90. data/lib/playwright_api/request.rb +15 -93
  91. data/lib/playwright_api/response.rb +7 -7
  92. data/lib/playwright_api/route.rb +9 -86
  93. data/lib/playwright_api/selectors.rb +6 -72
  94. data/lib/playwright_api/tracing.rb +39 -0
  95. data/lib/playwright_api/web_socket.rb +1 -1
  96. data/lib/playwright_api/worker.rb +6 -42
  97. data/playwright.gemspec +2 -2
  98. metadata +59 -20
  99. data/lib/playwright/javascript/function.rb +0 -67
@@ -14,19 +14,11 @@ module Playwright
14
14
  end
15
15
 
16
16
  def evaluate(pageFunction, arg: nil)
17
- if JavaScript.function?(pageFunction)
18
- JavaScript::Function.new(pageFunction, arg).evaluate(@channel)
19
- else
20
- JavaScript::Expression.new(pageFunction).evaluate(@channel)
21
- end
17
+ JavaScript::Expression.new(pageFunction, arg).evaluate(@channel)
22
18
  end
23
19
 
24
20
  def evaluate_handle(pageFunction, arg: nil)
25
- if JavaScript.function?(pageFunction)
26
- JavaScript::Function.new(pageFunction, arg).evaluate_handle(@channel)
27
- else
28
- JavaScript::Expression.new(pageFunction).evaluate_handle(@channel)
29
- end
21
+ JavaScript::Expression.new(pageFunction, arg).evaluate_handle(@channel)
30
22
  end
31
23
 
32
24
  def get_properties
@@ -30,6 +30,7 @@ module Playwright
30
30
  @frames << @main_frame
31
31
  @opener = ChannelOwners::Page.from_nullable(@initializer['opener'])
32
32
 
33
+ @channel.on('bindingCall', ->(params) { on_binding(ChannelOwners::BindingCall.from(params['binding'])) })
33
34
  @channel.once('close', ->(_) { on_close })
34
35
  @channel.on('console', ->(params) {
35
36
  console_message = ChannelOwners::ConsoleMessage.from(params['message'])
@@ -56,25 +57,6 @@ module Playwright
56
57
  @channel.on('pageError', ->(params) {
57
58
  emit(Events::Page::PageError, Error.parse(params['error']['error']))
58
59
  })
59
- @channel.on('request', ->(params) {
60
- emit(Events::Page::Request, ChannelOwners::Request.from(params['request']))
61
- })
62
- @channel.on('requestFailed', ->(params) {
63
- on_request_failed(
64
- ChannelOwners::Request.from(params['request']),
65
- params['responseEndTiming'],
66
- params['failureText'],
67
- )
68
- })
69
- @channel.on('requestFinished', ->(params) {
70
- on_request_finished(
71
- ChannelOwners::Request.from(params['request']),
72
- params['responseEndTiming'],
73
- )
74
- })
75
- @channel.on('response', ->(params) {
76
- emit(Events::Page::Response, ChannelOwners::Response.from(params['response']))
77
- })
78
60
  @channel.on('route', ->(params) {
79
61
  on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
80
62
  })
@@ -95,17 +77,6 @@ module Playwright
95
77
  :viewport_size,
96
78
  :main_frame
97
79
 
98
- private def on_request_failed(request, response_end_timing, failure_text)
99
- request.send(:update_failure_text, failure_text)
100
- request.send(:update_response_end_timing, response_end_timing)
101
- emit(Events::Page::RequestFailed, request)
102
- end
103
-
104
- private def on_request_finished(request, response_end_timing)
105
- request.send(:update_response_end_timing, response_end_timing)
106
- emit(Events::Page::RequestFinished, request)
107
- end
108
-
109
80
  private def on_frame_attached(frame)
110
81
  frame.send(:update_page_from_page, self)
111
82
  @frames << frame
@@ -130,6 +101,14 @@ module Playwright
130
101
  end
131
102
  end
132
103
 
104
+ private def on_binding(binding_call)
105
+ func = @bindings[binding_call.name]
106
+ if func
107
+ binding_call.call_async(func)
108
+ end
109
+ @browser_context.send(:on_binding, binding_call)
110
+ end
111
+
133
112
  private def on_close
134
113
  @closed = true
135
114
  @browser_context.send(:remove_page, self)
@@ -145,6 +124,7 @@ module Playwright
145
124
 
146
125
  private def on_download(params)
147
126
  download = Download.new(
127
+ page: self,
148
128
  url: params['url'],
149
129
  suggested_filename: params['suggestedFilename'],
150
130
  artifact: ChannelOwners::Artifact.from(params['artifact']),
@@ -335,7 +315,7 @@ module Playwright
335
315
  timeout: timeout,
336
316
  waitUntil: waitUntil,
337
317
  }.compact
338
- resp = @channel.send_message_to_server('reoad', params)
318
+ resp = @channel.send_message_to_server('reload', params)
339
319
  ChannelOwners::Response.from_nullable(resp)
340
320
  end
341
321
 
@@ -464,7 +444,8 @@ module Playwright
464
444
  modifiers: nil,
465
445
  noWaitAfter: nil,
466
446
  position: nil,
467
- timeout: nil)
447
+ timeout: nil,
448
+ trial: nil)
468
449
 
469
450
  @main_frame.click(
470
451
  selector,
@@ -476,6 +457,7 @@ module Playwright
476
457
  noWaitAfter: noWaitAfter,
477
458
  position: position,
478
459
  timeout: timeout,
460
+ trial: trial,
479
461
  )
480
462
  end
481
463
 
@@ -487,7 +469,8 @@ module Playwright
487
469
  modifiers: nil,
488
470
  noWaitAfter: nil,
489
471
  position: nil,
490
- timeout: nil)
472
+ timeout: nil,
473
+ trial: nil)
491
474
  @main_frame.dblclick(
492
475
  selector,
493
476
  button: button,
@@ -497,6 +480,7 @@ module Playwright
497
480
  noWaitAfter: noWaitAfter,
498
481
  position: position,
499
482
  timeout: timeout,
483
+ trial: trial,
500
484
  )
501
485
  end
502
486
 
@@ -506,7 +490,8 @@ module Playwright
506
490
  modifiers: nil,
507
491
  noWaitAfter: nil,
508
492
  position: nil,
509
- timeout: nil)
493
+ timeout: nil,
494
+ trial: nil)
510
495
  @main_frame.tap_point(
511
496
  selector,
512
497
  force: force,
@@ -514,6 +499,7 @@ module Playwright
514
499
  noWaitAfter: noWaitAfter,
515
500
  position: position,
516
501
  timeout: timeout,
502
+ trial: trial,
517
503
  )
518
504
  end
519
505
 
@@ -546,13 +532,15 @@ module Playwright
546
532
  force: nil,
547
533
  modifiers: nil,
548
534
  position: nil,
549
- timeout: nil)
535
+ timeout: nil,
536
+ trial: nil)
550
537
  @main_frame.hover(
551
538
  selector,
552
539
  force: force,
553
540
  modifiers: modifiers,
554
541
  position: position,
555
542
  timeout: timeout,
543
+ trial: trial,
556
544
  )
557
545
  end
558
546
 
@@ -604,9 +592,10 @@ module Playwright
604
592
  force: nil,
605
593
  noWaitAfter: nil,
606
594
  position: nil,
607
- timeout: nil)
595
+ timeout: nil,
596
+ trial: nil)
608
597
 
609
- @main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout)
598
+ @main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout, trial: trial)
610
599
  end
611
600
 
612
601
  def uncheck(
@@ -614,9 +603,10 @@ module Playwright
614
603
  force: nil,
615
604
  noWaitAfter: nil,
616
605
  position: nil,
617
- timeout: nil)
606
+ timeout: nil,
607
+ trial: nil)
618
608
 
619
- @main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout)
609
+ @main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout, trial: trial)
620
610
  end
621
611
 
622
612
  def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
@@ -783,12 +773,6 @@ module Playwright
783
773
  expect_event(Events::Page::Response, predicate: predicate, timeout: timeout)
784
774
  end
785
775
 
786
- # called from BrowserContext#on_page with send(:update_browser_context, page), so keep private.
787
- private def update_browser_context(context)
788
- @browser_context = context
789
- @timeout_settings = TimeoutSettings.new(context.send(:_timeout_settings))
790
- end
791
-
792
776
  # called from Frame with send(:timeout_settings)
793
777
  private def timeout_settings
794
778
  @timeout_settings
@@ -1,12 +1,13 @@
1
1
  module Playwright
2
2
  class Download
3
- def initialize(url:, suggested_filename:, artifact:)
3
+ def initialize(page:, url:, suggested_filename:, artifact:)
4
+ @page = page
4
5
  @url = url
5
6
  @suggested_filename = suggested_filename
6
7
  @artifact = artifact
7
8
  end
8
9
 
9
- attr_reader :url, :suggested_filename
10
+ attr_reader :page, :url, :suggested_filename
10
11
 
11
12
  def delete
12
13
  @artifact.delete
@@ -28,6 +28,10 @@ end
28
28
  Close: 'close',
29
29
  Page: 'page',
30
30
  ServiceWorker: 'serviceworker',
31
+ Request: 'request',
32
+ Response: 'response',
33
+ RequestFailed: 'requestfailed',
34
+ RequestFinished: 'requestfinished',
31
35
  },
32
36
 
33
37
  BrowserServer: {
@@ -1,5 +1,4 @@
1
1
  require 'base64'
2
- require 'mime/types'
3
2
 
4
3
  module Playwright
5
4
  class InputFiles
@@ -19,13 +18,11 @@ module Playwright
19
18
  when String
20
19
  {
21
20
  name: File.basename(file),
22
- mimeType: mime_type_for(file),
23
21
  buffer: Base64.strict_encode64(File.read(file)),
24
22
  }
25
23
  when File
26
24
  {
27
25
  name: File.basename(file.path),
28
- mimeType: mime_type_for(file.path),
29
26
  buffer: Base64.strict_encode64(file.read),
30
27
  }
31
28
  else
@@ -33,10 +30,5 @@ module Playwright
33
30
  end
34
31
  end
35
32
  end
36
-
37
- private def mime_type_for(filepath)
38
- mime_types = MIME::Types.type_for(filepath)
39
- mime_types.first.to_s || 'application/octet-stream'
40
- end
41
33
  end
42
34
  end
@@ -1,13 +1,3 @@
1
1
  require_relative './javascript/expression'
2
- require_relative './javascript/function'
3
2
  require_relative './javascript/value_parser'
4
3
  require_relative './javascript/value_serializer'
5
-
6
- module Playwright
7
- module JavaScript
8
- # Detect if str is likely to be a function
9
- module_function def function?(str)
10
- ['async', 'function'].any? { |key| str.strip.start_with?(key) } || str.include?('=>')
11
- end
12
- end
13
- end
@@ -1,16 +1,15 @@
1
1
  module Playwright
2
2
  module JavaScript
3
3
  class Expression
4
- def initialize(expression)
4
+ def initialize(expression, arg)
5
5
  @expression = expression
6
- @serialized_arg = ValueSerializer.new(nil).serialize
6
+ @serialized_arg = ValueSerializer.new(arg).serialize
7
7
  end
8
8
 
9
9
  def evaluate(channel)
10
10
  value = channel.send_message_to_server(
11
11
  'evaluateExpression',
12
12
  expression: @expression,
13
- isFunction: false,
14
13
  arg: @serialized_arg,
15
14
  )
16
15
  ValueParser.new(value).parse
@@ -20,7 +19,6 @@ module Playwright
20
19
  resp = channel.send_message_to_server(
21
20
  'evaluateExpressionHandle',
22
21
  expression: @expression,
23
- isFunction: false,
24
22
  arg: @serialized_arg,
25
23
  )
26
24
  ::Playwright::ChannelOwner.from(resp)
@@ -31,7 +29,6 @@ module Playwright
31
29
  'evalOnSelector',
32
30
  selector: selector,
33
31
  expression: @expression,
34
- isFunction: false,
35
32
  arg: @serialized_arg,
36
33
  )
37
34
  ValueParser.new(value).parse
@@ -42,7 +39,6 @@ module Playwright
42
39
  'evalOnSelectorAll',
43
40
  selector: selector,
44
41
  expression: @expression,
45
- isFunction: false,
46
42
  arg: @serialized_arg,
47
43
  )
48
44
  ValueParser.new(value).parse
@@ -51,7 +47,6 @@ module Playwright
51
47
  def wait_for_function(channel, polling:, timeout:)
52
48
  params = {
53
49
  expression: @expression,
54
- isFunction: false,
55
50
  arg: @serialized_arg,
56
51
  polling: polling,
57
52
  timeout: timeout,
@@ -31,7 +31,7 @@ module Playwright
31
31
  def wrap
32
32
  api_class = detect_class_for(@impl.class)
33
33
  if api_class
34
- api_class.new(@impl)
34
+ @impl._api ||= api_class.new(@impl)
35
35
  else
36
36
  raise NotImplementedError.new("Playwright::#{expected_class_name_for(@impl.class)} is not implemented")
37
37
  end
@@ -101,10 +101,6 @@ module Playwright
101
101
  @impl = impl
102
102
  end
103
103
 
104
- def ==(other)
105
- @impl.to_s == other.instance_variable_get(:'@impl').to_s
106
- end
107
-
108
104
  # @param block [Proc]
109
105
  private def wrap_block_call(block)
110
106
  return nil unless block.is_a?(Proc)
@@ -0,0 +1,31 @@
1
+ module Playwright
2
+ define_api_implementation :TracingImpl do
3
+ def initialize(channel, context)
4
+ @channel = channel
5
+ @context = context
6
+ end
7
+
8
+ def start(name: nil, screenshots: nil, snapshots: nil)
9
+ params = {
10
+ name: name,
11
+ screenshots: screenshots,
12
+ snapshots: snapshots,
13
+ }.compact
14
+ @channel.send_message_to_server('tracingStart', params)
15
+ end
16
+
17
+ # Stop tracing.
18
+ def stop
19
+ @channel.send_message_to_server('tracingStop')
20
+ end
21
+
22
+ def export(path)
23
+ resp = @channel.send_message_to_server('tracingExport')
24
+ artifact = ChannelOwners::Artifact.from(resp)
25
+ # if self._context._browser:
26
+ # artifact._is_remote = self._context._browser._is_remote
27
+ artifact.save_as(path)
28
+ artifact.delete
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playwright
4
- VERSION = '0.5.7'
4
+ VERSION = '0.6.1'
5
+ COMPATIBLE_PLAYWRIGHT_VERSION = '1.12.0'
5
6
  end
@@ -2,13 +2,13 @@ module Playwright
2
2
  # The Accessibility class provides methods for inspecting Chromium's accessibility tree. The accessibility tree is used by
3
3
  # assistive technology such as [screen readers](https://en.wikipedia.org/wiki/Screen_reader) or
4
4
  # [switches](https://en.wikipedia.org/wiki/Switch_access).
5
- #
5
+ #
6
6
  # Accessibility is a very platform-specific thing. On different platforms, there are different screen readers that might
7
7
  # have wildly different output.
8
- #
8
+ #
9
9
  # Rendering engines of Chromium, Firefox and WebKit have a concept of "accessibility tree", which is then translated into
10
10
  # different platform-specific APIs. Accessibility namespace gives access to this Accessibility Tree.
11
- #
11
+ #
12
12
  # Most of the accessibility tree gets filtered out when converting from internal browser AX Tree to Platform-specific
13
13
  # AX-Tree or by assistive technologies themselves. By default, Playwright tries to approximate this filtering, exposing
14
14
  # only the "interesting" nodes of the tree.
@@ -16,100 +16,19 @@ module Playwright
16
16
 
17
17
  # Captures the current state of the accessibility tree. The returned object represents the root accessible node of the
18
18
  # page.
19
- #
19
+ #
20
20
  # > NOTE: The Chromium accessibility tree contains nodes that go unused on most platforms and by most screen readers.
21
21
  # Playwright will discard them as well for an easier to process tree, unless `interestingOnly` is set to `false`.
22
- #
22
+ #
23
23
  # An example of dumping the entire accessibility tree:
24
- #
25
24
  #
26
- # ```js
27
- # const snapshot = await page.accessibility.snapshot();
28
- # console.log(snapshot);
29
- # ```
30
- #
31
- # ```java
32
- # String snapshot = page.accessibility().snapshot();
33
- # System.out.println(snapshot);
34
- # ```
35
- #
36
- # ```python async
37
- # snapshot = await page.accessibility.snapshot()
38
- # print(snapshot)
39
- # ```
40
- #
41
25
  # ```python sync
42
26
  # snapshot = page.accessibility.snapshot()
43
27
  # print(snapshot)
44
28
  # ```
45
- #
46
- # ```csharp
47
- # var accessibilitySnapshot = await Page.Accessibility.SnapshotAsync();
48
- # Console.WriteLine(accessibilitySnapshot);
49
- # ```
50
- #
29
+ #
51
30
  # An example of logging the focused node's name:
52
- #
53
31
  #
54
- # ```js
55
- # const snapshot = await page.accessibility.snapshot();
56
- # const node = findFocusedNode(snapshot);
57
- # console.log(node && node.name);
58
- #
59
- # function findFocusedNode(node) {
60
- # if (node.focused)
61
- # return node;
62
- # for (const child of node.children || []) {
63
- # const foundNode = findFocusedNode(child);
64
- # return foundNode;
65
- # }
66
- # return null;
67
- # }
68
- # ```
69
- #
70
- # ```csharp
71
- # Func<AccessibilitySnapshotResult, AccessibilitySnapshotResult> findFocusedNode = root =>
72
- # {
73
- # var nodes = new Stack<AccessibilitySnapshotResult>(new[] { root });
74
- # while (nodes.Count > 0)
75
- # {
76
- # var node = nodes.Pop();
77
- # if (node.Focused) return node;
78
- # foreach (var innerNode in node.Children)
79
- # {
80
- # nodes.Push(innerNode);
81
- # }
82
- # }
83
- #
84
- # return null;
85
- # };
86
- #
87
- # var accessibilitySnapshot = await Page.Accessibility.SnapshotAsync();
88
- # var focusedNode = findFocusedNode(accessibilitySnapshot);
89
- # if(focusedNode != null)
90
- # Console.WriteLine(focusedNode.Name);
91
- # ```
92
- #
93
- # ```java
94
- # // FIXME
95
- # String snapshot = page.accessibility().snapshot();
96
- # ```
97
- #
98
- # ```python async
99
- # def find_focused_node(node):
100
- # if (node.get("focused"))
101
- # return node
102
- # for child in (node.get("children") or []):
103
- # found_node = find_focused_node(child)
104
- # return found_node
105
- # return None
106
- #
107
- # snapshot = await page.accessibility.snapshot()
108
- # node = find_focused_node(snapshot)
109
- # if node:
110
- # print(node["name"])
111
- # ```
112
- #
113
32
  # ```python sync
114
33
  # def find_focused_node(node):
115
34
  # if (node.get("focused"))
@@ -118,7 +37,7 @@ module Playwright
118
37
  # found_node = find_focused_node(child)
119
38
  # return found_node
120
39
  # return None
121
- #
40
+ #
122
41
  # snapshot = page.accessibility.snapshot()
123
42
  # node = find_focused_node(snapshot)
124
43
  # if node: