playwright-ruby-client 0.1.0 → 0.5.3

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -8
  3. data/docs/api_coverage.md +123 -73
  4. data/lib/playwright.rb +48 -9
  5. data/lib/playwright/channel.rb +12 -2
  6. data/lib/playwright/channel_owner.rb +3 -5
  7. data/lib/playwright/channel_owners/android.rb +1 -1
  8. data/lib/playwright/channel_owners/android_device.rb +11 -11
  9. data/lib/playwright/channel_owners/artifact.rb +30 -0
  10. data/lib/playwright/channel_owners/binding_call.rb +3 -0
  11. data/lib/playwright/channel_owners/browser.rb +22 -1
  12. data/lib/playwright/channel_owners/browser_context.rb +155 -4
  13. data/lib/playwright/channel_owners/browser_type.rb +28 -0
  14. data/lib/playwright/channel_owners/dialog.rb +28 -0
  15. data/lib/playwright/channel_owners/element_handle.rb +18 -5
  16. data/lib/playwright/channel_owners/frame.rb +40 -5
  17. data/lib/playwright/channel_owners/js_handle.rb +3 -3
  18. data/lib/playwright/channel_owners/page.rb +172 -51
  19. data/lib/playwright/channel_owners/playwright.rb +24 -27
  20. data/lib/playwright/channel_owners/request.rb +27 -3
  21. data/lib/playwright/channel_owners/response.rb +60 -0
  22. data/lib/playwright/channel_owners/route.rb +78 -0
  23. data/lib/playwright/channel_owners/selectors.rb +19 -1
  24. data/lib/playwright/channel_owners/stream.rb +15 -0
  25. data/lib/playwright/connection.rb +11 -32
  26. data/lib/playwright/download.rb +27 -0
  27. data/lib/playwright/errors.rb +6 -0
  28. data/lib/playwright/events.rb +2 -5
  29. data/lib/playwright/keyboard_impl.rb +1 -1
  30. data/lib/playwright/mouse_impl.rb +41 -0
  31. data/lib/playwright/playwright_api.rb +3 -1
  32. data/lib/playwright/route_handler_entry.rb +28 -0
  33. data/lib/playwright/select_option_values.rb +14 -4
  34. data/lib/playwright/transport.rb +28 -7
  35. data/lib/playwright/url_matcher.rb +1 -1
  36. data/lib/playwright/utils.rb +11 -2
  37. data/lib/playwright/version.rb +1 -1
  38. data/lib/playwright/video.rb +51 -0
  39. data/lib/playwright/wait_helper.rb +2 -2
  40. data/lib/playwright_api/accessibility.rb +39 -1
  41. data/lib/playwright_api/android.rb +72 -5
  42. data/lib/playwright_api/android_device.rb +139 -26
  43. data/lib/playwright_api/android_input.rb +17 -13
  44. data/lib/playwright_api/android_socket.rb +16 -0
  45. data/lib/playwright_api/android_web_view.rb +21 -0
  46. data/lib/playwright_api/browser.rb +87 -19
  47. data/lib/playwright_api/browser_context.rb +216 -32
  48. data/lib/playwright_api/browser_type.rb +45 -58
  49. data/lib/playwright_api/dialog.rb +54 -7
  50. data/lib/playwright_api/element_handle.rb +113 -33
  51. data/lib/playwright_api/file_chooser.rb +6 -1
  52. data/lib/playwright_api/frame.rb +238 -43
  53. data/lib/playwright_api/js_handle.rb +20 -2
  54. data/lib/playwright_api/keyboard.rb +48 -1
  55. data/lib/playwright_api/mouse.rb +26 -5
  56. data/lib/playwright_api/page.rb +534 -63
  57. data/lib/playwright_api/playwright.rb +43 -47
  58. data/lib/playwright_api/request.rb +38 -12
  59. data/lib/playwright_api/response.rb +27 -10
  60. data/lib/playwright_api/route.rb +51 -6
  61. data/lib/playwright_api/selectors.rb +28 -2
  62. data/lib/playwright_api/touchscreen.rb +1 -1
  63. data/lib/playwright_api/web_socket.rb +15 -0
  64. data/lib/playwright_api/worker.rb +25 -1
  65. data/playwright.gemspec +4 -2
  66. metadata +42 -14
  67. data/lib/playwright/channel_owners/chromium_browser.rb +0 -8
  68. data/lib/playwright/channel_owners/chromium_browser_context.rb +0 -8
  69. data/lib/playwright/channel_owners/download.rb +0 -27
  70. data/lib/playwright/channel_owners/firefox_browser.rb +0 -8
  71. data/lib/playwright/channel_owners/webkit_browser.rb +0 -8
  72. data/lib/playwright_api/binding_call.rb +0 -27
  73. data/lib/playwright_api/chromium_browser_context.rb +0 -59
  74. data/lib/playwright_api/download.rb +0 -100
  75. data/lib/playwright_api/video.rb +0 -24
