playwright-ruby-client 0.1.0 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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