playwright-ruby-client 1.27.0 → 1.28.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/element_handle.md +1 -0
  3. data/documentation/docs/api/frame.md +51 -3
  4. data/documentation/docs/api/frame_locator.md +50 -3
  5. data/documentation/docs/api/js_handle.md +5 -3
  6. data/documentation/docs/api/keyboard.md +1 -1
  7. data/documentation/docs/api/locator.md +73 -3
  8. data/documentation/docs/api/page.md +51 -3
  9. data/documentation/docs/api/request.md +1 -1
  10. data/documentation/docs/article/guides/rails_integration.md +1 -0
  11. data/documentation/docs/include/api_coverage.md +3 -0
  12. data/lib/playwright/channel_owner.rb +41 -0
  13. data/lib/playwright/channel_owners/browser_context.rb +6 -0
  14. data/lib/playwright/channel_owners/element_handle.rb +8 -1
  15. data/lib/playwright/channel_owners/frame.rb +2 -0
  16. data/lib/playwright/channel_owners/page.rb +23 -28
  17. data/lib/playwright/connection.rb +4 -1
  18. data/lib/playwright/locator_impl.rb +16 -2
  19. data/lib/playwright/locator_utils.rb +13 -19
  20. data/lib/playwright/utils.rb +6 -0
  21. data/lib/playwright/version.rb +2 -2
  22. data/lib/playwright_api/android.rb +12 -6
  23. data/lib/playwright_api/android_device.rb +6 -6
  24. data/lib/playwright_api/api_request_context.rb +6 -6
  25. data/lib/playwright_api/browser.rb +6 -6
  26. data/lib/playwright_api/browser_context.rb +6 -6
  27. data/lib/playwright_api/browser_type.rb +6 -6
  28. data/lib/playwright_api/cdp_session.rb +6 -6
  29. data/lib/playwright_api/console_message.rb +6 -6
  30. data/lib/playwright_api/dialog.rb +6 -6
  31. data/lib/playwright_api/element_handle.rb +8 -7
  32. data/lib/playwright_api/frame.rb +45 -11
  33. data/lib/playwright_api/frame_locator.rb +39 -6
  34. data/lib/playwright_api/js_handle.rb +7 -7
  35. data/lib/playwright_api/keyboard.rb +1 -1
  36. data/lib/playwright_api/locator.rb +55 -5
  37. data/lib/playwright_api/page.rb +45 -11
  38. data/lib/playwright_api/playwright.rb +6 -6
  39. data/lib/playwright_api/request.rb +7 -7
  40. data/lib/playwright_api/response.rb +6 -6
  41. data/lib/playwright_api/route.rb +6 -6
  42. data/lib/playwright_api/selectors.rb +6 -6
  43. data/lib/playwright_api/tracing.rb +6 -6
  44. data/lib/playwright_api/web_socket.rb +6 -6
  45. data/lib/playwright_api/worker.rb +6 -6
  46. metadata +4 -4
@@ -8,6 +8,7 @@ module Playwright
8
8
  include LocatorUtils
9
9
  attr_writer :owned_context
10
10
 
11
+
11
12
  private def after_initialize
12
13
  @browser_context = @parent
13
14
  @timeout_settings = TimeoutSettings.new(@browser_context.send(:_timeout_settings))
@@ -73,6 +74,14 @@ module Playwright
73
74
  worker = ChannelOwners::Worker.from(params['worker'])
74
75
  on_worker(worker)
75
76
  })
77
+
78
+ set_event_to_subscription_mapping({
79
+ Events::Page::Request => "request",
80
+ Events::Page::Response => "response",
81
+ Events::Page::RequestFinished => "requestFinished",
82
+ Events::Page::RequestFailed => "requestFailed",
83
+ Events::Page::FileChooser => "fileChooser",
84
+ })
76
85
  end
77
86
 
78
87
  attr_reader \
@@ -169,30 +178,6 @@ module Playwright
169
178
  video.send(:set_artifact, artifact)
170
179
  end
171
180
 