@@ -136,8 +136,19 @@ module Playwright
136
136
  nil
137
137
  end
138
138
 
139
- def select_option(values, noWaitAfter: nil, timeout: nil)
140
- base_params = SelectOptionValues.new(values).as_params
139
+ def select_option(
140
+ element: nil,
141
+ index: nil,
142
+ value: nil,
143
+ label: nil,
144
+ noWaitAfter: nil,
145
+ timeout: nil)
146
+ base_params = SelectOptionValues.new(
147
+ element: element,
148
+ index: index,
149
+ value: value,
150
+ label: label,
151
+ ).as_params
141
152
  params = base_params + { noWaitAfter: noWaitAfter, timeout: timeout }.compact
142
153
  @channel.send_message_to_server('selectOption', params)
143
154
 
@@ -168,7 +179,7 @@ module Playwright
168
179
  value: value,
169
180
  noWaitAfter: noWaitAfter,
170
181
  timeout: timeout,
171
- }
182
+ }.compact
172
183
  @channel.send_message_to_server('fill', params)
173
184
 
174
185
  nil
@@ -219,10 +230,11 @@ module Playwright
219
230
  nil
220
231
  end
221
232
 
222
- def check(force: nil, noWaitAfter: nil, timeout: nil)
233
+ def check(force: nil, noWaitAfter: nil, position: nil, timeout: nil)
223
234
  params = {
224
235
  force: force,
225
236
  noWaitAfter: noWaitAfter,
237
+ position: position,
226
238
  timeout: timeout,
227
239
  }.compact
228
240
  @channel.send_message_to_server('check', params)
@@ -230,10 +242,11 @@ module Playwright
230
242
  nil
231
243
  end
232
244
 
233
- def uncheck(force: nil, noWaitAfter: nil, timeout: nil)
245
+ def uncheck(force: nil, noWaitAfter: nil, position: nil, timeout: nil)
234
246
  params = {
235
247
  force: force,
236
248
  noWaitAfter: noWaitAfter,
249
+ position: position,
237
250
  timeout: timeout,
238
251
  }.compact
239
252
  @channel.send_message_to_server('uncheck', params)
@@ -1,7 +1,7 @@
1
1
  module Playwright
2
2
  # @ref https://github.com/microsoft/playwright-python/blob/master/playwright/_impl/_frame.py
3
3
  define_channel_owner :Frame do
4
- def after_initialize
4
+ private def after_initialize
5
5
  if @initializer['parentFrame']
6
6
  @parent_frame = ChannelOwners::Frame.from(@initializer['parentFrame'])
7
7
  @parent_frame.send(:append_child_frame_from_child, self)
@@ -98,6 +98,15 @@ module Playwright
98
98
  request&.response
99
99
  end
100
100
 
101
+ def wait_for_url(url, timeout: nil, waitUntil: nil)
102
+ matcher = UrlMatcher.new(url)
103
+ if matcher.match?(@url)
104
+ wait_for_load_state(state: waitUntil, timeout: timeout)
105
+ else
106
+ expect_navigation(timeout: timeout, url: url, waitUntil: waitUntil)
107
+ end
108
+ end
109
+
101
110
  def wait_for_load_state(state: nil, timeout: nil)
102
111
  option_state = state || 'load'
103
112
  option_timeout = timeout || @page.send(:timeout_settings).navigation_timeout
@@ -398,8 +407,20 @@ module Playwright
398
407
  nil
399
408
  end
400
409
 
