playwright-ruby-client 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +21 -0
- data/README.md +49 -0
- data/Rakefile +3 -0
- data/bin/console +11 -0
- data/bin/setup +8 -0
- data/lib/playwright.rb +39 -0
- data/lib/playwright/channel.rb +28 -0
- data/lib/playwright/channel_owner.rb +80 -0
- data/lib/playwright/channel_owners/android.rb +3 -0
- data/lib/playwright/channel_owners/binding_call.rb +4 -0
- data/lib/playwright/channel_owners/browser.rb +80 -0
- data/lib/playwright/channel_owners/browser_context.rb +13 -0
- data/lib/playwright/channel_owners/browser_type.rb +26 -0
- data/lib/playwright/channel_owners/chromium_browser.rb +8 -0
- data/lib/playwright/channel_owners/chromium_browser_context.rb +8 -0
- data/lib/playwright/channel_owners/electron.rb +3 -0
- data/lib/playwright/channel_owners/firefox_browser.rb +8 -0
- data/lib/playwright/channel_owners/frame.rb +44 -0
- data/lib/playwright/channel_owners/page.rb +53 -0
- data/lib/playwright/channel_owners/playwright.rb +57 -0
- data/lib/playwright/channel_owners/request.rb +5 -0
- data/lib/playwright/channel_owners/response.rb +5 -0
- data/lib/playwright/channel_owners/selectors.rb +4 -0
- data/lib/playwright/channel_owners/webkit_browser.rb +8 -0
- data/lib/playwright/connection.rb +238 -0
- data/lib/playwright/errors.rb +35 -0
- data/lib/playwright/event_emitter.rb +62 -0
- data/lib/playwright/events.rb +86 -0
- data/lib/playwright/playwright_api.rb +75 -0
- data/lib/playwright/transport.rb +86 -0
- data/lib/playwright/version.rb +5 -0
- data/lib/playwright_api/accessibility.rb +39 -0
- data/lib/playwright_api/binding_call.rb +5 -0
- data/lib/playwright_api/browser.rb +123 -0
- data/lib/playwright_api/browser_context.rb +285 -0
- data/lib/playwright_api/browser_type.rb +144 -0
- data/lib/playwright_api/cdp_session.rb +34 -0
- data/lib/playwright_api/chromium_browser_context.rb +26 -0
- data/lib/playwright_api/console_message.rb +22 -0
- data/lib/playwright_api/dialog.rb +46 -0
- data/lib/playwright_api/download.rb +54 -0
- data/lib/playwright_api/element_handle.rb +361 -0
- data/lib/playwright_api/file_chooser.rb +31 -0
- data/lib/playwright_api/frame.rb +526 -0
- data/lib/playwright_api/js_handle.rb +69 -0
- data/lib/playwright_api/keyboard.rb +101 -0
- data/lib/playwright_api/mouse.rb +47 -0
- data/lib/playwright_api/page.rb +986 -0
- data/lib/playwright_api/playwright.rb +35 -0
- data/lib/playwright_api/request.rb +119 -0
- data/lib/playwright_api/response.rb +61 -0
- data/lib/playwright_api/route.rb +53 -0
- data/lib/playwright_api/selectors.rb +51 -0
- data/lib/playwright_api/touchscreen.rb +10 -0
- data/lib/playwright_api/video.rb +14 -0
- data/lib/playwright_api/web_socket.rb +21 -0
- data/lib/playwright_api/worker.rb +34 -0
- data/playwright.gemspec +35 -0
- metadata +216 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module Playwright
|
2
|
+
class Error < StandardError
|
3
|
+
# ref: https://github.com/microsoft/playwright-python/blob/0b4a980fed366c4c1dee9bfcdd72662d629fdc8d/playwright/_impl/_helper.py#L155
|
4
|
+
def self.parse(error_payload)
|
5
|
+
if error_payload['name'] == 'TimeoutError'
|
6
|
+
Playwright::TimeoutError.new(
|
7
|
+
message: error_payload['message'],
|
8
|
+
stack: error_payload['stack'].split("\n"),
|
9
|
+
)
|
10
|
+
else
|
11
|
+
new(
|
12
|
+
name: error_payload['name'],
|
13
|
+
message: error_payload['message'],
|
14
|
+
stack: error_payload['stack'].split("\n"),
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param name [String]
|
20
|
+
# @param message [String]
|
21
|
+
# @param stack [Array<String>]
|
22
|
+
def initialize(name:, message:, stack:)
|
23
|
+
super("#{name}: #{message}")
|
24
|
+
@name = name
|
25
|
+
@message = message
|
26
|
+
@stack = stack
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class TimeoutError < Error
|
31
|
+
def initialize(message:, stack:)
|
32
|
+
super(name: 'TimeoutError', message: message, stack: stack)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Playwright
|
2
|
+
class EventEmitterCallback
|
3
|
+
def initialize(callback_proc)
|
4
|
+
@proc = callback_proc
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(*args)
|
8
|
+
@proc.call(*args)
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class EventEmitterOnceCallback < EventEmitterCallback
|
14
|
+
def call(*args)
|
15
|
+
@__result ||= super
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# A subset of Events/EventEmitter in Node.js
|
22
|
+
module EventEmitter
|
23
|
+
# @param event [String]
|
24
|
+
def emit(event, *args)
|
25
|
+
(@__event_emitter ||= {})[event.to_s]&.each do |callback|
|
26
|
+
callback.call(*args)
|
27
|
+
end
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param event [String]
|
32
|
+
# @param callback [Proc]
|
33
|
+
def on(event, callback)
|
34
|
+
raise ArgumentError.new('callback must not be nil') if callback.nil?
|
35
|
+
cb = (@__event_emitter_callback ||= {})["#{event}/#{callback.object_id}"] ||= EventEmitterCallback.new(callback)
|
36
|
+
((@__event_emitter ||= {})[event.to_s] ||= Set.new) << cb
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param event [String]
|
41
|
+
# @param callback [Proc]
|
42
|
+
def once(event, callback)
|
43
|
+
raise ArgumentError.new('callback must not be nil') if callback.nil?
|
44
|
+
|
45
|
+
cb = (@__event_emitter_callback ||= {})["#{event}/once/#{callback.object_id}"] ||= EventEmitterOnceCallback.new(callback)
|
46
|
+
((@__event_emitter ||= {})[event.to_s] ||= Set.new) << cb
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param event [String]
|
51
|
+
# @param callback [Proc]
|
52
|
+
def off(event, callback)
|
53
|
+
raise ArgumentError.new('callback must not be nil') if callback.nil?
|
54
|
+
|
55
|
+
cb = (@__event_emitter_callback ||= {})["#{event}/#{callback.object_id}"]
|
56
|
+
if cb
|
57
|
+
(@__event_emitter ||= {})[event.to_s]&.delete(cb)
|
58
|
+
end
|
59
|
+
self
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Playwright
|
2
|
+
module Events
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
# @see https://github.com/microsoft/playwright/blob/master/src/client/events.ts
|
7
|
+
{
|
8
|
+
AndroidDevice: {
|
9
|
+
WebView: 'webview',
|
10
|
+
Close: 'close'
|
11
|
+
},
|
12
|
+
|
13
|
+
AndroidSocket: {
|
14
|
+
Data: 'data',
|
15
|
+
Close: 'close'
|
16
|
+
},
|
17
|
+
|
18
|
+
AndroidWebView: {
|
19
|
+
Close: 'close'
|
20
|
+
},
|
21
|
+
|
22
|
+
Browser: {
|
23
|
+
Disconnected: 'disconnected'
|
24
|
+
},
|
25
|
+
|
26
|
+
BrowserContext: {
|
27
|
+
Close: 'close',
|
28
|
+
Page: 'page',
|
29
|
+
},
|
30
|
+
|
31
|
+
BrowserServer: {
|
32
|
+
Close: 'close',
|
33
|
+
},
|
34
|
+
|
35
|
+
Page: {
|
36
|
+
Close: 'close',
|
37
|
+
Crash: 'crash',
|
38
|
+
Console: 'console',
|
39
|
+
Dialog: 'dialog',
|
40
|
+
Download: 'download',
|
41
|
+
FileChooser: 'filechooser',
|
42
|
+
DOMContentLoaded: 'domcontentloaded',
|
43
|
+
# Can't use just 'error' due to node.js special treatment of error events.
|
44
|
+
# @see https://nodejs.org/api/events.html#events_error_events
|
45
|
+
PageError: 'pageerror',
|
46
|
+
Request: 'request',
|
47
|
+
Response: 'response',
|
48
|
+
RequestFailed: 'requestfailed',
|
49
|
+
RequestFinished: 'requestfinished',
|
50
|
+
FrameAttached: 'frameattached',
|
51
|
+
FrameDetached: 'framedetached',
|
52
|
+
FrameNavigated: 'framenavigated',
|
53
|
+
Load: 'load',
|
54
|
+
Popup: 'popup',
|
55
|
+
WebSocket: 'websocket',
|
56
|
+
Worker: 'worker',
|
57
|
+
},
|
58
|
+
|
59
|
+
WebSocket: {
|
60
|
+
Close: 'close',
|
61
|
+
Error: 'socketerror',
|
62
|
+
FrameReceived: 'framereceived',
|
63
|
+
FrameSent: 'framesent',
|
64
|
+
},
|
65
|
+
|
66
|
+
Worker: {
|
67
|
+
Close: 'close',
|
68
|
+
},
|
69
|
+
|
70
|
+
ChromiumBrowserContext: {
|
71
|
+
BackgroundPage: 'backgroundpage',
|
72
|
+
ServiceWorker: 'serviceworker',
|
73
|
+
},
|
74
|
+
|
75
|
+
ElectronApplication: {
|
76
|
+
Close: 'close',
|
77
|
+
Window: 'window',
|
78
|
+
},
|
79
|
+
}.each do |key, events|
|
80
|
+
events_module = Module.new
|
81
|
+
events.each do |event_key, event_value|
|
82
|
+
events_module.const_set(event_key, event_value)
|
83
|
+
end
|
84
|
+
events_module.define_singleton_method(:keys) { events.keys }
|
85
|
+
::Playwright::Events.const_set(key, events_module)
|
86
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Playwright
|
2
|
+
class PlaywrightApi
|
3
|
+
# Wrap ChannelOwner.
|
4
|
+
# Playwright::ChannelOwners::XXXXX will be wrapped as Playwright::XXXXX
|
5
|
+
# Playwright::XXXXX is automatically generated by development/generate_api
|
6
|
+
#
|
7
|
+
# @param channel_owner [ChannelOwner]
|
8
|
+
# @note Intended for internal use only.
|
9
|
+
def self.from_channel_owner(channel_owner)
|
10
|
+
Factory.new(channel_owner).create
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
class Factory
|
16
|
+
def initialize(channel_owner)
|
17
|
+
channel_owner_class_name = channel_owner.class.name
|
18
|
+
raise "#{channel_owner_class_name} is not a channel owner" unless channel_owner_class_name.include?('::ChannelOwners::')
|
19
|
+
|
20
|
+
@channel_owner = channel_owner
|
21
|
+
end
|
22
|
+
|
23
|
+
def create
|
24
|
+
api_class = detect_class_for(@channel_owner.class)
|
25
|
+
if api_class
|
26
|
+
api_class.new(@channel_owner)
|
27
|
+
else
|
28
|
+
raise NotImplementedError.new("Playwright::#{expected_class_name_for(@channel_owner.class)} is not implemented")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def expected_class_name_for(klass)
|
35
|
+
klass.name.split('::ChannelOwners::').last
|
36
|
+
end
|
37
|
+
|
38
|
+
def detect_class_for(klass)
|
39
|
+
class_name = expected_class_name_for(klass)
|
40
|
+
if ::Playwright.const_defined?(class_name)
|
41
|
+
::Playwright.const_get(class_name)
|
42
|
+
else
|
43
|
+
if [::Playwright::ChannelOwner, Object].include?(klass.superclass)
|
44
|
+
nil
|
45
|
+
else
|
46
|
+
detect_class_for(klass.superclass)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param channel_owner [Playwright::ChannelOwner]
|
53
|
+
def initialize(channel_owner)
|
54
|
+
@channel_owner = channel_owner
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param block [Proc]
|
58
|
+
def wrap_block_call(block)
|
59
|
+
-> (*args) {
|
60
|
+
wrapped_args = args.map { |arg| wrap_channel_owner(arg) }
|
61
|
+
block.call(*wrapped_args)
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def wrap_channel_owner(object)
|
66
|
+
if object.is_a?(ChannelOwner)
|
67
|
+
PlaywrightApi.from_channel_owner(object)
|
68
|
+
elsif object.is_a?(Array)
|
69
|
+
object.map { |obj| wrap_channel_owner(obj) }
|
70
|
+
else
|
71
|
+
object
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'open3'
|
5
|
+
require "stringio"
|
6
|
+
|
7
|
+
module Playwright
|
8
|
+
# ref: https://github.com/microsoft/playwright-python/blob/master/playwright/_impl/_transport.py
|
9
|
+
class Transport
|
10
|
+
# @param playwright_cli_executable_path [String] path to playwright-cli.
|
11
|
+
# @param debug [Boolean]
|
12
|
+
def initialize(playwright_cli_executable_path:)
|
13
|
+
@driver_executable_path = playwright_cli_executable_path
|
14
|
+
@debug = ENV['DEBUG'].to_s == 'true' || ENV['DEBUG'].to_s == '1'
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_message_received(&block)
|
18
|
+
@on_message = block
|
19
|
+
end
|
20
|
+
|
21
|
+
class AlreadyDisconnectedError < StandardError ; end
|
22
|
+
|
23
|
+
# @param message [Hash]
|
24
|
+
def send_message(message)
|
25
|
+
debug_send_message(message) if @debug
|
26
|
+
msg = JSON.dump(message)
|
27
|
+
@stdin.write([msg.size].pack('V')) # unsigned 32bit, little endian
|
28
|
+
@stdin.write(msg)
|
29
|
+
rescue Errno::EPIPE
|
30
|
+
raise AlreadyDisconnectedError.new('send_message failed')
|
31
|
+
end
|
32
|
+
|
33
|
+
# Terminate playwright-cli driver.
|
34
|
+
def stop
|
35
|
+
[@stdin, @stdout, @stderr].each { |io| io.close unless io.closed? }
|
36
|
+
end
|
37
|
+
|
38
|
+
# Start `playwright-cli run-driver`
|
39
|
+
#
|
40
|
+
# @note This method blocks until playwright-cli exited. Consider using Thread or Future.
|
41
|
+
def run
|
42
|
+
@stdin, @stdout, @stderr, @thread = Open3.popen3(@driver_executable_path, 'run-driver')
|
43
|
+
|
44
|
+
Thread.new { handle_stdout }
|
45
|
+
Thread.new { handle_stderr }
|
46
|
+
|
47
|
+
@thread.join
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def handle_stdout(packet_size: 32_768)
|
53
|
+
while chunk = @stdout.read(4)
|
54
|
+
length = chunk.unpack1('V') # unsigned 32bit, little endian
|
55
|
+
buffer = StringIO.new
|
56
|
+
(length / packet_size).to_i.times do
|
57
|
+
buffer << @stdout.read(packet_size)
|
58
|
+
end
|
59
|
+
buffer << @stdout.read(length % packet_size)
|
60
|
+
buffer.rewind
|
61
|
+
obj = JSON.parse(buffer.read)
|
62
|
+
|
63
|
+
debug_recv_message(obj) if @debug
|
64
|
+
@on_message&.call(obj)
|
65
|
+
end
|
66
|
+
rescue IOError
|
67
|
+
# disconnected by remote.
|
68
|
+
end
|
69
|
+
|
70
|
+
def handle_stderr
|
71
|
+
while err = @stderr.read
|
72
|
+
$stderr.write(err)
|
73
|
+
end
|
74
|
+
rescue IOError
|
75
|
+
# disconnected by remote.
|
76
|
+
end
|
77
|
+
|
78
|
+
def debug_send_message(message)
|
79
|
+
puts "\x1b[33mSEND>\x1b[0m#{message}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def debug_recv_message(message)
|
83
|
+
puts "\x1b[33mRECV>\x1b[0m#{message}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Playwright
|
2
|
+
# The Accessibility class provides methods for inspecting Chromium's accessibility tree. The accessibility tree is used by assistive technology such as screen readers or switches.
|
3
|
+
# Accessibility is a very platform-specific thing. On different platforms, there are different screen readers that might have wildly different output.
|
4
|
+
# Blink - Chromium's rendering engine - has a concept of "accessibility tree", which is then translated into different platform-specific APIs. Accessibility namespace gives users access to the Blink Accessibility Tree.
|
5
|
+
# Most of the accessibility tree gets filtered out when converting from Blink AX Tree to Platform-specific AX-Tree or by assistive technologies themselves. By default, Playwright tries to approximate this filtering, exposing only the "interesting" nodes of the tree.
|
6
|
+
class Accessibility < PlaywrightApi
|
7
|
+
|
8
|
+
# Captures the current state of the accessibility tree. The returned object represents the root accessible node of the page.
|
9
|
+
#
|
10
|
+
# **NOTE** The Chromium accessibility tree contains nodes that go unused on most platforms and by most screen readers. Playwright will discard them as well for an easier to process tree, unless `interestingOnly` is set to `false`.
|
11
|
+
#
|
12
|
+
# An example of dumping the entire accessibility tree:
|
13
|
+
#
|
14
|
+
# ```js
|
15
|
+
# const snapshot = await page.accessibility.snapshot();
|
16
|
+
# console.log(snapshot);
|
17
|
+
# ```
|
18
|
+
# An example of logging the focused node's name:
|
19
|
+
#
|
20
|
+
# ```js
|
21
|
+
# const snapshot = await page.accessibility.snapshot();
|
22
|
+
# const node = findFocusedNode(snapshot);
|
23
|
+
# console.log(node && node.name);
|
24
|
+
#
|
25
|
+
# function findFocusedNode(node) {
|
26
|
+
# if (node.focused)
|
27
|
+
# return node;
|
28
|
+
# for (const child of node.children || []) {
|
29
|
+
# const foundNode = findFocusedNode(child);
|
30
|
+
# return foundNode;
|
31
|
+
# }
|
32
|
+
# return null;
|
33
|
+
# }
|
34
|
+
# ```
|
35
|
+
def snapshot(interestingOnly: nil, root: nil)
|
36
|
+
raise NotImplementedError.new('snapshot is not implemented yet.')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Playwright
|
2
|
+
# A Browser is created when Playwright connects to a browser instance, either through `browserType.launch([options])` or `browserType.connect(params)`.
|
3
|
+
# An example of using a Browser to create a Page:
|
4
|
+
#
|
5
|
+
# ```js
|
6
|
+
# const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
7
|
+
#
|
8
|
+
# (async () => {
|
9
|
+
# const browser = await firefox.launch();
|
10
|
+
# const page = await browser.newPage();
|
11
|
+
# await page.goto('https://example.com');
|
12
|
+
# await browser.close();
|
13
|
+
# })();
|
14
|
+
# ```
|
15
|
+
# See ChromiumBrowser, FirefoxBrowser and WebKitBrowser for browser-specific features. Note that `browserType.connect(params)` and `browserType.launch([options])` always return a specific browser instance, based on the browser being connected to or launched.
|
16
|
+
class Browser < PlaywrightApi
|
17
|
+
|
18
|
+
# In case this browser is obtained using `browserType.launch([options])`, closes the browser and all of its pages (if any were opened).
|
19
|
+
# In case this browser is obtained using `browserType.connect(params)`, clears all created contexts belonging to this browser and disconnects from the browser server.
|
20
|
+
# The Browser object itself is considered to be disposed and cannot be used anymore.
|
21
|
+
def close
|
22
|
+
wrap_channel_owner(@channel_owner.close)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns an array of all open browser contexts. In a newly created browser, this will return zero browser contexts.
|
26
|
+
#
|
27
|
+
# ```js
|
28
|
+
# const browser = await pw.webkit.launch();
|
29
|
+
# console.log(browser.contexts().length); // prints `0`
|
30
|
+
#
|
31
|
+
# const context = await browser.newContext();
|
32
|
+
# console.log(browser.contexts().length); // prints `1`
|
33
|
+
# ```
|
34
|
+
def contexts
|
35
|
+
wrap_channel_owner(@channel_owner.contexts)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Indicates that the browser is connected.
|
39
|
+
def connected?
|
40
|
+
wrap_channel_owner(@channel_owner.connected?)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates a new browser context. It won't share cookies/cache with other browser contexts.
|
44
|
+
#
|
45
|
+
# ```js
|
46
|
+
# (async () => {
|
47
|
+
# const browser = await playwright.firefox.launch(); // Or 'chromium' or 'webkit'.
|
48
|
+
# // Create a new incognito browser context.
|
49
|
+
# const context = await browser.newContext();
|
50
|
+
# // Create a new page in a pristine context.
|
51
|
+
# const page = await context.newPage();
|
52
|
+
# await page.goto('https://example.com');
|
53
|
+
# })();
|
54
|
+
# ```
|
55
|
+
def new_context(
|
56
|
+
acceptDownloads: nil,
|
57
|
+
ignoreHTTPSErrors: nil,
|
58
|
+
bypassCSP: nil,
|
59
|
+
viewport: nil,
|
60
|
+
userAgent: nil,
|
61
|
+
deviceScaleFactor: nil,
|
62
|
+
isMobile: nil,
|
63
|
+
hasTouch: nil,
|
64
|
+
javaScriptEnabled: nil,
|
65
|
+
timezoneId: nil,
|
66
|
+
geolocation: nil,
|
67
|
+
locale: nil,
|
68
|
+
permissions: nil,
|
69
|
+
extraHTTPHeaders: nil,
|
70
|
+
offline: nil,
|
71
|
+
httpCredentials: nil,
|
72
|
+
colorScheme: nil,
|
73
|
+
logger: nil,
|
74
|
+
videosPath: nil,
|
75
|
+
videoSize: nil,
|
76
|
+
recordHar: nil,
|
77
|
+
recordVideo: nil,
|
78
|
+
proxy: nil,
|
79
|
+
storageState: nil)
|
80
|
+
wrap_channel_owner(@channel_owner.new_context(acceptDownloads: acceptDownloads, ignoreHTTPSErrors: ignoreHTTPSErrors, bypassCSP: bypassCSP, viewport: viewport, userAgent: userAgent, deviceScaleFactor: deviceScaleFactor, isMobile: isMobile, hasTouch: hasTouch, javaScriptEnabled: javaScriptEnabled, timezoneId: timezoneId, geolocation: geolocation, locale: locale, permissions: permissions, extraHTTPHeaders: extraHTTPHeaders, offline: offline, httpCredentials: httpCredentials, colorScheme: colorScheme, logger: logger, videosPath: videosPath, videoSize: videoSize, recordHar: recordHar, recordVideo: recordVideo, proxy: proxy, storageState: storageState))
|
81
|
+
end
|
82
|
+
|
83
|
+
# Creates a new page in a new browser context. Closing this page will close the context as well.
|
84
|
+
# This is a convenience API that should only be used for the single-page scenarios and short snippets. Production code and testing frameworks should explicitly create `browser.newContext([options])` followed by the `browserContext.newPage()` to control their exact life times.
|
85
|
+
def new_page(
|
86
|
+
acceptDownloads: nil,
|
87
|
+
ignoreHTTPSErrors: nil,
|
88
|
+
bypassCSP: nil,
|
89
|
+
viewport: nil,
|
90
|
+
userAgent: nil,
|
91
|
+
deviceScaleFactor: nil,
|
92
|
+
isMobile: nil,
|
93
|
+
hasTouch: nil,
|
94
|
+
javaScriptEnabled: nil,
|
95
|
+
timezoneId: nil,
|
96
|
+
geolocation: nil,
|
97
|
+
locale: nil,
|
98
|
+
permissions: nil,
|
99
|
+
extraHTTPHeaders: nil,
|
100
|
+
offline: nil,
|
101
|
+
httpCredentials: nil,
|
102
|
+
colorScheme: nil,
|
103
|
+
logger: nil,
|
104
|
+
videosPath: nil,
|
105
|
+
videoSize: nil,
|
106
|
+
recordHar: nil,
|
107
|
+
recordVideo: nil,
|
108
|
+
proxy: nil,
|
109
|
+
storageState: nil)
|
110
|
+
wrap_channel_owner(@channel_owner.new_page(acceptDownloads: acceptDownloads, ignoreHTTPSErrors: ignoreHTTPSErrors, bypassCSP: bypassCSP, viewport: viewport, userAgent: userAgent, deviceScaleFactor: deviceScaleFactor, isMobile: isMobile, hasTouch: hasTouch, javaScriptEnabled: javaScriptEnabled, timezoneId: timezoneId, geolocation: geolocation, locale: locale, permissions: permissions, extraHTTPHeaders: extraHTTPHeaders, offline: offline, httpCredentials: httpCredentials, colorScheme: colorScheme, logger: logger, videosPath: videosPath, videoSize: videoSize, recordHar: recordHar, recordVideo: recordVideo, proxy: proxy, storageState: storageState))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns the browser version.
|
114
|
+
def version
|
115
|
+
wrap_channel_owner(@channel_owner.version)
|
116
|
+
end
|
117
|
+
|
118
|
+
# @nodoc
|
119
|
+
def after_initialize
|
120
|
+
wrap_channel_owner(@channel_owner.after_initialize)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|