172
- # @override
173
- def on(event, callback)
174
- if event == Events::Page::FileChooser && listener_count(event) == 0
175
- @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
176
- end
177
- super
178
- end
179
-
180
- # @override
181
- def once(event, callback)
182
- if event == Events::Page::FileChooser && listener_count(event) == 0
183
- @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
184
- end
185
- super
186
- end
187
-
188
- # @override
189
- def off(event, callback)
190
- super
191
- if event == Events::Page::FileChooser && listener_count(event) == 0
192
- @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: false)
193
- end
194
- end
195
-
196
181
  def context
197
182
  @browser_context
198
183
  end
@@ -366,16 +351,24 @@ module Playwright
366
351
 
367
352
  def emulate_media(colorScheme: nil, forcedColors: nil, media: nil, reducedMotion: nil)
368
353
  params = {
369
- colorScheme: colorScheme,
370
- forcedColors: forcedColors,
371
- media: media,
372
- reducedMotion: reducedMotion,
354
+ colorScheme: no_override_if_null(colorScheme),
355
+ forcedColors: no_override_if_null(forcedColors),
356
+ media: no_override_if_null(media),
357
+ reducedMotion: no_override_if_null(reducedMotion),
373
358
  }.compact
374
359
  @channel.send_message_to_server('emulateMedia', params)
375
360
 
376
361
  nil
377
362
  end
378
363
 
364
+ private def no_override_if_null(target)
365
+ if target == 'null'
366
+ 'no-override'
367
+ else
368
+ target
369
+ end
370
+ end
371
+
379
372
  def set_viewport_size(viewportSize)
380
373
  @viewport_size = viewportSize
381
374
  @channel.send_message_to_server('setViewportSize', { viewportSize: viewportSize })
@@ -637,6 +630,7 @@ module Playwright
637
630
  selector,
638
631
  force: nil,
639
632
  modifiers: nil,
633
+ noWaitAfter: nil,
640
634
  position: nil,
641
635
  strict: nil,
642
636
  timeout: nil,
@@ -645,6 +639,7 @@ module Playwright
645
639
  selector,
646
640
  force: force,
647
641
  modifiers: modifiers,
642
+ noWaitAfter: noWaitAfter,
648
643
  position: position,
649
644
  strict: strict,
650
645
  timeout: timeout,
@@ -43,7 +43,10 @@ module Playwright
43
43
  end
44
44
 
45
45
  def initialize_playwright
46
- result = send_message_to_server('', 'initialize', { sdkLanguage: 'ruby' })
46
+ # Avoid Error: sdkLanguage: expected one of (javascript|python|java|csharp)
47
+ # ref: https://github.com/microsoft/playwright/pull/18308
48
+ # ref: https://github.com/YusukeIwaki/playwright-ruby-client/issues/228
49
+ result = send_message_to_server('', 'initialize', { sdkLanguage: 'python' })
47
50
  ChannelOwners::Playwright.from(result['playwright'])
48
51
  end
49
52
 
@@ -11,8 +11,7 @@ module Playwright
11
11
  selector_scopes = [selector]
12
12
 
13
13
  if hasText
14
- text_selector = "text=#{escape_for_text_selector(hasText, false)}"
15
- selector_scopes << "internal:has=#{text_selector.to_json}"
14
+ selector_scopes << "internal:has-text=#{escape_for_text_selector(hasText, false)}"
16
15
  end
17
16
 
18
17
  if has