401
- def select_option(selector, values, noWaitAfter: nil, timeout: nil)
402
- base_params = SelectOptionValues.new(values).as_params
410
+ def select_option(
411
+ selector,
412
+ element: nil,
413
+ index: nil,
414
+ value: nil,
415
+ label: nil,
416
+ noWaitAfter: nil,
417
+ timeout: nil)
418
+ base_params = SelectOptionValues.new(
419
+ element: element,
420
+ index: index,
421
+ value: value,
422
+ label: label,
423
+ ).as_params
403
424
  params = base_params + { selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact
404
425
  @channel.send_message_to_server('selectOption', params)
405
426
 
@@ -452,11 +473,18 @@ module Playwright
452
473
  nil
453
474
  end
454
475
 
455
- def check(selector, force: nil, noWaitAfter: nil, timeout: nil)
476
+ def check(
477
+ selector,
478
+ force: nil,
479
+ noWaitAfter: nil,
480
+ position: nil,
481
+ timeout: nil)
482
+
456
483
  params = {
457
484
  selector: selector,
458
485
  force: force,
459
486
  noWaitAfter: noWaitAfter,
487
+ position: position,
460
488
  timeout: timeout,
461
489
  }.compact
462
490
  @channel.send_message_to_server('check', params)
@@ -464,11 +492,18 @@ module Playwright
464
492
  nil
465
493
  end
466
494
 
467
- def uncheck(selector, force: nil, noWaitAfter: nil, timeout: nil)
495
+ def uncheck(
496
+ selector,
497
+ force: nil,
498
+ noWaitAfter: nil,
499
+ position: nil,
500
+ timeout: nil)
501
+
468
502
  params = {
469
503
  selector: selector,
470
504
  force: force,
471
505
  noWaitAfter: noWaitAfter,
506
+ position: position,
472
507
  timeout: timeout,
473
508
  }.compact
474
509
  @channel.send_message_to_server('uncheck', params)
@@ -1,6 +1,6 @@
1
1
  module Playwright
2
2
  define_channel_owner :JSHandle do
3
- def after_initialize
3
+ private def after_initialize
4
4
  @preview = @initializer['preview']
5
5
  @channel.on('previewUpdated', method(:on_preview_updated))
6
6
  end
@@ -9,8 +9,8 @@ module Playwright
9
9
  @preview
10
10
  end
11
11
 
12
- private def on_preview_updated(preview)
13
- @preview = preview
12
+ private def on_preview_updated(params)
13
+ @preview = params['preview']
14
14
  end
15
15
 
16
16
  def evaluate(pageFunction, arg: nil)
@@ -6,7 +6,7 @@ module Playwright
6
6
  include Utils::Errors::SafeCloseError
7
7
  attr_writer :owned_context
8
8
 
9
- def after_initialize
9
+ private def after_initialize
10
10
  @browser_context = @parent
11
11
  @timeout_settings = TimeoutSettings.new(@browser_context.send(:_timeout_settings))
12
12
  @accessibility = Accessibility.new(@channel)
@@ -14,12 +14,21 @@ module Playwright
14
14
  @mouse = MouseImpl.new(@channel)
15
15
  @touchscreen = TouchscreenImpl.new(@channel)
16
16
 
17
- @viewport_size = @initializer['viewportSize']
17
+ if @initializer['viewportSize']
18
+ @viewport_size = {
19
+ width: @initializer['viewportSize']['width'],
20
+ height: @initializer['viewportSize']['height'],
21
+ }
22
+ end
18
23
  @closed = false
24
+ @bindings = {}
25
+ @routes = Set.new
26
+
19
27
  @main_frame = ChannelOwners::Frame.from(@initializer['mainFrame'])
20
28
  @main_frame.send(:update_page_from_page, self)
21
29
  @frames = Set.new
22
30
  @frames << @main_frame
31
+ @opener = ChannelOwners::Page.from_nullable(@initializer['opener'])
23
32
 
24
33
  @channel.once('close', ->(_) { on_close })
25
34
  @channel.on('console', ->(params) {
@@ -29,9 +38,7 @@ module Playwright
29
38
  @channel.on('crash', ->(_) { emit(Events::Page::Crash) })
30
39
  @channel.on('dialog', method(:on_dialog))
31
40
  @channel.on('domcontentloaded', ->(_) { emit(Events::Page::DOMContentLoaded) })
32
- @channel.on('download', ->(params) {
33
- emit(Events::Page::Download, ChannelOwners::Download.from(params['download']))
34
- })
41
+ @channel.on('download', method(:on_download))
35
42
  @channel.on('fileChooser', ->(params) {
36
43
  chooser = FileChooserImpl.new(
37
44
  page: self,
@@ -49,9 +56,6 @@ module Playwright
49
56
  @channel.on('pageError', ->(params) {
50
57
  emit(Events::Page::PageError, Error.parse(params['error']['error']))
51
58
  })
52
- @channel.on('popup', ->(params) {
53
- emit(Events::Page::Popup, ChannelOwners::Page.from(params['page']))
54
- })
55
59
  @channel.on('request', ->(params) {
56
60
  emit(Events::Page::Request, ChannelOwners::Request.from(params['request']))
57
61
  })
@@ -74,9 +78,7 @@ module Playwright
74
78
  @channel.on('route', ->(params) {
75
79
  on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
76
80
  })
77
- @channel.on('video', ->(params) {
78
- video.send(:update_relative_path, params['relativePath'])
79
- })
81
+ @channel.on('video', method(:on_video))
80
82
  @channel.on('webSocket', ->(params) {
81
83
  emit(Events::Page::WebSocket, ChannelOwners::WebSocket.from(params['webSocket']))
82
84
  })
@@ -96,12 +98,12 @@ module Playwright
96
98
  private def on_request_failed(request, response_end_timing, failure_text)
97
99
  request.send(:update_failure_text, failure_text)
98
100
  request.send(:update_response_end_timing, response_end_timing)
99
- emit(Events::Page::RequestFailed)
101
+ emit(Events::Page::RequestFailed, request)
100
102
  end
101
103
 
102
104
  private def on_request_finished(request, response_end_timing)
103
105
  request.send(:update_response_end_timing, response_end_timing)
104
- emit(Events::Page::RequestFinished)
106
+ emit(Events::Page::RequestFinished, request)
105
107
  end
106
108
 
107
109
  private def on_frame_attached(frame)
@@ -117,8 +119,15 @@ module Playwright
117
119
  end
118
120
 
119
121
  private def on_route(route, request)
120
- # @routes.each ...
121
- @browser_context.send(:on_route, route, request)
122
+ # It is not desired to use PlaywrightApi.wrap directly.
123
+ # However it is a little difficult to define wrapper for `handler` parameter in generate_api.
124
+ # Just a workaround...
125
+ wrapped_route = PlaywrightApi.wrap(route)
126
+ wrapped_request = PlaywrightApi.wrap(request)
127
+
128
+ if @routes.none? { |handler_entry| handler_entry.handle(wrapped_route, wrapped_request) }
129
+ @browser_context.send(:on_route, route, request)
130
+ end
122
131
  end
123
132
 
124
133
  private def on_close
@@ -130,14 +139,28 @@ module Playwright
130
139
  private def on_dialog(params)
131
140
  dialog = ChannelOwners::Dialog.from(params['dialog'])
132
141
  unless emit(Events::Page::Dialog, dialog)
133
- dialog.dismiss # FIXME: this should be asynchronous
142
+ dialog.dismiss
134
143
  end
135
144
  end
136
145
 
146
+ private def on_download(params)
147
+ download = Download.new(
148
+ url: params['url'],
149
+ suggested_filename: params['suggestedFilename'],
150
+ artifact: ChannelOwners::Artifact.from(params['artifact']),
151
+ )
152
+ emit(Events::Page::Download, download)
153
+ end
154
+
155
+ private def on_video(params)
156
+ artifact = ChannelOwners::Artifact.from(params['artifact'])
157
+ video.send(:set_artifact, artifact)
158
+ end
159
+
137
160
  # @override
138
161
  def on(event, callback)
139
162
  if event == Events::Page::FileChooser && listener_count(event) == 0
140
- @channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: true)
163
+ @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
141
164
  end
142
165
  super
143
166
  end
@@ -145,7 +168,7 @@ module Playwright
145
168
  # @override
146
169
  def once(event, callback)
147
170
  if event == Events::Page::FileChooser && listener_count(event) == 0
148
- @channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: true)
171
+ @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
149
172
  end
150
173
  super
151
174
  end
@@ -154,7 +177,7 @@ module Playwright
154
177
  def off(event, callback)
155
178
  super
156
179
  if event == Events::Page::FileChooser && listener_count(event) == 0
157
- @channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: false)
180
+ @channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: false)
158
181
  end
159
182
  end
160
183
 
@@ -163,18 +186,20 @@ module Playwright
163
186
  end
164
187
 
165
188
  def opener
166
- resp = @channel.send_message_to_server('opener')
167
- ChannelOwners::Page.from(resp)
189
+ if @opener&.closed?
190
+ nil
191
+ else
192
+ @opener
193
+ end
168
194
  end
169
195
 
170
- def frame(frameSelector)
171
- name, url =
172
- if frameSelector.is_a?(Hash)
173
- [frameSelector[:name], frameSelector[:url]]
174
- else
175
- [frameSelector, nil]
176
- end
196
+ private def emit_popup_event_from_browser_context
197
+ if @opener && !@opener.closed?
198
+ @opener.emit(Events::Page::Popup, self)
199
+ end
200
+ end
177
201
 
202
+ def frame(name: nil, url: nil)
178
203
  if name
179
204
  @frames.find { |f| f.name == name }
180
205
  elsif url
@@ -318,6 +343,10 @@ module Playwright
318
343
  @main_frame.wait_for_load_state(state: state, timeout: timeout)
319
344
  end
320
345
 
346
+ def wait_for_url(url, timeout: nil, waitUntil: nil)
347
+ @main_frame.wait_for_url(url, timeout: timeout, waitUntil: waitUntil)
348
+ end
349
+
321
350
  def go_back(timeout: nil, waitUntil: nil)
322
351
  params = { timeout: timeout, waitUntil: waitUntil }.compact
323
352
  resp = @channel.send_message_to_server('goBack', params)
@@ -351,12 +380,37 @@ module Playwright
351
380
  nil
352
381
  end
353
382
 
354
- def add_init_script(script, arg: nil)
383
+ def add_init_script(path: nil, script: nil)
384
+ source =
385
+ if path
386
+ File.read(path)
387
+ elsif script
388
+ script
389
+ else
390
+ raise ArgumentError.new('Either path or script parameter must be specified')
391
+ end
392
+
355
393
  @channel.send_message_to_server('addInitScript', source: script)
356
- # FIXME: handling `arg` for function `script`
357
394
  nil
358
395
  end
359
396
 
397
+ def route(url, handler)
398
+ entry = RouteHandlerEntry.new(url, handler)
399
+ @routes << entry
400
+ if @routes.count >= 1
401
+ @channel.send_message_to_server('setNetworkInterceptionEnabled', enabled: true)
402
+ end
403
+ end
404
+
405
+ def unroute(url, handler: nil)
406
+ @routes.reject! do |handler_entry|
407
+ handler_entry.same_value?(url: url, handler: handler)
408
+ end
409
+ if @routes.count == 0
410
+ @channel.send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
411
+ end
412
+ end
413
+
360
414
  def screenshot(
361
415
  path: nil,
362
416
  type: nil,
@@ -502,8 +556,23 @@ module Playwright
502
556
  )
503
557
  end
504
558
 
505
- def select_option(selector, values, noWaitAfter: nil, timeout: nil)
506
- @main_frame.select_option(selector, values, noWaitAfter: noWaitAfter, timeout: timeout)
559
+ def select_option(
560
+ selector,
561
+ element: nil,
562
+ index: nil,
563
+ value: nil,
564
+ label: nil,
565
+ noWaitAfter: nil,
566
+ timeout: nil)
567
+ @main_frame.select_option(
568
+ selector,
569
+ element: element,
570
+ index: index,
571
+ value: value,
572
+ label: label,
573
+ noWaitAfter: noWaitAfter,
574
+ timeout: timeout,
575
+ )
507
576
  end
508
577
 
509
578
  def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
@@ -530,12 +599,24 @@ module Playwright
530
599
  @main_frame.press(selector, key, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout)
531
600
  end
532
601
 
533
- def check(selector, force: nil, noWaitAfter: nil, timeout: nil)
534
- @main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
602
+ def check(
603
+ selector,
604
+ force: nil,
605
+ noWaitAfter: nil,
606
+ position: nil,
607
+ timeout: nil)
608
+
609
+ @main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout)
535
610
  end
536
611
 
537
- def uncheck(selector, force: nil, noWaitAfter: nil, timeout: nil)
538
- @main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
612
+ def uncheck(
613
+ selector,
614
+ force: nil,
615
+ noWaitAfter: nil,
616
+ position: nil,
617
+ timeout: nil)
618
+
619
+ @main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout)
539
620
  end
