playwright-ruby-client 1.20.2 → 1.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/documentation/docs/api/api_request_context.md +15 -2
- data/documentation/docs/api/browser.md +16 -0
- data/documentation/docs/api/browser_context.md +15 -2
- data/documentation/docs/api/browser_type.md +5 -1
- data/documentation/docs/api/console_message.md +27 -1
- data/documentation/docs/api/element_handle.md +23 -13
- data/documentation/docs/api/experimental/android.md +1 -1
- data/documentation/docs/api/experimental/android_device.md +4 -0
- data/documentation/docs/api/file_chooser.md +1 -1
- data/documentation/docs/api/frame.md +12 -5
- data/documentation/docs/api/frame_locator.md +1 -1
- data/documentation/docs/api/locator.md +44 -13
- data/documentation/docs/api/page.md +32 -9
- data/documentation/docs/api/request.md +3 -1
- data/documentation/docs/api/response.md +12 -1
- data/documentation/docs/api/route.md +67 -0
- data/documentation/docs/include/api_coverage.md +6 -3
- data/documentation/package.json +6 -6
- data/documentation/yarn.lock +2931 -3220
- data/lib/playwright/channel.rb +1 -3
- data/lib/playwright/channel_owners/browser.rb +13 -0
- data/lib/playwright/channel_owners/browser_context.rb +89 -13
- data/lib/playwright/channel_owners/browser_type.rb +4 -0
- data/lib/playwright/channel_owners/element_handle.rb +12 -3
- data/lib/playwright/channel_owners/frame.rb +20 -7
- data/lib/playwright/channel_owners/local_utils.rb +29 -0
- data/lib/playwright/channel_owners/page.rb +54 -22
- data/lib/playwright/channel_owners/request.rb +31 -6
- data/lib/playwright/channel_owners/response.rb +6 -0
- data/lib/playwright/channel_owners/route.rb +104 -45
- data/lib/playwright/channel_owners/writable_stream.rb +14 -0
- data/lib/playwright/connection.rb +6 -1
- data/lib/playwright/har_router.rb +82 -0
- data/lib/playwright/http_headers.rb +1 -1
- data/lib/playwright/input_files.rb +60 -8
- data/lib/playwright/javascript/regex.rb +23 -0
- data/lib/playwright/javascript/value_parser.rb +17 -2
- data/lib/playwright/javascript/value_serializer.rb +16 -6
- data/lib/playwright/javascript/visitor_info.rb +26 -0
- data/lib/playwright/javascript.rb +1 -0
- data/lib/playwright/locator_impl.rb +18 -5
- data/lib/playwright/playwright_api.rb +26 -6
- data/lib/playwright/route_handler.rb +2 -6
- data/lib/playwright/transport.rb +12 -2
- data/lib/playwright/utils.rb +31 -6
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright.rb +2 -0
- data/lib/playwright_api/accessibility.rb +2 -1
- data/lib/playwright_api/android.rb +2 -2
- data/lib/playwright_api/android_device.rb +5 -1
- data/lib/playwright_api/api_request.rb +3 -3
- data/lib/playwright_api/api_request_context.rb +15 -2
- data/lib/playwright_api/browser.rb +15 -2
- data/lib/playwright_api/browser_context.rb +17 -7
- data/lib/playwright_api/browser_type.rb +7 -3
- data/lib/playwright_api/console_message.rb +20 -1
- data/lib/playwright_api/element_handle.rb +53 -49
- data/lib/playwright_api/file_chooser.rb +1 -1
- data/lib/playwright_api/frame.rb +30 -23
- data/lib/playwright_api/frame_locator.rb +1 -1
- data/lib/playwright_api/locator.rb +58 -38
- data/lib/playwright_api/page.rb +52 -32
- data/lib/playwright_api/playwright.rb +1 -1
- data/lib/playwright_api/request.rb +8 -1
- data/lib/playwright_api/response.rb +14 -1
- data/lib/playwright_api/route.rb +63 -2
- data/lib/playwright_api/selectors.rb +1 -1
- data/lib/playwright_api/tracing.rb +1 -1
- metadata +7 -4
- data/lib/playwright_api/local_utils.rb +0 -9
data/lib/playwright/channel.rb
CHANGED
@@ -37,13 +37,11 @@ module Playwright
|
|
37
37
|
|
38
38
|
# @param method [String]
|
39
39
|
# @param params [Hash]
|
40
|
-
# @returns
|
40
|
+
# @returns [Concurrent::Promises::Future]
|
41
41
|
def async_send_message_to_server(method, params = {})
|
42
42
|
with_logging do |metadata|
|
43
43
|
@connection.async_send_message_to_server(@guid, method, params, metadata: metadata)
|
44
44
|
end
|
45
|
-
|
46
|
-
nil
|
47
45
|
end
|
48
46
|
|
49
47
|
private def with_logging(&block)
|
@@ -5,6 +5,7 @@ module Playwright
|
|
5
5
|
include Utils::PrepareBrowserContextOptions
|
6
6
|
|
7
7
|
private def after_initialize
|
8
|
+
@browser_type = @parent
|
8
9
|
@connected = true
|
9
10
|
@closed_or_closing = false
|
10
11
|
@should_close_connection_on_close = false
|
@@ -17,6 +18,10 @@ module Playwright
|
|
17
18
|
@contexts.to_a
|
18
19
|
end
|
19
20
|
|
21
|
+
def browser_type
|
22
|
+
@browser_type
|
23
|
+
end
|
24
|
+
|
20
25
|
def connected?
|
21
26
|
@connected
|
22
27
|
end
|
@@ -30,6 +35,7 @@ module Playwright
|
|
30
35
|
@contexts << context
|
31
36
|
context.browser = self
|
32
37
|
context.options = params
|
38
|
+
context.send(:update_browser_type, @browser_type)
|
33
39
|
return context unless block
|
34
40
|
|
35
41
|
begin
|
@@ -54,6 +60,13 @@ module Playwright
|
|
54
60
|
end
|
55
61
|
end
|
56
62
|
|
63
|
+
private def update_browser_type(browser_type)
|
64
|
+
@browser_type = browser_type
|
65
|
+
@contexts.each do |context|
|
66
|
+
context.send(:update_browser_type, browser_type)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
57
70
|
def close
|
58
71
|
return if @closed_or_closing
|
59
72
|
@closed_or_closing = true
|
@@ -2,6 +2,8 @@ module Playwright
|
|
2
2
|
# @ref https://github.com/microsoft/playwright-python/blob/master/playwright/_impl/_browser_context.py
|
3
3
|
define_channel_owner :BrowserContext do
|
4
4
|
include Utils::Errors::SafeCloseError
|
5
|
+
include Utils::PrepareBrowserContextOptions
|
6
|
+
|
5
7
|
attr_accessor :browser
|
6
8
|
attr_writer :owner_page, :options
|
7
9
|
attr_reader :tracing, :request
|
@@ -17,12 +19,17 @@ module Playwright
|
|
17
19
|
|
18
20
|
@tracing = ChannelOwners::Tracing.from(@initializer['tracing'])
|
19
21
|
@request = ChannelOwners::APIRequestContext.from(@initializer['APIRequestContext'])
|
22
|
+
@har_recorders = {}
|
20
23
|
|
21
24
|
@channel.on('bindingCall', ->(params) { on_binding(ChannelOwners::BindingCall.from(params['binding'])) })
|
22
25
|
@channel.once('close', ->(_) { on_close })
|
23
26
|
@channel.on('page', ->(params) { on_page(ChannelOwners::Page.from(params['page']) )})
|
24
27
|
@channel.on('route', ->(params) {
|
25
|
-
|
28
|
+
Concurrent::Promises.future {
|
29
|
+
on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
|
30
|
+
}.rescue do |err|
|
31
|
+
puts err, err.backtrace
|
32
|
+
end
|
26
33
|
})
|
27
34
|
@channel.on('backgroundPage', ->(params) {
|
28
35
|
on_background_page(ChannelOwners::Page.from(params['page']))
|
@@ -55,6 +62,16 @@ module Playwright
|
|
55
62
|
@closed_promise = Concurrent::Promises.resolvable_future
|
56
63
|
end
|
57
64
|
|
65
|
+
private def update_browser_type(browser_type)
|
66
|
+
@browser_type = browser_type
|
67
|
+
if @options[:recordHar]
|
68
|
+
@har_recorders[''] = {
|
69
|
+
path: @options[:recordHar][:path],
|
70
|
+
content: @options[:recordHar][:content]
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
58
75
|
private def on_page(page)
|
59
76
|
@pages << page
|
60
77
|
emit(Events::BrowserContext::Page, page)
|
@@ -73,19 +90,29 @@ module Playwright
|
|
73
90
|
wrapped_route = PlaywrightApi.wrap(route)
|
74
91
|
wrapped_request = PlaywrightApi.wrap(request)
|
75
92
|
|
76
|
-
|
77
|
-
|
93
|
+
handled = @routes.any? do |handler_entry|
|
94
|
+
next false unless handler_entry.match?(request.url)
|
95
|
+
|
96
|
+
promise = Concurrent::Promises.resolvable_future
|
97
|
+
route.send(:set_handling_future, promise)
|
98
|
+
|
99
|
+
promise_handled = Concurrent::Promises.zip(
|
100
|
+
promise,
|
101
|
+
handler_entry.async_handle(wrapped_route, wrapped_request)
|
102
|
+
).value!.first
|
103
|
+
|
104
|
+
promise_handled
|
78
105
|
end
|
79
106
|
|
80
|
-
|
81
|
-
|
107
|
+
@routes.reject!(&:expired?)
|
108
|
+
if @routes.count == 0
|
109
|
+
@channel.async_send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
110
|
+
end
|
82
111
|
|
83
|
-
|
84
|
-
|
85
|
-
|
112
|
+
unless handled
|
113
|
+
route.send(:async_continue_route).rescue do |err|
|
114
|
+
puts err, err.backtrace
|
86
115
|
end
|
87
|
-
else
|
88
|
-
route.continue
|
89
116
|
end
|
90
117
|
end
|
91
118
|
|
@@ -266,6 +293,37 @@ module Playwright
|
|
266
293
|
end
|
267
294
|
end
|
268
295
|
|
296
|
+
private def record_into_har(har, page, notFound:, url:)
|
297
|
+
params = {
|
298
|
+
options: prepare_record_har_options(
|
299
|
+
record_har_path: har,
|
300
|
+
record_har_content: "attach",
|
301
|
+
record_har_mode: "minimal",
|
302
|
+
record_har_url_filter: url,
|
303
|
+
)
|
304
|
+
}
|
305
|
+
if page
|
306
|
+
params[:page] = page.channel
|
307
|
+
end
|
308
|
+
har_id = @channel.send_message_to_server('harStart', params)
|
309
|
+
@har_recorders[har_id] = { path: har, content: 'attach' }
|
310
|
+
end
|
311
|
+
|
312
|
+
def route_from_har(har, notFound: nil, update: nil, url: nil)
|
313
|
+
if update
|
314
|
+
record_into_har(har, nil, notFound: notFound, url: url)
|
315
|
+
return
|
316
|
+
end
|
317
|
+
|
318
|
+
router = HarRouter.create(
|
319
|
+
@connection.local_utils,
|
320
|
+
har.to_s,
|
321
|
+
notFound || "abort",
|
322
|
+
url_match: url,
|
323
|
+
)
|
324
|
+
router.add_context_route(self)
|
325
|
+
end
|
326
|
+
|
269
327
|
def expect_event(event, predicate: nil, timeout: nil, &block)
|
270
328
|
wait_helper = WaitHelper.new
|
271
329
|
wait_helper.reject_on_timeout(timeout || @timeout_settings.timeout, "Timeout while waiting for event \"#{event}\"")
|
@@ -283,9 +341,19 @@ module Playwright
|
|
283
341
|
end
|
284
342
|
|
285
343
|
def close
|
286
|
-
|
287
|
-
har = ChannelOwners::Artifact.from(@channel.send_message_to_server('harExport'))
|
288
|
-
|
344
|
+
@har_recorders.each do |har_id, params|
|
345
|
+
har = ChannelOwners::Artifact.from(@channel.send_message_to_server('harExport', harId: har_id))
|
346
|
+
# Server side will compress artifact if content is attach or if file is .zip.
|
347
|
+
compressed = params[:content] == "attach" || params[:path].end_with?('.zip')
|
348
|
+
need_comppressed = params[:path].end_with?('.zip')
|
349
|
+
if compressed && !need_comppressed
|
350
|
+
tmp_path = "#{params[:path]}.tmp"
|
351
|
+
har.save_as(tmp_path)
|
352
|
+
@connection.local_utils.har_unzip(tmp_path, params[:path])
|
353
|
+
else
|
354
|
+
har.save_as(params[:path])
|
355
|
+
end
|
356
|
+
|
289
357
|
har.delete
|
290
358
|
end
|
291
359
|
@channel.send_message_to_server('close')
|
@@ -367,5 +435,13 @@ module Playwright
|
|
367
435
|
private def base_url
|
368
436
|
@options[:baseURL]
|
369
437
|
end
|
438
|
+
|
439
|
+
# called from InputFiles
|
440
|
+
# @param name [string]
|
441
|
+
# @return [WritableStream]
|
442
|
+
private def create_temp_file(name)
|
443
|
+
result = @channel.send_message_to_server('createTempFile', name: name)
|
444
|
+
ChannelOwners::WritableStream.from(result)
|
445
|
+
end
|
370
446
|
end
|
371
447
|
end
|
@@ -13,6 +13,7 @@ module Playwright
|
|
13
13
|
def launch(options, &block)
|
14
14
|
resp = @channel.send_message_to_server('launch', options.compact)
|
15
15
|
browser = ChannelOwners::Browser.from(resp)
|
16
|
+
browser.send(:update_browser_type, self)
|
16
17
|
return browser unless block
|
17
18
|
|
18
19
|
begin
|
@@ -29,6 +30,8 @@ module Playwright
|
|
29
30
|
|
30
31
|
resp = @channel.send_message_to_server('launchPersistentContext', params.compact)
|
31
32
|
context = ChannelOwners::Browser.from(resp)
|
33
|
+
context.options = params
|
34
|
+
context.send(:update_browser_type, self)
|
32
35
|
return context unless block
|
33
36
|
|
34
37
|
begin
|
@@ -54,6 +57,7 @@ module Playwright
|
|
54
57
|
|
55
58
|
result = @channel.send_message_to_server_result('connectOverCDP', params)
|
56
59
|
browser = ChannelOwners::Browser.from(result['browser'])
|
60
|
+
browser.send(:update_browser_type, self)
|
57
61
|
|
58
62
|
if result['defaultContext']
|
59
63
|
context = ChannelOwners::BrowserContext.from(result['defaultContext'])
|
@@ -205,9 +205,14 @@ module Playwright
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def set_input_files(files, noWaitAfter: nil, timeout: nil)
|
208
|
-
|
209
|
-
|
210
|
-
|
208
|
+
frame = owner_frame
|
209
|
+
unless frame
|
210
|
+
raise 'Cannot set input files to detached element'
|
211
|
+
end
|
212
|
+
|
213
|
+
method_name, params = InputFiles.new(frame.page.context, files).as_method_and_params
|
214
|
+
params.merge!({ noWaitAfter: noWaitAfter, timeout: timeout }.compact)
|
215
|
+
@channel.send_message_to_server(method_name, params)
|
211
216
|
|
212
217
|
nil
|
213
218
|
end
|
@@ -282,18 +287,22 @@ module Playwright
|
|
282
287
|
|
283
288
|
def screenshot(
|
284
289
|
animations: nil,
|
290
|
+
caret: nil,
|
285
291
|
mask: nil,
|
286
292
|
omitBackground: nil,
|
287
293
|
path: nil,
|
288
294
|
quality: nil,
|
295
|
+
scale: nil,
|
289
296
|
timeout: nil,
|
290
297
|
type: nil)
|
291
298
|
|
292
299
|
params = {
|
293
300
|
animations: animations,
|
301
|
+
caret: caret,
|
294
302
|
omitBackground: omitBackground,
|
295
303
|
path: path,
|
296
304
|
quality: quality,
|
305
|
+
scale: scale,
|
297
306
|
timeout: timeout,
|
298
307
|
type: type,
|
299
308
|
}.compact
|
@@ -25,11 +25,25 @@ module Playwright
|
|
25
25
|
private def on_load_state(add:, remove:)
|
26
26
|
if add
|
27
27
|
@load_states << add
|
28
|
-
|
28
|
+
|
29
|
+
# Original JS version of Playwright emit event here.
|
30
|
+
# @event_emitter.emit('loadstate', add)
|
29
31
|
end
|
30
32
|
if remove
|
31
33
|
@load_states.delete(remove)
|
32
34
|
end
|
35
|
+
unless @parent_frame
|
36
|
+
if add == 'load'
|
37
|
+
@page&.emit(Events::Page::Load, @page)
|
38
|
+
elsif add == 'domcontentloaded'
|
39
|
+
@page&.emit(Events::Page::DOMContentLoaded, @page)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# emit to waitForLoadState(load) listeners explicitly after waitForEvent(load) listeners
|
44
|
+
if add
|
45
|
+
@event_emitter.emit('loadstate', add)
|
46
|
+
end
|
33
47
|
end
|
34
48
|
|
35
49
|
private def on_frame_navigated(event)
|
@@ -38,7 +52,7 @@ module Playwright
|
|
38
52
|
@event_emitter.emit('navigated', event)
|
39
53
|
|
40
54
|
unless event['error']
|
41
|
-
@page&.emit(
|
55
|
+
@page&.emit(Events::Page::FrameNavigated, self)
|
42
56
|
end
|
43
57
|
end
|
44
58
|
|
@@ -487,15 +501,14 @@ module Playwright
|
|
487
501
|
end
|
488
502
|
|
489
503
|
def set_input_files(selector, files, noWaitAfter: nil, strict: nil, timeout: nil)
|
490
|
-
|
491
|
-
params
|
492
|
-
files: file_payloads,
|
504
|
+
method_name, params = InputFiles.new(page.context, files).as_method_and_params
|
505
|
+
params.merge!({
|
493
506
|
selector: selector,
|
494
507
|
noWaitAfter: noWaitAfter,
|
495
508
|
strict: strict,
|
496
509
|
timeout: timeout,
|
497
|
-
}.compact
|
498
|
-
@channel.send_message_to_server(
|
510
|
+
}.compact)
|
511
|
+
@channel.send_message_to_server(method_name, params)
|
499
512
|
|
500
513
|
nil
|
501
514
|
end
|
@@ -10,5 +10,34 @@ module Playwright
|
|
10
10
|
@channel.send_message_to_server('zip', params)
|
11
11
|
nil
|
12
12
|
end
|
13
|
+
|
14
|
+
|
15
|
+
# @param file [String]
|
16
|
+
# @return [String] har ID
|
17
|
+
def har_open(file)
|
18
|
+
@channel.send_message_to_server('harOpen', file: file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def har_lookup(har_id:, url:, method:, headers:, is_navigation_request:, post_data: nil)
|
22
|
+
params = {
|
23
|
+
harId: har_id,
|
24
|
+
url: url,
|
25
|
+
method: method,
|
26
|
+
headers: headers,
|
27
|
+
postData: post_data,
|
28
|
+
isNavigationRequest: is_navigation_request,
|
29
|
+
}.compact
|
30
|
+
|
31
|
+
@channel.send_message_to_server_result('harLookup', params)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param har_id [String]
|
35
|
+
def async_har_close(har_id)
|
36
|
+
@channel.async_send_message_to_server('harClose', harId: har_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def har_unzip(zip_file, har_file)
|
40
|
+
@channel.send_message_to_server('harUnzip', zipFile: zip_file, harFile: har_file)
|
41
|
+
end
|
13
42
|
end
|
14
43
|
end
|
@@ -39,7 +39,6 @@ module Playwright
|
|
39
39
|
})
|
40
40
|
@channel.on('crash', ->(_) { emit(Events::Page::Crash) })
|
41
41
|
@channel.on('dialog', method(:on_dialog))
|
42
|
-
@channel.on('domcontentloaded', ->(_) { emit(Events::Page::DOMContentLoaded) })
|
43
42
|
@channel.on('download', method(:on_download))
|
44
43
|
@channel.on('fileChooser', ->(params) {
|
45
44
|
chooser = FileChooserImpl.new(
|
@@ -54,12 +53,15 @@ module Playwright
|
|
54
53
|
@channel.on('frameDetached', ->(params) {
|
55
54
|
on_frame_detached(ChannelOwners::Frame.from(params['frame']))
|
56
55
|
})
|
57
|
-
@channel.on('load', ->(_) { emit(Events::Page::Load) })
|
58
56
|
@channel.on('pageError', ->(params) {
|
59
57
|
emit(Events::Page::PageError, Error.parse(params['error']['error']))
|
60
58
|
})
|
61
59
|
@channel.on('route', ->(params) {
|
62
|
-
|
60
|
+
Concurrent::Promises.future {
|
61
|
+
on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
|
62
|
+
}.rescue do |err|
|
63
|
+
puts err, err.backtrace
|
64
|
+
end
|
63
65
|
})
|
64
66
|
@channel.on('video', method(:on_video))
|
65
67
|
@channel.on('webSocket', ->(params) {
|
@@ -98,18 +100,26 @@ module Playwright
|
|
98
100
|
wrapped_route = PlaywrightApi.wrap(route)
|
99
101
|
wrapped_request = PlaywrightApi.wrap(request)
|
100
102
|
|
101
|
-
|
102
|
-
|
103
|
+
handled = @routes.any? do |handler_entry|
|
104
|
+
next false unless handler_entry.match?(request.url)
|
105
|
+
|
106
|
+
promise = Concurrent::Promises.resolvable_future
|
107
|
+
route.send(:set_handling_future, promise)
|
108
|
+
|
109
|
+
promise_handled = Concurrent::Promises.zip(
|
110
|
+
promise,
|
111
|
+
handler_entry.async_handle(wrapped_route, wrapped_request)
|
112
|
+
).value!.first
|
113
|
+
|
114
|
+
promise_handled
|
103
115
|
end
|
104
116
|
|
105
|
-
|
106
|
-
|
117
|
+
@routes.reject!(&:expired?)
|
118
|
+
if @routes.count == 0
|
119
|
+
@channel.async_send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
120
|
+
end
|
107
121
|
|
108
|
-
|
109
|
-
if @routes.count == 0
|
110
|
-
@channel.async_send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
111
|
-
end
|
112
|
-
else
|
122
|
+
unless handled
|
113
123
|
@browser_context.send(:on_route, route, request)
|
114
124
|
end
|
115
125
|
end
|
@@ -407,16 +417,33 @@ module Playwright
|
|
407
417
|
end
|
408
418
|
end
|
409
419
|
|
420
|
+
def route_from_har(har, notFound: nil, update: nil, url: nil)
|
421
|
+
if update
|
422
|
+
@browser_context.send(:record_into_har, har, self, notFound: notFound, url: url)
|
423
|
+
return
|
424
|
+
end
|
425
|
+
|
426
|
+
router = HarRouter.create(
|
427
|
+
@connection.local_utils,
|
428
|
+
har.to_s,
|
429
|
+
notFound || "abort",
|
430
|
+
url_match: url,
|
431
|
+
)
|
432
|
+
router.add_page_route(self)
|
433
|
+
end
|
434
|
+
|
410
435
|
def screenshot(
|
411
|
-
path: nil,
|
412
|
-
type: nil,
|
413
|
-
quality: nil,
|
414
|
-
fullPage: nil,
|
415
|
-
clip: nil,
|
416
|
-
omitBackground: nil,
|
417
436
|
animations: nil,
|
437
|
+
caret: nil,
|
438
|
+
clip: nil,
|
439
|
+
fullPage: nil,
|
418
440
|
mask: nil,
|
419
|
-
|
441
|
+
omitBackground: nil,
|
442
|
+
path: nil,
|
443
|
+
quality: nil,
|
444
|
+
scale: nil,
|
445
|
+
timeout: nil,
|
446
|
+
type: nil)
|
420
447
|
|
421
448
|
params = {
|
422
449
|
type: type,
|
@@ -425,6 +452,8 @@ module Playwright
|
|
425
452
|
clip: clip,
|
426
453
|
omitBackground: omitBackground,
|
427
454
|
animations: animations,
|
455
|
+
caret: caret,
|
456
|
+
scale: scale,
|
428
457
|
timeout: timeout,
|
429
458
|
}.compact
|
430
459
|
if mask.is_a?(Enumerable)
|
@@ -447,9 +476,12 @@ module Playwright
|
|
447
476
|
end
|
448
477
|
|
449
478
|
def close(runBeforeUnload: nil)
|
450
|
-
|
451
|
-
|
452
|
-
|
479
|
+
if @owned_context
|
480
|
+
@owned_context.close
|
481
|
+
else
|
482
|
+
options = { runBeforeUnload: runBeforeUnload }.compact
|
483
|
+
@channel.send_message_to_server('close', options)
|
484
|
+
end
|
453
485
|
nil
|
454
486
|
rescue => err
|
455
487
|
raise unless safe_close_error?(err)
|
@@ -18,10 +18,24 @@ module Playwright
|
|
18
18
|
responseStart: -1,
|
19
19
|
responseEnd: -1,
|
20
20
|
}
|
21
|
+
@fallback_overrides = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
private def fallback_overrides
|
25
|
+
@fallback_overrides
|
26
|
+
end
|
27
|
+
|
28
|
+
def apply_fallback_overrides(overrides)
|
29
|
+
allowed_key = %i[url method headers postData]
|
30
|
+
overrides.each do |key, value|
|
31
|
+
raise ArgumentError.new("invalid key: #{key}") unless allowed_key.include?(key)
|
32
|
+
@fallback_overrides[key] = value
|
33
|
+
end
|
34
|
+
@fallback_overrides
|
21
35
|
end
|
22
36
|
|
23
37
|
def url
|
24
|
-
@initializer['url']
|
38
|
+
@fallback_overrides[:url] || @initializer['url']
|
25
39
|
end
|
26
40
|
|
27
41
|
def resource_type
|
@@ -29,7 +43,7 @@ module Playwright
|
|
29
43
|
end
|
30
44
|
|
31
45
|
def method
|
32
|
-
@initializer['method']
|
46
|
+
@fallback_overrides[:method] || @initializer['method']
|
33
47
|
end
|
34
48
|
|
35
49
|
def post_data
|
@@ -51,8 +65,11 @@ module Playwright
|
|
51
65
|
end
|
52
66
|
|
53
67
|
def post_data_buffer
|
54
|
-
|
55
|
-
|
68
|
+
if (override = @fallback_overrides[:postData])
|
69
|
+
return override
|
70
|
+
end
|
71
|
+
|
72
|
+
if (base64_content = @initializer['postData'])
|
56
73
|
Base64.strict_decode64(base64_content)
|
57
74
|
else
|
58
75
|
nil
|
@@ -79,12 +96,20 @@ module Playwright
|
|
79
96
|
attr_reader :redirected_from, :redirected_to, :timing
|
80
97
|
|
81
98
|
def headers
|
82
|
-
@
|
99
|
+
if (override = @fallback_overrides[:headers])
|
100
|
+
RawHeaders.new(HttpHeaders.new(override).as_serialized).headers
|
101
|
+
else
|
102
|
+
@provisional_headers.headers
|
103
|
+
end
|
83
104
|
end
|
84
105
|
|
85
106
|
# @return [RawHeaders|nil]
|
86
107
|
private def actual_headers
|
87
|
-
|
108
|
+
if (override = @fallback_overrides[:headers])
|
109
|
+
RawHeaders.new(HttpHeaders.new(override).as_serialized)
|
110
|
+
else
|
111
|
+
@actual_headers ||= raw_request_headers
|
112
|
+
end
|
88
113
|
end
|
89
114
|
|
90
115
|
private def raw_request_headers
|
@@ -52,6 +52,12 @@ module Playwright
|
|
52
52
|
RawHeaders.new(@channel.send_message_to_server('rawResponseHeaders'))
|
53
53
|
end
|
54
54
|
|
55
|
+
def from_service_worker
|
56
|
+
@initializer['fromServiceWorker']
|
57
|
+
end
|
58
|
+
|
59
|
+
alias_method :from_service_worker?, :from_service_worker
|
60
|
+
|
55
61
|
def all_headers
|
56
62
|
actual_headers.headers
|
57
63
|
end
|