@@ -187,6 +186,10 @@ module Playwright
187
186
  @frame.fill(@selector, value, strict: true, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
188
187
  end
189
188
 
189
+ def clear(force: nil, noWaitAfter: nil, timeout: nil)
190
+ @frame.fill(@selector, '', strict: true, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
191
+ end
192
+
190
193
  def locator(selector, hasText: nil, has: nil)
191
194
  LocatorImpl.new(
192
195
  frame: @frame,
@@ -251,6 +254,15 @@ module Playwright
251
254
  @frame.focus(@selector, strict: true, timeout: timeout)
252
255
  end
253
256
 
257
+ def blur(timeout: nil)
258
+ params = {
259
+ selector: @selector,
260
+ strict: true,
261
+ timeout: timeout,
262
+ }.compact
263
+ @frame.channel.send_message_to_server('blur', params)
264
+ end
265
+
254
266
  def count
255
267
  @frame.eval_on_selector_all(@selector, 'ee => ee.length')
256
268
  end
@@ -262,6 +274,7 @@ module Playwright
262
274
  def hover(
263
275
  force: nil,
264
276
  modifiers: nil,
277
+ noWaitAfter: nil,
265
278
  position: nil,
266
279
  timeout: nil,
267
280
  trial: nil)
@@ -269,6 +282,7 @@ module Playwright
269
282
  strict: true,
270
283
  force: force,
271
284
  modifiers: modifiers,
285
+ noWaitAfter: noWaitAfter,
272
286
  position: position,
273
287
  timeout: timeout,
274
288
  trial: trial)
@@ -1,7 +1,10 @@
1
+ require 'json'
2
+
1
3
  module Playwright
2
4
  module LocatorUtils
3
5
  def get_by_test_id(test_id)
4
- locator(get_by_test_id_selector(test_id))
6
+ test_id_attribute_name = ::Playwright::LocatorUtils.instance_variable_get(:@test_id_attribute_name)
7
+ locator(get_by_test_id_selector(test_id_attribute_name, test_id))
5
8
  end
6
9
 
7
10
  def get_by_alt_text(text, exact: false)
@@ -35,11 +38,8 @@ module Playwright
35
38
  "internal:attr=[#{attr_name}=#{escape_for_attribute_selector_or_regex(text, exact)}]"
36
39
  end
37
40
 
38
- private def get_by_test_id_selector(test_id)
39
- get_by_attribute_text_selector(
40
- ::Playwright::LocatorUtils.instance_variable_get(:@test_id_attribute_name),
41
- test_id,
42
- exact: true)
41
+ private def get_by_test_id_selector(test_id_attribute_name, test_id)
42
+ "internal:testid=[#{test_id_attribute_name}=#{escape_for_attribute_selector(test_id, true)}]"
43
43
  end
44
44
 
45
45
  private def get_by_label_selector(text, exact:)
@@ -59,7 +59,7 @@ module Playwright
59
59
  end
60
60
 
61
61
  private def get_by_text_selector(text, exact:)
62
- "text=#{escape_for_text_selector(text, exact)}"
62
+ "internal:text=#{escape_for_text_selector(text, exact)}"
63
63
  end
64
64
 
65
65
  private def get_by_role_selector(role, **options)
@@ -67,7 +67,7 @@ module Playwright
67
67
 
68
68
  ex = {
69
69
  includeHidden: -> (value) { ['include-hidden', value.to_s] },
70
- name: -> (value) { ['name', escape_for_attribute_selector_or_regex(value, false)]},
70
+ name: -> (value) { ['name', escape_for_attribute_selector_or_regex(value, options[:exact])]},
71
71
  }
72
72
 
73
73
  %i[
@@ -82,12 +82,12 @@ module Playwright
82
82
  ].each do |attr_name|
83
83
  if options.key?(attr_name)
84
84
  attr_value = options[attr_name]
85
- props << ex[attr_name]&.call(attr_value) || [attr_name, attr_value.to_s]
85
+ props << (ex[attr_name]&.call(attr_value) || [attr_name, attr_value.to_s])
86
86
  end
87
87
  end
88
88
 
89
89
  opts = props.map { |k, v| "[#{k}=#{v}]"}.join('')
90
- "role=#{role}#{opts}"
90
+ "internal:role=#{role}#{opts}"
91
91
  end
92
92
 
93
93
  # @param text [String]
@@ -103,16 +103,10 @@ module Playwright
103
103
  end
104
104
 
105
105
  if exact
106
- _text = text.gsub(/["]/, '\\"')
107
- return "\"#{_text}\""
108
- end
109
-
110
- if text.include?('"') || text.include?('>>') || text.start_with?('/')
111
- _text = escape_for_regex(text).gsub(/\s+/, '\\s+')
112
- return "/#{_text}/i"
106
+ "#{text.to_json}s"
107
+ else
108
+ "#{text.to_json}i"
113
109
  end
114
-
115
- text
116
110
  end
117
111
 
118
112
  # @param text [Regexp|String]
@@ -55,6 +55,12 @@ module Playwright
55
55
  params[:storageState] = JSON.parse(File.read(params[:storageState]))
56
56
  end
57
57
 
58
+ %i[colorScheme reducedMotion forcedColors].each do |key|
59
+ if params[key] == 'null'
60
+ params[key] = 'no-override'
61
+ end
62
+ end
63
+
58
64
  params
59
65
  end
60
66
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playwright
4
- VERSION = '1.27.0'
5
- COMPATIBLE_PLAYWRIGHT_VERSION = '1.27.0'
4
+ VERSION = '1.28.0'
5
+ COMPATIBLE_PLAYWRIGHT_VERSION = '1.28.1'
6
6
  end
@@ -25,6 +25,12 @@ module Playwright
25
25
  # ```
26
26
  class Android < PlaywrightApi
27
27
 
28
+ # This methods attaches Playwright to an existing Android device. Use [`method: Android.launchServer`] to launch a new
29
+ # Android server instance.
30
+ def connect(wsEndpoint, headers: nil, slowMo: nil, timeout: nil)
31
+ raise NotImplementedError.new('connect is not implemented yet.')
32
+ end
33
+
28
34
  # Returns the list of detected Android devices.
29
35
  def devices(host: nil, omitDriverInstall: nil, port: nil)
30
36
  wrap_impl(@impl.devices(host: unwrap_impl(host), omitDriverInstall: unwrap_impl(omitDriverInstall), port: unwrap_impl(port)))
@@ -36,12 +42,6 @@ module Playwright
36
42
  end
37
43
  alias_method :default_timeout=, :set_default_timeout
38
44
 
39
- # -- inherited from EventEmitter --
40
- # @nodoc
41
- def off(event, callback)
42
- event_emitter_proxy.off(event, callback)
43
- end
44
-
45
45
  # -- inherited from EventEmitter --
46
46
  # @nodoc
47
47
  def once(event, callback)
@@ -54,6 +54,12 @@ module Playwright
54
54
  event_emitter_proxy.on(event, callback)
55
55
  end
56
56
 
57
+ # -- inherited from EventEmitter --
58
+ # @nodoc
59
+ def off(event, callback)
60
+ event_emitter_proxy.off(event, callback)
61
+ end
62
+
57
63
  private def event_emitter_proxy
58
64
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
59
65
  end
@@ -173,12 +173,6 @@ module Playwright
173
173
  wrap_impl(@impl.tap_on(unwrap_impl(selector), duration: unwrap_impl(duration), timeout: unwrap_impl(timeout)))
174
174
  end
175
175
 
176
- # -- inherited from EventEmitter --
177
- # @nodoc
178
- def off(event, callback)
179
- event_emitter_proxy.off(event, callback)
180
- end
181
-
182
176
  # -- inherited from EventEmitter --
183
177
  # @nodoc
184
178
  def once(event, callback)
@@ -191,6 +185,12 @@ module Playwright
191
185
  event_emitter_proxy.on(event, callback)
192
186
  end
193
187
 
188
+ # -- inherited from EventEmitter --
189
+ # @nodoc
190
+ def off(event, callback)
191
+ event_emitter_proxy.off(event, callback)
192
+ end
193
+
194
194
  private def event_emitter_proxy
195
195
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
196
196
  end
@@ -269,12 +269,6 @@ module Playwright
269
269
  raise NotImplementedError.new('storage_state is not implemented yet.')
270
270
  end
271
271
 
272
- # -- inherited from EventEmitter --
273
- # @nodoc
274
- def off(event, callback)
275
- event_emitter_proxy.off(event, callback)
276
- end
277
-
278
272
  # -- inherited from EventEmitter --
279
273
  # @nodoc
280
274
  def once(event, callback)
@@ -287,6 +281,12 @@ module Playwright
287
281
  event_emitter_proxy.on(event, callback)
288
282
  end
289
283
 
284
+ # -- inherited from EventEmitter --
285
+ # @nodoc
286
+ def off(event, callback)
287
+ event_emitter_proxy.off(event, callback)
288
+ end
289
+
290
290
  private def event_emitter_proxy
291
291
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
292
292
  end
@@ -192,12 +192,6 @@ module Playwright
192
192
  wrap_impl(@impl.version)
193
193
  end
194
194
 
195
- # -- inherited from EventEmitter --
196
- # @nodoc
197
- def off(event, callback)
198
- event_emitter_proxy.off(event, callback)
199
- end
200
-
201
195
  # -- inherited from EventEmitter --
202
196
  # @nodoc
203
197
  def once(event, callback)
@@ -210,6 +204,12 @@ module Playwright
210
204
  event_emitter_proxy.on(event, callback)
211
205
  end
212
206
 
207
+ # -- inherited from EventEmitter --
208
+ # @nodoc
209
+ def off(event, callback)
210
+ event_emitter_proxy.off(event, callback)
211
+ end
212
+
213
213
  private def event_emitter_proxy
214
214
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
215
215
  end
@@ -406,12 +406,6 @@ module Playwright
406
406
  wrap_impl(@impl.owner_page=(unwrap_impl(req)))
407
407
  end
408
408
 
409
- # -- inherited from EventEmitter --
410
- # @nodoc
411
- def off(event, callback)
412
- event_emitter_proxy.off(event, callback)
413
- end
414
-
415
409
  # -- inherited from EventEmitter --
416
410
  # @nodoc
417
411
  def once(event, callback)
@@ -424,6 +418,12 @@ module Playwright
424
418
  event_emitter_proxy.on(event, callback)
425
419
  end
426
420
 
421
+ # -- inherited from EventEmitter --
422
+ # @nodoc
423
+ def off(event, callback)
424
+ event_emitter_proxy.off(event, callback)
425
+ end
426
+
427
427
  private def event_emitter_proxy
428
428
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
429
429
  end
@@ -158,12 +158,6 @@ module Playwright
158
158
  wrap_impl(@impl.name)
159
159
  end
160
160
 
161
- # -- inherited from EventEmitter --
162
- # @nodoc
163
- def off(event, callback)
164
- event_emitter_proxy.off(event, callback)
165
- end
166
-
167
161
  # -- inherited from EventEmitter --
168
162
  # @nodoc
169
163
  def once(event, callback)
@@ -176,6 +170,12 @@ module Playwright
176
170
  event_emitter_proxy.on(event, callback)
177
171
  end
178
172
 
173
+ # -- inherited from EventEmitter --
174
+ # @nodoc
175
+ def off(event, callback)
176
+ event_emitter_proxy.off(event, callback)
177
+ end
178
+
179
179
  private def event_emitter_proxy
180
180
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
181
181
  end
@@ -33,12 +33,6 @@ module Playwright
33
33
  wrap_impl(@impl.send_message(unwrap_impl(method), params: unwrap_impl(params)))
34
34
  end
35
35
 
36
- # -- inherited from EventEmitter --
37
- # @nodoc
38
- def off(event, callback)
39
- event_emitter_proxy.off(event, callback)
40
- end
41
-
42
36
  # -- inherited from EventEmitter --
43
37
  # @nodoc
44
38
  def once(event, callback)
@@ -51,6 +45,12 @@ module Playwright
51
45
  event_emitter_proxy.on(event, callback)
52
46
  end
53
47
 
48
+ # -- inherited from EventEmitter --
49
+ # @nodoc
50
+ def off(event, callback)
51
+ event_emitter_proxy.off(event, callback)
52
+ end
53
+
54
54
  private def event_emitter_proxy
55
55
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
56
56
  end
@@ -42,12 +42,6 @@ module Playwright
42
42
  wrap_impl(@impl.type)
43
43
  end
44
44
 
45
- # -- inherited from EventEmitter --
46
- # @nodoc
47
- def off(event, callback)
48
- event_emitter_proxy.off(event, callback)
49
- end
50
-
51
45
  # -- inherited from EventEmitter --
52
46
  # @nodoc
53
47
  def once(event, callback)
@@ -60,6 +54,12 @@ module Playwright
60
54
  event_emitter_proxy.on(event, callback)
61
55
  end
62
56
 
57
+ # -- inherited from EventEmitter --
58
+ # @nodoc
59
+ def off(event, callback)
60
+ event_emitter_proxy.off(event, callback)
61
+ end
62
+
63
63
  private def event_emitter_proxy
64
64
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
65
65
  end
@@ -58,12 +58,6 @@ module Playwright
58
58
  wrap_impl(@impl.accept_async(promptText: unwrap_impl(promptText)))
59
59
  end
60
60
 
61
- # -- inherited from EventEmitter --
62
- # @nodoc
63
- def off(event, callback)
64
- event_emitter_proxy.off(event, callback)
65
- end
66
-
67
61
  # -- inherited from EventEmitter --
68
62
  # @nodoc
69
63
  def once(event, callback)
@@ -76,6 +70,12 @@ module Playwright
76
70
  event_emitter_proxy.on(event, callback)
77
71
  end
78
72
 
73
+ # -- inherited from EventEmitter --
74
+ # @nodoc
75
+ def off(event, callback)
76
+ event_emitter_proxy.off(event, callback)
77
+ end
78
+
79
79
  private def event_emitter_proxy
80
80
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
81
81
  end
@@ -251,10 +251,11 @@ module Playwright
251
251
  def hover(
252
252
  force: nil,
253
253
  modifiers: nil,
254
+ noWaitAfter: nil,
254
255
  position: nil,
255
256
  timeout: nil,
256
257
  trial: nil)
257
- wrap_impl(@impl.hover(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
258
+ wrap_impl(@impl.hover(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
258
259
  end
259
260
 
260
261
  # Returns the `element.innerHTML`.
@@ -557,12 +558,6 @@ module Playwright
557
558
  wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
558
559
  end
559
560
 
560
- # -- inherited from EventEmitter --
561
- # @nodoc
562
- def off(event, callback)
563
- event_emitter_proxy.off(event, callback)
564
- end
565
-
566
561
  # -- inherited from EventEmitter --
567
562
  # @nodoc
568
563
  def once(event, callback)
@@ -575,6 +570,12 @@ module Playwright
575
570
  event_emitter_proxy.on(event, callback)
576
571
  end
577
572
 
573
+ # -- inherited from EventEmitter --
574
+ # @nodoc
575
+ def off(event, callback)
576
+ event_emitter_proxy.off(event, callback)
577
+ end
578
+
578
579
  private def event_emitter_proxy
579
580
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
580
581
  end
@@ -357,7 +357,7 @@ module Playwright
357
357
  end
358
358
 
359
359
  # Allows locating input elements by the text of the associated label. For example, this method will find the input by
360
- # label text Password in the following DOM:
360
+ # label text "Password" in the following DOM:
361
361
  #
362
362
  # ```html
363
363
  # <label for="password-input">Password:</label>
@@ -390,13 +390,14 @@ module Playwright
390
390
  role,
391
391
  checked: nil,
392
392
  disabled: nil,
393
+ exact: nil,
393
394
  expanded: nil,
394
395
  includeHidden: nil,
395
396
  level: nil,
396
397
  name: nil,
397
398
  pressed: nil,
398
399
  selected: nil)
399
- wrap_impl(@impl.get_by_role(unwrap_impl(role), checked: unwrap_impl(checked), disabled: unwrap_impl(disabled), expanded: unwrap_impl(expanded), includeHidden: unwrap_impl(includeHidden), level: unwrap_impl(level), name: unwrap_impl(name), pressed: unwrap_impl(pressed), selected: unwrap_impl(selected)))
400
+ wrap_impl(@impl.get_by_role(unwrap_impl(role), checked: unwrap_impl(checked), disabled: unwrap_impl(disabled), exact: unwrap_impl(exact), expanded: unwrap_impl(expanded), includeHidden: unwrap_impl(includeHidden), level: unwrap_impl(level), name: unwrap_impl(name), pressed: unwrap_impl(pressed), selected: unwrap_impl(selected)))
400
401
  end
401
402
 
402
403
  # Locate element by the test id. By default, the `data-testid` attribute is used as a test id. Use
@@ -405,12 +406,44 @@ module Playwright
405
406
  wrap_impl(@impl.get_by_test_id(unwrap_impl(testId)))
406
407
  end
407
408
 
408
- # Allows locating elements that contain given text.
409
+ # Allows locating elements that contain given text. Consider the following DOM structure:
410
+ #
411
+ # ```html
412
+ # <div>Hello <span>world</span></div>
413
+ # <div>Hello</div>
414
+ # ```
415
+ #
416
+ # You can locate by text substring, exact string, or a regular expression:
417
+ #
418
+ # ```python sync
419
+ # # Matches <span>
420
+ # page.get_by_text("world")
421
+ #
422
+ # # Matches first <div>
423
+ # page.get_by_text("Hello world")
424
+ #
425
+ # # Matches second <div>
426
+ # page.get_by_text("Hello", exact=True)
427
+ #
428
+ # # Matches both <div>s
429
+ # page.get_by_text(re.compile("Hello"))
430
+ #
431
+ # # Matches second <div>
432
+ # page.get_by_text(re.compile("^hello$", re.IGNORECASE))
433
+ # ```
434
+ #
435
+ # See also [`method: Locator.filter`] that allows to match by another criteria, like an accessible role, and then filter
436
+ # by the text content.
437
+ #
438
+ # > NOTE: Matching by text always normalizes whitespace, even with exact match. For example, it turns multiple spaces into
439
+ # one, turns line breaks into spaces and ignores leading and trailing whitespace.
440
+ # > NOTE: Input elements of the type `button` and `submit` are matched by their `value` instead of the text content. For
441
+ # example, locating by text `"Log in"` matches `<input type=button value="Log in">`.
409
442
  def get_by_text(text, exact: nil)
410
443
  wrap_impl(@impl.get_by_text(unwrap_impl(text), exact: unwrap_impl(exact)))
411
444
  end
412
445
 
413
- # Allows locating elements by their title. For example, this method will find the button by its title "Submit":
446
+ # Allows locating elements by their title. For example, this method will find the button by its title "Place the order":
414
447
  #
415
448
  # ```html
416
449
  # <button title='Place the order'>Order Now</button>
@@ -455,11 +488,12 @@ module Playwright
455
488
  selector,
456
489
  force: nil,
457
490
  modifiers: nil,
491
+ noWaitAfter: nil,
458
492
  position: nil,
459
493
  strict: nil,
460
494
  timeout: nil,
461
495
  trial: nil)
462
- wrap_impl(@impl.hover(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
496
+ wrap_impl(@impl.hover(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
463
497
  end
464
498
 
465
499
  # Returns `element.innerHTML`.
@@ -874,12 +908,6 @@ module Playwright
874
908
  wrap_impl(@impl.highlight(unwrap_impl(selector)))
875
909
  end
876
910
 
877
- # -- inherited from EventEmitter --
878
- # @nodoc
879
- def off(event, callback)
880
- event_emitter_proxy.off(event, callback)
881
- end
882
-
883
911
  # -- inherited from EventEmitter --
884
912
  # @nodoc
885
913
  def once(event, callback)
@@ -892,6 +920,12 @@ module Playwright
892
920
  event_emitter_proxy.on(event, callback)
893
921
  end
894
922
 
923
+ # -- inherited from EventEmitter --
924
+ # @nodoc
925
+ def off(event, callback)
926
+ event_emitter_proxy.off(event, callback)
927
+ end
928
+
895
929
  private def event_emitter_proxy
896
930
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
897
931
  end