540
621
 
541
622
  def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
@@ -581,6 +662,36 @@ module Playwright
581
662
  decoded_binary
582
663
  end
583
664
 
665
+ def video
666
+ return nil unless @browser_context.send(:has_record_video_option?)
667
+ @video ||= Video.new(self)
668
+ end
669
+
670
+ def start_js_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
671
+ params = {
672
+ resetOnNavigation: resetOnNavigation,
673
+ reportAnonymousScripts: reportAnonymousScripts,
674
+ }.compact
675
+
676
+ @channel.send_message_to_server('startJSCoverage', params)
677
+ end
678
+
679
+ def stop_js_coverage
680
+ @channel.send_message_to_server('stopJSCoverage')
681
+ end
682
+
683
+ def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
684
+ params = {
685
+ resetOnNavigation: resetOnNavigation,
686
+ }.compact
687
+
688
+ @channel.send_message_to_server('startCSSCoverage', params)
689
+ end
690
+
691
+ def stop_css_coverage
692
+ @channel.send_message_to_server('stopCSSCoverage')
693
+ end
694
+
584
695
  class CrashedError < StandardError
585
696
  def initialize
586
697
  super('Page crashed')
@@ -599,20 +710,9 @@ module Playwright
599
710
  end
600
711
  end
601
712
 
