playwright-ruby-client 0.0.8 → 0.3.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.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/docs/api_coverage.md +159 -101
- data/lib/playwright.rb +5 -2
- data/lib/playwright/{input_types/android_input.rb → android_input_impl.rb} +5 -1
- data/lib/playwright/api_implementation.rb +18 -0
- data/lib/playwright/channel.rb +13 -6
- data/lib/playwright/channel_owner.rb +3 -5
- data/lib/playwright/channel_owners/android.rb +1 -1
- data/lib/playwright/channel_owners/android_device.rb +12 -12
- data/lib/playwright/channel_owners/binding_call.rb +3 -0
- data/lib/playwright/channel_owners/browser.rb +1 -1
- data/lib/playwright/channel_owners/browser_context.rb +157 -3
- data/lib/playwright/channel_owners/dialog.rb +28 -0
- data/lib/playwright/channel_owners/download.rb +27 -0
- data/lib/playwright/channel_owners/element_handle.rb +15 -4
- data/lib/playwright/channel_owners/frame.rb +24 -5
- data/lib/playwright/channel_owners/js_handle.rb +1 -1
- data/lib/playwright/channel_owners/page.rb +367 -29
- data/lib/playwright/channel_owners/playwright.rb +4 -0
- data/lib/playwright/channel_owners/request.rb +35 -3
- data/lib/playwright/channel_owners/response.rb +60 -0
- data/lib/playwright/channel_owners/route.rb +78 -0
- data/lib/playwright/channel_owners/selectors.rb +19 -1
- data/lib/playwright/errors.rb +1 -1
- data/lib/playwright/event_emitter.rb +8 -1
- data/lib/playwright/event_emitter_proxy.rb +49 -0
- data/lib/playwright/file_chooser_impl.rb +23 -0
- data/lib/playwright/http_headers.rb +20 -0
- data/lib/playwright/input_files.rb +1 -1
- data/lib/playwright/{input_types/keyboard.rb → keyboard_impl.rb} +5 -1
- data/lib/playwright/mouse_impl.rb +7 -0
- data/lib/playwright/playwright_api.rb +59 -20
- data/lib/playwright/route_handler_entry.rb +36 -0
- data/lib/playwright/select_option_values.rb +14 -4
- data/lib/playwright/touchscreen_impl.rb +7 -0
- data/lib/playwright/utils.rb +4 -3
- data/lib/playwright/version.rb +1 -1
- data/lib/playwright/wait_helper.rb +1 -1
- data/lib/playwright_api/android.rb +82 -11
- data/lib/playwright_api/android_device.rb +148 -32
- data/lib/playwright_api/android_input.rb +17 -13
- data/lib/playwright_api/android_socket.rb +16 -0
- data/lib/playwright_api/android_web_view.rb +21 -0
- data/lib/playwright_api/binding_call.rb +14 -5
- data/lib/playwright_api/browser.rb +22 -23
- data/lib/playwright_api/browser_context.rb +49 -35
- data/lib/playwright_api/browser_type.rb +24 -64
- data/lib/playwright_api/chromium_browser_context.rb +10 -8
- data/lib/playwright_api/console_message.rb +10 -6
- data/lib/playwright_api/dialog.rb +37 -6
- data/lib/playwright_api/download.rb +28 -11
- data/lib/playwright_api/element_handle.rb +107 -96
- data/lib/playwright_api/file_chooser.rb +18 -10
- data/lib/playwright_api/frame.rb +124 -117
- data/lib/playwright_api/js_handle.rb +20 -22
- data/lib/playwright_api/keyboard.rb +5 -5
- data/lib/playwright_api/page.rb +206 -148
- data/lib/playwright_api/playwright.rb +33 -45
- data/lib/playwright_api/request.rb +11 -12
- data/lib/playwright_api/response.rb +30 -16
- data/lib/playwright_api/route.rb +27 -5
- data/lib/playwright_api/selectors.rb +14 -10
- data/lib/playwright_api/web_socket.rb +10 -1
- data/lib/playwright_api/worker.rb +13 -13
- metadata +16 -7
- data/lib/playwright/input_type.rb +0 -19
- data/lib/playwright/input_types/mouse.rb +0 -4
- data/lib/playwright/input_types/touchscreen.rb +0 -4
@@ -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)
|
@@ -144,6 +144,13 @@ module Playwright
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
+
def wait_for_selector(selector, state: nil, timeout: nil)
|
148
|
+
params = { selector: selector, state: state, timeout: timeout }.compact
|
149
|
+
resp = @channel.send_message_to_server('waitForSelector', params)
|
150
|
+
|
151
|
+
ChannelOwners::ElementHandle.from_nullable(resp)
|
152
|
+
end
|
153
|
+
|
147
154
|
def checked?(selector, timeout: nil)
|
148
155
|
params = { selector: selector, timeout: timeout }.compact
|
149
156
|
@channel.send_message_to_server('isChecked', params)
|
@@ -391,8 +398,20 @@ module Playwright
|
|
391
398
|
nil
|
392
399
|
end
|
393
400
|
|
394
|
-
def select_option(
|
395
|
-
|
401
|
+
def select_option(
|
402
|
+
selector,
|
403
|
+
element: nil,
|
404
|
+
index: nil,
|
405
|
+
value: nil,
|
406
|
+
label: nil,
|
407
|
+
noWaitAfter: nil,
|
408
|
+
timeout: nil)
|
409
|
+
base_params = SelectOptionValues.new(
|
410
|
+
element: element,
|
411
|
+
index: index,
|
412
|
+
value: value,
|
413
|
+
label: label,
|
414
|
+
).as_params
|
396
415
|
params = base_params + { selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact
|
397
416
|
@channel.send_message_to_server('selectOption', params)
|
398
417
|
|
@@ -400,8 +419,8 @@ module Playwright
|
|
400
419
|
end
|
401
420
|
|
402
421
|
def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
|
403
|
-
|
404
|
-
params =
|
422
|
+
file_payloads = InputFiles.new(files).as_params
|
423
|
+
params = { files: file_payloads, selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact
|
405
424
|
@channel.send_message_to_server('setInputFiles', params)
|
406
425
|
|
407
426
|
nil
|
@@ -6,16 +6,24 @@ 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)
|
13
|
-
@keyboard =
|
14
|
-
@mouse =
|
15
|
-
@touchscreen =
|
16
|
-
|
17
|
-
|
13
|
+
@keyboard = KeyboardImpl.new(@channel)
|
14
|
+
@mouse = MouseImpl.new(@channel)
|
15
|
+
@touchscreen = TouchscreenImpl.new(@channel)
|
16
|
+
|
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
|
@@ -26,7 +34,19 @@ module Playwright
|
|
26
34
|
console_message = ChannelOwners::ConsoleMessage.from(params['message'])
|
27
35
|
emit(Events::Page::Console, console_message)
|
28
36
|
})
|
37
|
+
@channel.on('crash', ->(_) { emit(Events::Page::Crash) })
|
38
|
+
@channel.on('dialog', method(:on_dialog))
|
29
39
|
@channel.on('domcontentloaded', ->(_) { emit(Events::Page::DOMContentLoaded) })
|
40
|
+
@channel.on('download', ->(params) {
|
41
|
+
emit(Events::Page::Download, ChannelOwners::Download.from(params['download']))
|
42
|
+
})
|
43
|
+
@channel.on('fileChooser', ->(params) {
|
44
|
+
chooser = FileChooserImpl.new(
|
45
|
+
page: self,
|
46
|
+
element_handle: ChannelOwners::ElementHandle.from(params['element']),
|
47
|
+
is_multiple: params['isMultiple'])
|
48
|
+
emit(Events::Page::FileChooser, chooser)
|
49
|
+
})
|
30
50
|
@channel.on('frameAttached', ->(params) {
|
31
51
|
on_frame_attached(ChannelOwners::Frame.from(params['frame']))
|
32
52
|
})
|
@@ -34,9 +54,43 @@ module Playwright
|
|
34
54
|
on_frame_detached(ChannelOwners::Frame.from(params['frame']))
|
35
55
|
})
|
36
56
|
@channel.on('load', ->(_) { emit(Events::Page::Load) })
|
57
|
+
@channel.on('pageError', ->(params) {
|
58
|
+
emit(Events::Page::PageError, Error.parse(params['error']['error']))
|
59
|
+
})
|
37
60
|
@channel.on('popup', ->(params) {
|
38
61
|
emit(Events::Page::Popup, ChannelOwners::Page.from(params['page']))
|
39
62
|
})
|
63
|
+
@channel.on('request', ->(params) {
|
64
|
+
emit(Events::Page::Request, ChannelOwners::Request.from(params['request']))
|
65
|
+
})
|
66
|
+
@channel.on('requestFailed', ->(params) {
|
67
|
+
on_request_failed(
|
68
|
+
ChannelOwners::Request.from(params['request']),
|
69
|
+
params['responseEndTiming'],
|
70
|
+
params['failureText'],
|
71
|
+
)
|
72
|
+
})
|
73
|
+
@channel.on('requestFinished', ->(params) {
|
74
|
+
on_request_finished(
|
75
|
+
ChannelOwners::Request.from(params['request']),
|
76
|
+
params['responseEndTiming'],
|
77
|
+
)
|
78
|
+
})
|
79
|
+
@channel.on('response', ->(params) {
|
80
|
+
emit(Events::Page::Response, ChannelOwners::Response.from(params['response']))
|
81
|
+
})
|
82
|
+
@channel.on('route', ->(params) {
|
83
|
+
on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
|
84
|
+
})
|
85
|
+
@channel.on('video', ->(params) {
|
86
|
+
video.send(:update_relative_path, params['relativePath'])
|
87
|
+
})
|
88
|
+
@channel.on('webSocket', ->(params) {
|
89
|
+
emit(Events::Page::WebSocket, ChannelOwners::WebSocket.from(params['webSocket']))
|
90
|
+
})
|
91
|
+
@channel.on('worker', ->(params) {
|
92
|
+
on_worker(ChannelOwners::Worker.from(params['worker']))
|
93
|
+
})
|
40
94
|
end
|
41
95
|
|
42
96
|
attr_reader \
|
@@ -47,6 +101,17 @@ module Playwright
|
|
47
101
|
:viewport_size,
|
48
102
|
:main_frame
|
49
103
|
|
104
|
+
private def on_request_failed(request, response_end_timing, failure_text)
|
105
|
+
request.send(:update_failure_text, failure_text)
|
106
|
+
request.send(:update_response_end_timing, response_end_timing)
|
107
|
+
emit(Events::Page::RequestFailed, request)
|
108
|
+
end
|
109
|
+
|
110
|
+
private def on_request_finished(request, response_end_timing)
|
111
|
+
request.send(:update_response_end_timing, response_end_timing)
|
112
|
+
emit(Events::Page::RequestFinished, request)
|
113
|
+
end
|
114
|
+
|
50
115
|
private def on_frame_attached(frame)
|
51
116
|
frame.send(:update_page_from_page, self)
|
52
117
|
@frames << frame
|
@@ -59,12 +124,55 @@ module Playwright
|
|
59
124
|
emit(Events::Page::FrameDetached, frame)
|
60
125
|
end
|
61
126
|
|
127
|
+
private def on_route(route, request)
|
128
|
+
# It is not desired to use PlaywrightApi.wrap directly.
|
129
|
+
# However it is a little difficult to define wrapper for `handler` parameter in generate_api.
|
130
|
+
# Just a workaround...
|
131
|
+
wrapped_route = PlaywrightApi.wrap(route)
|
132
|
+
wrapped_request = PlaywrightApi.wrap(request)
|
133
|
+
|
134
|
+
if @routes.none? { |handler_entry| handler_entry.handle(wrapped_route, wrapped_request) }
|
135
|
+
@browser_context.send(:on_route, route, request)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
62
139
|
private def on_close
|
63
140
|
@closed = true
|
64
141
|
@browser_context.send(:remove_page, self)
|
65
142
|
emit(Events::Page::Close)
|
66
143
|
end
|
67
144
|
|
145
|
+
private def on_dialog(params)
|
146
|
+
dialog = ChannelOwners::Dialog.from(params['dialog'])
|
147
|
+
unless emit(Events::Page::Dialog, dialog)
|
148
|
+
dialog.dismiss
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# @override
|
153
|
+
def on(event, callback)
|
154
|
+
if event == Events::Page::FileChooser && listener_count(event) == 0
|
155
|
+
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
|
156
|
+
end
|
157
|
+
super
|
158
|
+
end
|
159
|
+
|
160
|
+
# @override
|
161
|
+
def once(event, callback)
|
162
|
+
if event == Events::Page::FileChooser && listener_count(event) == 0
|
163
|
+
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
|
164
|
+
end
|
165
|
+
super
|
166
|
+
end
|
167
|
+
|
168
|
+
# @override
|
169
|
+
def off(event, callback)
|
170
|
+
super
|
171
|
+
if event == Events::Page::FileChooser && listener_count(event) == 0
|
172
|
+
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: false)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
68
176
|
def context
|
69
177
|
@browser_context
|
70
178
|
end
|
@@ -74,14 +182,7 @@ module Playwright
|
|
74
182
|
ChannelOwners::Page.from(resp)
|
75
183
|
end
|
76
184
|
|
77
|
-
def frame(
|
78
|
-
name, url =
|
79
|
-
if frameSelector.is_a?(Hash)
|
80
|
-
[frameSelector[:name], frameSelector[:url]]
|
81
|
-
else
|
82
|
-
[frameSelector, nil]
|
83
|
-
end
|
84
|
-
|
185
|
+
def frame(name: nil, url: nil)
|
85
186
|
if name
|
86
187
|
@frames.find { |f| f.name == name }
|
87
188
|
elsif url
|
@@ -121,6 +222,38 @@ module Playwright
|
|
121
222
|
@main_frame.query_selector_all(selector)
|
122
223
|
end
|
123
224
|
|
225
|
+
def wait_for_selector(selector, state: nil, timeout: nil)
|
226
|
+
@main_frame.wait_for_selector(selector, state: state, timeout: timeout)
|
227
|
+
end
|
228
|
+
|
229
|
+
def checked?(selector, timeout: nil)
|
230
|
+
@main_frame.checked?(selector, timeout: timeout)
|
231
|
+
end
|
232
|
+
|
233
|
+
def disabled?(selector, timeout: nil)
|
234
|
+
@main_frame.disabled?(selector, timeout: timeout)
|
235
|
+
end
|
236
|
+
|
237
|
+
def editable?(selector, timeout: nil)
|
238
|
+
@main_frame.editable?(selector, timeout: timeout)
|
239
|
+
end
|
240
|
+
|
241
|
+
def enabled?(selector, timeout: nil)
|
242
|
+
@main_frame.enabled?(selector, timeout: timeout)
|
243
|
+
end
|
244
|
+
|
245
|
+
def hidden?(selector, timeout: nil)
|
246
|
+
@main_frame.hidden?(selector, timeout: timeout)
|
247
|
+
end
|
248
|
+
|
249
|
+
def visible?(selector, timeout: nil)
|
250
|
+
@main_frame.visible?(selector, timeout: timeout)
|
251
|
+
end
|
252
|
+
|
253
|
+
def dispatch_event(selector, type, eventInit: nil, timeout: nil)
|
254
|
+
@main_frame.dispatch_event(selector, type, eventInit: eventInit, timeout: timeout)
|
255
|
+
end
|
256
|
+
|
124
257
|
def evaluate(pageFunction, arg: nil)
|
125
258
|
@main_frame.evaluate(pageFunction, arg: arg)
|
126
259
|
end
|
@@ -145,6 +278,25 @@ module Playwright
|
|
145
278
|
@main_frame.add_style_tag(content: content, path: path, url: url)
|
146
279
|
end
|
147
280
|
|
281
|
+
def expose_function(name, callback)
|
282
|
+
@channel.send_message_to_server('exposeBinding', name: name)
|
283
|
+
@bindings[name] = ->(_source, *args) { callback.call(*args) }
|
284
|
+
end
|
285
|
+
|
286
|
+
def expose_binding(name, callback, handle: nil)
|
287
|
+
params = {
|
288
|
+
name: name,
|
289
|
+
needsHandle: handle,
|
290
|
+
}.compact
|
291
|
+
@channel.send_message_to_server('exposeBinding', params)
|
292
|
+
@bindings[name] = callback
|
293
|
+
end
|
294
|
+
|
295
|
+
def set_extra_http_headers(headers)
|
296
|
+
serialized_headers = HttpHeaders.new(headers).as_serialized
|
297
|
+
@channel.send_message_to_server('setExtraHTTPHeaders', headers: serialized_headers)
|
298
|
+
end
|
299
|
+
|
148
300
|
def url
|
149
301
|
@main_frame.url
|
150
302
|
end
|
@@ -174,12 +326,70 @@ module Playwright
|
|
174
326
|
@main_frame.wait_for_load_state(state: state, timeout: timeout)
|
175
327
|
end
|
176
328
|
|
329
|
+
def go_back(timeout: nil, waitUntil: nil)
|
330
|
+
params = { timeout: timeout, waitUntil: waitUntil }.compact
|
331
|
+
resp = @channel.send_message_to_server('goBack', params)
|
332
|
+
ChannelOwners::Response.from_nullable(resp)
|
333
|
+
end
|
334
|
+
|
335
|
+
def go_forward(timeout: nil, waitUntil: nil)
|
336
|
+
params = { timeout: timeout, waitUntil: waitUntil }.compact
|
337
|
+
resp = @channel.send_message_to_server('goForward', params)
|
338
|
+
ChannelOwners::Response.from_nullable(resp)
|
339
|
+
end
|
340
|
+
|
341
|
+
def emulate_media(colorScheme: nil, media: nil)
|
342
|
+
params = {
|
343
|
+
colorScheme: colorScheme,
|
344
|
+
media: media,
|
345
|
+
}.compact
|
346
|
+
@channel.send_message_to_server('emulateMedia', params)
|
347
|
+
|
348
|
+
nil
|
349
|
+
end
|
350
|
+
|
177
351
|
def set_viewport_size(viewportSize)
|
178
352
|
@viewport_size = viewportSize
|
179
353
|
@channel.send_message_to_server('setViewportSize', { viewportSize: viewportSize })
|
180
354
|
nil
|
181
355
|
end
|
182
356
|
|
357
|
+
def bring_to_front
|
358
|
+
@channel.send_message_to_server('bringToFront')
|
359
|
+
nil
|
360
|
+
end
|
361
|
+
|
362
|
+
def add_init_script(path: nil, script: nil)
|
363
|
+
source =
|
364
|
+
if path
|
365
|
+
File.read(path)
|
366
|
+
elsif script
|
367
|
+
script
|
368
|
+
else
|
369
|
+
raise ArgumentError.new('Either path or script parameter must be specified')
|
370
|
+
end
|
371
|
+
|
372
|
+
@channel.send_message_to_server('addInitScript', source: script)
|
373
|
+
nil
|
374
|
+
end
|
375
|
+
|
376
|
+
def route(url, handler)
|
377
|
+
entry = RouteHandlerEntry.new(url, handler)
|
378
|
+
@routes << entry
|
379
|
+
if @routes.count >= 1
|
380
|
+
@channel.send_message_to_server('setNetworkInterceptionEnabled', enabled: true)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def unroute(url, handler: nil)
|
385
|
+
@routes.reject! do |handler_entry|
|
386
|
+
handler_entry.same_value?(url: url, handler: handler)
|
387
|
+
end
|
388
|
+
if @routes.count == 0
|
389
|
+
@channel.send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
183
393
|
def screenshot(
|
184
394
|
path: nil,
|
185
395
|
type: nil,
|
@@ -269,6 +479,23 @@ module Playwright
|
|
269
479
|
)
|
270
480
|
end
|
271
481
|
|
482
|
+
def tap_point(
|
483
|
+
selector,
|
484
|
+
force: nil,
|
485
|
+
modifiers: nil,
|
486
|
+
noWaitAfter: nil,
|
487
|
+
position: nil,
|
488
|
+
timeout: nil)
|
489
|
+
@main_frame.tap_point(
|
490
|
+
selector,
|
491
|
+
force: force,
|
492
|
+
modifiers: modifiers,
|
493
|
+
noWaitAfter: noWaitAfter,
|
494
|
+
position: position,
|
495
|
+
timeout: timeout,
|
496
|
+
)
|
497
|
+
end
|
498
|
+
|
272
499
|
def fill(selector, value, noWaitAfter: nil, timeout: nil)
|
273
500
|
@main_frame.fill(selector, value, noWaitAfter: noWaitAfter, timeout: timeout)
|
274
501
|
end
|
@@ -277,6 +504,60 @@ module Playwright
|
|
277
504
|
@main_frame.focus(selector, timeout: timeout)
|
278
505
|
end
|
279
506
|
|
507
|
+
def text_content(selector, timeout: nil)
|
508
|
+
@main_frame.text_content(selector, timeout: timeout)
|
509
|
+
end
|
510
|
+
|
511
|
+
def inner_text(selector, timeout: nil)
|
512
|
+
@main_frame.inner_text(selector, timeout: timeout)
|
513
|
+
end
|
514
|
+
|
515
|
+
def inner_html(selector, timeout: nil)
|
516
|
+
@main_frame.inner_html(selector, timeout: timeout)
|
517
|
+
end
|
518
|
+
|
519
|
+
def get_attribute(selector, name, timeout: nil)
|
520
|
+
@main_frame.get_attribute(selector, name, timeout: timeout)
|
521
|
+
end
|
522
|
+
|
523
|
+
def hover(
|
524
|
+
selector,
|
525
|
+
force: nil,
|
526
|
+
modifiers: nil,
|
527
|
+
position: nil,
|
528
|
+
timeout: nil)
|
529
|
+
@main_frame.hover(
|
530
|
+
selector,
|
531
|
+
force: force,
|
532
|
+
modifiers: modifiers,
|
533
|
+
position: position,
|
534
|
+
timeout: timeout,
|
535
|
+
)
|
536
|
+
end
|
537
|
+
|
538
|
+
def select_option(
|
539
|
+
selector,
|
540
|
+
element: nil,
|
541
|
+
index: nil,
|
542
|
+
value: nil,
|
543
|
+
label: nil,
|
544
|
+
noWaitAfter: nil,
|
545
|
+
timeout: nil)
|
546
|
+
@main_frame.select_option(
|
547
|
+
selector,
|
548
|
+
element: element,
|
549
|
+
index: index,
|
550
|
+
value: value,
|
551
|
+
label: label,
|
552
|
+
noWaitAfter: noWaitAfter,
|
553
|
+
timeout: timeout,
|
554
|
+
)
|
555
|
+
end
|
556
|
+
|
557
|
+
def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
|
558
|
+
@main_frame.set_input_files(selector, files, noWaitAfter: noWaitAfter, timeout: timeout)
|
559
|
+
end
|
560
|
+
|
280
561
|
def type(
|
281
562
|
selector,
|
282
563
|
text,
|
@@ -297,10 +578,57 @@ module Playwright
|
|
297
578
|
@main_frame.press(selector, key, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout)
|
298
579
|
end
|
299
580
|
|
581
|
+
def check(selector, force: nil, noWaitAfter: nil, timeout: nil)
|
582
|
+
@main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
|
583
|
+
end
|
584
|
+
|
585
|
+
def uncheck(selector, force: nil, noWaitAfter: nil, timeout: nil)
|
586
|
+
@main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, timeout: timeout)
|
587
|
+
end
|
588
|
+
|
300
589
|
def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
|
301
590
|
@main_frame.wait_for_function(pageFunction, arg: arg, polling: polling, timeout: timeout)
|
302
591
|
end
|
303
592
|
|
593
|
+
def pdf(
|
594
|
+
displayHeaderFooter: nil,
|
595
|
+
footerTemplate: nil,
|
596
|
+
format: nil,
|
597
|
+
headerTemplate: nil,
|
598
|
+
height: nil,
|
599
|
+
landscape: nil,
|
600
|
+
margin: nil,
|
601
|
+
pageRanges: nil,
|
602
|
+
path: nil,
|
603
|
+
preferCSSPageSize: nil,
|
604
|
+
printBackground: nil,
|
605
|
+
scale: nil,
|
606
|
+
width: nil)
|
607
|
+
|
608
|
+
params = {
|
609
|
+
displayHeaderFooter: displayHeaderFooter,
|
610
|
+
footerTemplate: footerTemplate,
|
611
|
+
format: format,
|
612
|
+
headerTemplate: headerTemplate,
|
613
|
+
height: height,
|
614
|
+
landscape: landscape,
|
615
|
+
margin: margin,
|
616
|
+
pageRanges: pageRanges,
|
617
|
+
preferCSSPageSize: preferCSSPageSize,
|
618
|
+
printBackground: printBackground,
|
619
|
+
scale: scale,
|
620
|
+
width: width,
|
621
|
+
}.compact
|
622
|
+
encoded_binary = @channel.send_message_to_server('pdf', params)
|
623
|
+
decoded_binary = Base64.strict_decode64(encoded_binary)
|
624
|
+
if path
|
625
|
+
File.open(path, 'wb') do |f|
|
626
|
+
f.write(decoded_binary)
|
627
|
+
end
|
628
|
+
end
|
629
|
+
decoded_binary
|
630
|
+
end
|
631
|
+
|
304
632
|
class CrashedError < StandardError
|
305
633
|
def initialize
|
306
634
|
super('Page crashed')
|
@@ -319,20 +647,9 @@ module Playwright
|
|
319
647
|
end
|
320
648
|
end
|
321
649
|
|
322
|
-
def expect_event(event,
|
323
|
-
predicate, timeout =
|
324
|
-
case optionsOrPredicate
|
325
|
-
when Proc
|
326
|
-
[optionsOrPredicate, nil]
|
327
|
-
when Hash
|
328
|
-
[optionsOrPredicate[:predicate], optionsOrPredicate[:timeout]]
|
329
|
-
else
|
330
|
-
[nil, nil]
|
331
|
-
end
|
332
|
-
timeout ||= @timeout_settings.timeout
|
333
|
-
|
650
|
+
def expect_event(event, predicate: nil, timeout: nil, &block)
|
334
651
|
wait_helper = WaitHelper.new
|
335
|
-
wait_helper.reject_on_timeout(timeout, "Timeout while waiting for event \"#{event}\"")
|
652
|
+
wait_helper.reject_on_timeout(timeout || @timeout_settings.timeout, "Timeout while waiting for event \"#{event}\"")
|
336
653
|
|
337
654
|
unless event == Events::Page::Crash
|
338
655
|
wait_helper.reject_on_event(self, Events::Page::Crash, CrashedError.new)
|
@@ -349,6 +666,18 @@ module Playwright
|
|
349
666
|
wait_helper.promise.value!
|
350
667
|
end
|
351
668
|
|
669
|
+
def expect_console_message(predicate: nil, timeout: nil, &block)
|
670
|
+
expect_event(Events::Page::Console, predicate: predicate, timeout: timeout, &block)
|
671
|
+
end
|
672
|
+
|
673
|
+
def expect_download(predicate: nil, timeout: nil, &block)
|
674
|
+
expect_event(Events::Page::Download, predicate: predicate, timeout: timeout, &block)
|
675
|
+
end
|
676
|
+
|
677
|
+
def expect_file_chooser(predicate: nil, timeout: nil, &block)
|
678
|
+
expect_event(Events::Page::FileChooser, predicate: predicate, timeout: timeout, &block)
|
679
|
+
end
|
680
|
+
|
352
681
|
def expect_navigation(timeout: nil, url: nil, waitUntil: nil, &block)
|
353
682
|
@main_frame.expect_navigation(
|
354
683
|
timeout: timeout,
|
@@ -357,6 +686,10 @@ module Playwright
|
|
357
686
|
&block)
|
358
687
|
end
|
359
688
|
|
689
|
+
def expect_popup(predicate: nil, timeout: nil, &block)
|
690
|
+
expect_event(Events::Page::Popup, predicate: predicate, timeout: timeout, &block)
|
691
|
+
end
|
692
|
+
|
360
693
|
def expect_request(urlOrPredicate, timeout: nil)
|
361
694
|
predicate =
|
362
695
|
case urlOrPredicate
|
@@ -369,7 +702,7 @@ module Playwright
|
|
369
702
|
-> (_) { true }
|
370
703
|
end
|
371
704
|
|
372
|
-
expect_event(Events::Page::Request,
|
705
|
+
expect_event(Events::Page::Request, predicate: predicate, timeout: timeout)
|
373
706
|
end
|
374
707
|
|
375
708
|
def expect_response(urlOrPredicate, timeout: nil)
|
@@ -384,7 +717,7 @@ module Playwright
|
|
384
717
|
-> (_) { true }
|
385
718
|
end
|
386
719
|
|
387
|
-
expect_event(Events::Page::Response,
|
720
|
+
expect_event(Events::Page::Response, predicate: predicate, timeout: timeout)
|
388
721
|
end
|
389
722
|
|
390
723
|
# called from BrowserContext#on_page with send(:update_browser_context, page), so keep private.
|
@@ -397,5 +730,10 @@ module Playwright
|
|
397
730
|
private def timeout_settings
|
398
731
|
@timeout_settings
|
399
732
|
end
|
733
|
+
|
734
|
+
# called from BrowserContext#expose_binding
|
735
|
+
private def has_bindings?(name)
|
736
|
+
@bindings.key?(name)
|
737
|
+
end
|
400
738
|
end
|
401
739
|
end
|