602
- def expect_event(event, optionsOrPredicate: nil, &block)
603
- predicate, timeout =
604
- case optionsOrPredicate
605
- when Proc
606
- [optionsOrPredicate, nil]
607
- when Hash
608
- [optionsOrPredicate[:predicate], optionsOrPredicate[:timeout]]
609
- else
610
- [nil, nil]
611
- end
612
- timeout ||= @timeout_settings.timeout
613
-
713
+ def expect_event(event, predicate: nil, timeout: nil, &block)
614
714
  wait_helper = WaitHelper.new
615
- wait_helper.reject_on_timeout(timeout, "Timeout while waiting for event \"#{event}\"")
715
+ wait_helper.reject_on_timeout(timeout || @timeout_settings.timeout, "Timeout while waiting for event \"#{event}\"")
616
716
 
617
717
  unless event == Events::Page::Crash
618
718
  wait_helper.reject_on_event(self, Events::Page::Crash, CrashedError.new)
@@ -629,6 +729,18 @@ module Playwright
629
729
  wait_helper.promise.value!
630
730
  end
631
731
 
732
+ def expect_console_message(predicate: nil, timeout: nil, &block)
733
+ expect_event(Events::Page::Console, predicate: predicate, timeout: timeout, &block)
734
+ end
735
+
736
+ def expect_download(predicate: nil, timeout: nil, &block)
737
+ expect_event(Events::Page::Download, predicate: predicate, timeout: timeout, &block)
738
+ end
739
+
740
+ def expect_file_chooser(predicate: nil, timeout: nil, &block)
741
+ expect_event(Events::Page::FileChooser, predicate: predicate, timeout: timeout, &block)
742
+ end
743
+
632
744
  def expect_navigation(timeout: nil, url: nil, waitUntil: nil, &block)
633
745
  @main_frame.expect_navigation(
634
746
  timeout: timeout,
@@ -637,6 +749,10 @@ module Playwright
637
749
  &block)
638
750
  end
639
751
 
752
+ def expect_popup(predicate: nil, timeout: nil, &block)
753
+ expect_event(Events::Page::Popup, predicate: predicate, timeout: timeout, &block)
754
+ end
755
+
640
756
  def expect_request(urlOrPredicate, timeout: nil)
641
757
  predicate =
642
758
  case urlOrPredicate
@@ -649,7 +765,7 @@ module Playwright
649
765
  -> (_) { true }
650
766
  end
651
767
 
652
- expect_event(Events::Page::Request, optionsOrPredicate: { predicate: predicate, timeout: timeout})
768
+ expect_event(Events::Page::Request, predicate: predicate, timeout: timeout)
653
769
  end
654
770
 
655
771
  def expect_response(urlOrPredicate, timeout: nil)
@@ -664,7 +780,7 @@ module Playwright
664
780
  -> (_) { true }
665
781
  end
666
782
 
667
- expect_event(Events::Page::Response, optionsOrPredicate: { predicate: predicate, timeout: timeout})
783
+ expect_event(Events::Page::Response, predicate: predicate, timeout: timeout)
668
784
  end
669
785
 
670
786
  # called from BrowserContext#on_page with send(:update_browser_context, page), so keep private.
@@ -677,5 +793,10 @@ module Playwright
677
793
  private def timeout_settings
678
794
  @timeout_settings
679
795
  end
796
+
797
+ # called from BrowserContext#expose_binding
798
+ private def has_bindings?(name)
799
+ @bindings.key?(name)
800
+ end
680
801
  end
681
802
  end