playwright-ruby-client 0.0.3 → 0.0.4
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 +8 -15
- data/lib/playwright/channel_owners/browser.rb +2 -2
- data/lib/playwright/channel_owners/console_message.rb +25 -0
- data/lib/playwright/channel_owners/element_handle.rb +8 -0
- data/lib/playwright/channel_owners/js_handle.rb +4 -0
- data/lib/playwright/channel_owners/page.rb +14 -1
- data/lib/playwright/version.rb +1 -1
- data/lib/playwright_api/accessibility.rb +20 -6
- data/lib/playwright_api/browser.rb +52 -39
- data/lib/playwright_api/browser_context.rb +94 -44
- data/lib/playwright_api/browser_type.rb +72 -53
- data/lib/playwright_api/cdp_session.rb +10 -7
- data/lib/playwright_api/chromium_browser_context.rb +3 -0
- data/lib/playwright_api/console_message.rb +12 -5
- data/lib/playwright_api/dialog.rb +3 -1
- data/lib/playwright_api/download.rb +13 -4
- data/lib/playwright_api/element_handle.rb +226 -113
- data/lib/playwright_api/file_chooser.rb +4 -2
- data/lib/playwright_api/frame.rb +276 -128
- data/lib/playwright_api/js_handle.rb +30 -10
- data/lib/playwright_api/keyboard.rb +56 -18
- data/lib/playwright_api/mouse.rb +6 -3
- data/lib/playwright_api/page.rb +452 -237
- data/lib/playwright_api/playwright.rb +80 -16
- data/lib/playwright_api/request.rb +35 -15
- data/lib/playwright_api/response.rb +4 -3
- data/lib/playwright_api/route.rb +15 -4
- data/lib/playwright_api/selectors.rb +3 -7
- data/lib/playwright_api/touchscreen.rb +2 -1
- data/lib/playwright_api/video.rb +3 -1
- data/lib/playwright_api/web_socket.rb +4 -2
- data/lib/playwright_api/worker.rb +17 -5
- metadata +5 -2
@@ -1,35 +1,99 @@
|
|
1
1
|
module Playwright
|
2
|
-
#
|
2
|
+
# Playwright module provides a method to launch a browser instance. The following is a typical example of using Playwright
|
3
|
+
# to drive automation:
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# ```js
|
7
|
+
# const { chromium, firefox, webkit } = require('playwright');
|
8
|
+
#
|
9
|
+
# (async () => {
|
10
|
+
# const browser = await chromium.launch(); // Or 'firefox' or 'webkit'.
|
11
|
+
# const page = await browser.newPage();
|
12
|
+
# await page.goto('http://example.com');
|
13
|
+
# // other actions...
|
14
|
+
# await browser.close();
|
15
|
+
# })();
|
16
|
+
# ```
|
17
|
+
#
|
18
|
+
# By default, the `playwright` NPM package automatically downloads browser executables during installation. The
|
19
|
+
# `playwright-core` NPM package can be used to skip automatic downloads.
|
3
20
|
class Playwright < PlaywrightApi
|
4
21
|
|
5
|
-
#
|
6
|
-
def
|
7
|
-
wrap_channel_owner(@channel_owner.
|
22
|
+
# This object can be used to launch or connect to Chromium, returning instances of `ChromiumBrowser`.
|
23
|
+
def chromium # property
|
24
|
+
wrap_channel_owner(@channel_owner.chromium)
|
8
25
|
end
|
9
26
|
|
10
|
-
#
|
11
|
-
|
12
|
-
|
27
|
+
# Returns a list of devices to be used with [`method: Browser.newContext`] or [`method: Browser.newPage`]. Actual list of
|
28
|
+
# devices can be found in
|
29
|
+
# [src/server/deviceDescriptors.ts](https://github.com/Microsoft/playwright/blob/master/src/server/deviceDescriptors.ts).
|
30
|
+
#
|
31
|
+
#
|
32
|
+
# ```js
|
33
|
+
# const { webkit, devices } = require('playwright');
|
34
|
+
# const iPhone = devices['iPhone 6'];
|
35
|
+
#
|
36
|
+
# (async () => {
|
37
|
+
# const browser = await webkit.launch();
|
38
|
+
# const context = await browser.newContext({
|
39
|
+
# ...iPhone
|
40
|
+
# });
|
41
|
+
# const page = await context.newPage();
|
42
|
+
# await page.goto('http://example.com');
|
43
|
+
# // other actions...
|
44
|
+
# await browser.close();
|
45
|
+
# })();
|
46
|
+
# ```
|
47
|
+
def devices # property
|
48
|
+
wrap_channel_owner(@channel_owner.devices)
|
13
49
|
end
|
14
50
|
|
15
|
-
#
|
16
|
-
|
17
|
-
|
51
|
+
# Playwright methods might throw errors if they are unable to fulfill a request. For example,
|
52
|
+
# [`method: Page.waitForSelector`] might fail if the selector doesn't match any nodes during the given timeframe.
|
53
|
+
#
|
54
|
+
# For certain types of errors Playwright uses specific error classes. These classes are available via
|
55
|
+
# [`playwright.errors`](#playwrighterrors).
|
56
|
+
#
|
57
|
+
# An example of handling a timeout error:
|
58
|
+
#
|
59
|
+
#
|
60
|
+
# ```js
|
61
|
+
# try {
|
62
|
+
# await page.waitForSelector('.foo');
|
63
|
+
# } catch (e) {
|
64
|
+
# if (e instanceof playwright.errors.TimeoutError) {
|
65
|
+
# // Do something if this is a timeout.
|
66
|
+
# }
|
67
|
+
# }
|
68
|
+
# ```
|
69
|
+
def errors # property
|
70
|
+
raise NotImplementedError.new('errors is not implemented yet.')
|
18
71
|
end
|
19
72
|
|
20
|
-
#
|
21
|
-
def firefox
|
73
|
+
# This object can be used to launch or connect to Firefox, returning instances of `FirefoxBrowser`.
|
74
|
+
def firefox # property
|
22
75
|
wrap_channel_owner(@channel_owner.firefox)
|
23
76
|
end
|
24
77
|
|
78
|
+
# Selectors can be used to install custom selector engines. See
|
79
|
+
# [Working with selectors](./selectors.md#working-with-selectors) for more information.
|
80
|
+
def selectors # property
|
81
|
+
raise NotImplementedError.new('selectors is not implemented yet.')
|
82
|
+
end
|
83
|
+
|
84
|
+
# This object can be used to launch or connect to WebKit, returning instances of `WebKitBrowser`.
|
85
|
+
def webkit # property
|
86
|
+
wrap_channel_owner(@channel_owner.webkit)
|
87
|
+
end
|
88
|
+
|
25
89
|
# @nodoc
|
26
|
-
def
|
27
|
-
wrap_channel_owner(@channel_owner.
|
90
|
+
def android
|
91
|
+
wrap_channel_owner(@channel_owner.android)
|
28
92
|
end
|
29
93
|
|
30
94
|
# @nodoc
|
31
|
-
def
|
32
|
-
wrap_channel_owner(@channel_owner.
|
95
|
+
def electron
|
96
|
+
wrap_channel_owner(@channel_owner.electron)
|
33
97
|
end
|
34
98
|
end
|
35
99
|
end
|
@@ -1,19 +1,23 @@
|
|
1
1
|
module Playwright
|
2
|
-
# Whenever the page sends a request for a network resource the following sequence of events are emitted by Page
|
2
|
+
# Whenever the page sends a request for a network resource the following sequence of events are emitted by `Page`:
|
3
|
+
# - [`event: Page.request`] emitted when the request is issued by the page.
|
4
|
+
# - [`event: Page.response`] emitted when/if the response status and headers are received for the request.
|
5
|
+
# - [`event: Page.requestfinished`] emitted when the response body is downloaded and the request is complete.
|
3
6
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# page.on('requestfinished') emitted when the response body is downloaded and the request is complete.
|
7
|
+
# If request fails at some point, then instead of `'requestfinished'` event (and possibly instead of 'response' event),
|
8
|
+
# the [`event: Page.requestfailed`] event is emitted.
|
7
9
|
#
|
8
|
-
#
|
10
|
+
# > **NOTE** HTTP Error responses, such as 404 or 503, are still successful responses from HTTP standpoint, so request
|
11
|
+
# will complete with `'requestfinished'` event.
|
9
12
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# If request gets a 'redirect' response, the request is successfully finished with the 'requestfinished' event, and a new request is issued to a redirected url.
|
13
|
+
# If request gets a 'redirect' response, the request is successfully finished with the 'requestfinished' event, and a new
|
14
|
+
# request is issued to a redirected url.
|
13
15
|
class Request < PlaywrightApi
|
14
16
|
|
15
17
|
# The method returns `null` unless this request has failed, as reported by `requestfailed` event.
|
18
|
+
#
|
16
19
|
# Example of logging of all the failed requests:
|
20
|
+
#
|
17
21
|
#
|
18
22
|
# ```js
|
19
23
|
# page.on('requestfailed', request => {
|
@@ -24,7 +28,7 @@ module Playwright
|
|
24
28
|
raise NotImplementedError.new('failure is not implemented yet.')
|
25
29
|
end
|
26
30
|
|
27
|
-
# Returns the Frame that initiated this request.
|
31
|
+
# Returns the `Frame` that initiated this request.
|
28
32
|
def frame
|
29
33
|
raise NotImplementedError.new('frame is not implemented yet.')
|
30
34
|
end
|
@@ -55,20 +59,29 @@ module Playwright
|
|
55
59
|
end
|
56
60
|
|
57
61
|
# Returns parsed request's body for `form-urlencoded` and JSON as a fallback if any.
|
58
|
-
#
|
62
|
+
#
|
63
|
+
# When the response is `application/x-www-form-urlencoded` then a key/value object of the values will be returned.
|
64
|
+
# Otherwise it will be parsed as JSON.
|
59
65
|
def post_data_json
|
60
66
|
raise NotImplementedError.new('post_data_json is not implemented yet.')
|
61
67
|
end
|
62
68
|
|
63
69
|
# Request that was redirected by the server to this one, if any.
|
64
|
-
#
|
70
|
+
#
|
71
|
+
# When the server responds with a redirect, Playwright creates a new `Request` object. The two requests are connected by
|
72
|
+
# `redirectedFrom()` and `redirectedTo()` methods. When multiple server redirects has happened, it is possible to
|
73
|
+
# construct the whole redirect chain by repeatedly calling `redirectedFrom()`.
|
74
|
+
#
|
65
75
|
# For example, if the website `http://example.com` redirects to `https://example.com`:
|
76
|
+
#
|
66
77
|
#
|
67
78
|
# ```js
|
68
79
|
# const response = await page.goto('http://example.com');
|
69
80
|
# console.log(response.request().redirectedFrom().url()); // 'http://example.com'
|
70
81
|
# ```
|
82
|
+
#
|
71
83
|
# If the website `https://google.com` has no redirects:
|
84
|
+
#
|
72
85
|
#
|
73
86
|
# ```js
|
74
87
|
# const response = await page.goto('https://google.com');
|
@@ -79,7 +92,9 @@ module Playwright
|
|
79
92
|
end
|
80
93
|
|
81
94
|
# New request issued by the browser if the server responded with redirect.
|
82
|
-
#
|
95
|
+
#
|
96
|
+
# This method is the opposite of [`method: Request.redirectedFrom`]:
|
97
|
+
#
|
83
98
|
#
|
84
99
|
# ```js
|
85
100
|
# console.log(request.redirectedFrom().redirectedTo() === request); // true
|
@@ -88,17 +103,22 @@ module Playwright
|
|
88
103
|
raise NotImplementedError.new('redirected_to is not implemented yet.')
|
89
104
|
end
|
90
105
|
|
91
|
-
# Contains the request's resource type as it was perceived by the rendering engine. ResourceType will be one of the
|
106
|
+
# Contains the request's resource type as it was perceived by the rendering engine. ResourceType will be one of the
|
107
|
+
# following: `document`, `stylesheet`, `image`, `media`, `font`, `script`, `texttrack`, `xhr`, `fetch`, `eventsource`,
|
108
|
+
# `websocket`, `manifest`, `other`.
|
92
109
|
def resource_type
|
93
110
|
raise NotImplementedError.new('resource_type is not implemented yet.')
|
94
111
|
end
|
95
112
|
|
96
|
-
# Returns the matching Response object, or `null` if the response was not received due to error.
|
113
|
+
# Returns the matching `Response` object, or `null` if the response was not received due to error.
|
97
114
|
def response
|
98
115
|
raise NotImplementedError.new('response is not implemented yet.')
|
99
116
|
end
|
100
117
|
|
101
|
-
# Returns resource timing information for given request. Most of the timing values become available upon the response,
|
118
|
+
# Returns resource timing information for given request. Most of the timing values become available upon the response,
|
119
|
+
# `responseEnd` becomes available when request finishes. Find more information at
|
120
|
+
# [Resource Timing API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming).
|
121
|
+
#
|
102
122
|
#
|
103
123
|
# ```js
|
104
124
|
# const [request] = await Promise.all([
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Playwright
|
2
|
-
# Response class represents responses which are received by page.
|
2
|
+
# `Response` class represents responses which are received by page.
|
3
3
|
class Response < PlaywrightApi
|
4
4
|
|
5
5
|
# Returns the buffer with response body.
|
@@ -12,7 +12,7 @@ module Playwright
|
|
12
12
|
raise NotImplementedError.new('finished is not implemented yet.')
|
13
13
|
end
|
14
14
|
|
15
|
-
# Returns the Frame that initiated this response.
|
15
|
+
# Returns the `Frame` that initiated this response.
|
16
16
|
def frame
|
17
17
|
raise NotImplementedError.new('frame is not implemented yet.')
|
18
18
|
end
|
@@ -23,6 +23,7 @@ module Playwright
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Returns the JSON representation of response body.
|
26
|
+
#
|
26
27
|
# This method will throw if the response body is not parsable via `JSON.parse`.
|
27
28
|
def json
|
28
29
|
raise NotImplementedError.new('json is not implemented yet.')
|
@@ -33,7 +34,7 @@ module Playwright
|
|
33
34
|
raise NotImplementedError.new('ok is not implemented yet.')
|
34
35
|
end
|
35
36
|
|
36
|
-
# Returns the matching Request object.
|
37
|
+
# Returns the matching `Request` object.
|
37
38
|
def request
|
38
39
|
raise NotImplementedError.new('request is not implemented yet.')
|
39
40
|
end
|
data/lib/playwright_api/route.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Playwright
|
2
|
-
# Whenever a network route is set up with `
|
2
|
+
# Whenever a network route is set up with [`method: Page.route`] or [`method: BrowserContext.route`], the `Route` object
|
3
|
+
# allows to handle the route.
|
3
4
|
class Route < PlaywrightApi
|
4
5
|
|
5
6
|
# Aborts the route's request.
|
@@ -8,6 +9,7 @@ module Playwright
|
|
8
9
|
end
|
9
10
|
|
10
11
|
# Continues route's request with optional overrides.
|
12
|
+
#
|
11
13
|
#
|
12
14
|
# ```js
|
13
15
|
# await page.route('**/*', (route, request) => {
|
@@ -20,12 +22,14 @@ module Playwright
|
|
20
22
|
# route.continue({headers});
|
21
23
|
# });
|
22
24
|
# ```
|
23
|
-
def
|
24
|
-
raise NotImplementedError.new('
|
25
|
+
def continue_(headers: nil, method: nil, postData: nil, url: nil)
|
26
|
+
raise NotImplementedError.new('continue_ is not implemented yet.')
|
25
27
|
end
|
26
28
|
|
27
29
|
# Fulfills route's request with given response.
|
30
|
+
#
|
28
31
|
# An example of fulfilling all requests with 404 responses:
|
32
|
+
#
|
29
33
|
#
|
30
34
|
# ```js
|
31
35
|
# await page.route('**/*', route => {
|
@@ -36,12 +40,19 @@ module Playwright
|
|
36
40
|
# });
|
37
41
|
# });
|
38
42
|
# ```
|
43
|
+
#
|
39
44
|
# An example of serving static file:
|
45
|
+
#
|
40
46
|
#
|
41
47
|
# ```js
|
42
48
|
# await page.route('**/xhr_endpoint', route => route.fulfill({ path: 'mock_data.json' }));
|
43
49
|
# ```
|
44
|
-
def fulfill(
|
50
|
+
def fulfill(
|
51
|
+
body: nil,
|
52
|
+
contentType: nil,
|
53
|
+
headers: nil,
|
54
|
+
path: nil,
|
55
|
+
status: nil)
|
45
56
|
raise NotImplementedError.new('fulfill is not implemented yet.')
|
46
57
|
end
|
47
58
|
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module Playwright
|
2
|
-
# Selectors can be used to install custom selector engines. See
|
2
|
+
# Selectors can be used to install custom selector engines. See
|
3
|
+
# [Working with selectors](./selectors.md#working-with-selectors) for more information.
|
3
4
|
class Selectors < PlaywrightApi
|
4
5
|
|
5
6
|
# An example of registering selector engine that queries elements based on a tag name:
|
7
|
+
#
|
6
8
|
#
|
7
9
|
# ```js
|
8
10
|
# const { selectors, firefox } = require('playwright'); // Or 'chromium' or 'webkit'.
|
@@ -10,12 +12,6 @@ module Playwright
|
|
10
12
|
# (async () => {
|
11
13
|
# // Must be a function that evaluates to a selector engine instance.
|
12
14
|
# const createTagNameEngine = () => ({
|
13
|
-
# // Creates a selector that matches given target when queried at the root.
|
14
|
-
# // Can return undefined if unable to create one.
|
15
|
-
# create(root, target) {
|
16
|
-
# return root.querySelector(target.tagName) === target ? target.tagName : undefined;
|
17
|
-
# },
|
18
|
-
#
|
19
15
|
# // Returns the first element matching given selector in the root's subtree.
|
20
16
|
# query(root, selector) {
|
21
17
|
# return root.querySelector(selector);
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Playwright
|
2
|
-
# The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the
|
2
|
+
# The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the
|
3
|
+
# touchscreen can only be used in browser contexts that have been intialized with `hasTouch` set to true.
|
3
4
|
class Touchscreen < PlaywrightApi
|
4
5
|
|
5
6
|
# Dispatches a `touchstart` and `touchend` event with a single touch at the position (`x`,`y`).
|
data/lib/playwright_api/video.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module Playwright
|
2
2
|
# When browser context is created with the `videosPath` option, each page has a video object associated with it.
|
3
|
+
#
|
3
4
|
#
|
4
5
|
# ```js
|
5
6
|
# console.log(await page.video().path());
|
6
7
|
# ```
|
7
8
|
class Video < PlaywrightApi
|
8
9
|
|
9
|
-
# Returns the file system path this video will be recorded to. The video is guaranteed to be written to the filesystem
|
10
|
+
# Returns the file system path this video will be recorded to. The video is guaranteed to be written to the filesystem
|
11
|
+
# upon closing the browser context.
|
10
12
|
def path
|
11
13
|
raise NotImplementedError.new('path is not implemented yet.')
|
12
14
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Playwright
|
2
|
-
# The WebSocket class represents websocket connections in the page.
|
2
|
+
# The `WebSocket` class represents websocket connections in the page.
|
3
3
|
class WebSocket < PlaywrightApi
|
4
4
|
|
5
5
|
# Indicates that the web socket has been closed.
|
@@ -13,7 +13,9 @@ module Playwright
|
|
13
13
|
end
|
14
14
|
|
15
15
|
# Returns the event data value.
|
16
|
-
#
|
16
|
+
#
|
17
|
+
# Waits for event to fire and passes its value into the predicate function. Returns when the predicate returns truthy
|
18
|
+
# value. Will throw an error if the webSocket is closed before the event is fired.
|
17
19
|
def wait_for_event(event, optionsOrPredicate: nil)
|
18
20
|
raise NotImplementedError.new('wait_for_event is not implemented yet.')
|
19
21
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
module Playwright
|
2
|
-
# The Worker class represents a WebWorker. `worker`
|
2
|
+
# The Worker class represents a [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API). `worker`
|
3
|
+
# event is emitted on the page object to signal a worker creation. `close` event is emitted on the worker object when the
|
4
|
+
# worker is gone.
|
5
|
+
#
|
3
6
|
#
|
4
7
|
# ```js
|
5
8
|
# page.on('worker', worker => {
|
@@ -14,15 +17,24 @@ module Playwright
|
|
14
17
|
class Worker < PlaywrightApi
|
15
18
|
|
16
19
|
# Returns the return value of `pageFunction`
|
17
|
-
#
|
18
|
-
# If the function passed to the `worker.evaluate` returns a
|
20
|
+
#
|
21
|
+
# If the function passed to the `worker.evaluate` returns a [Promise], then `worker.evaluate` would wait for the promise
|
22
|
+
# to resolve and return its value.
|
23
|
+
#
|
24
|
+
# If the function passed to the `worker.evaluate` returns a non-[Serializable] value, then `worker.evaluate` returns
|
25
|
+
# `undefined`. DevTools Protocol also supports transferring some additional values that are not serializable by `JSON`:
|
26
|
+
# `-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
19
27
|
def evaluate(pageFunction, arg: nil)
|
20
28
|
raise NotImplementedError.new('evaluate is not implemented yet.')
|
21
29
|
end
|
22
30
|
|
23
31
|
# Returns the return value of `pageFunction` as in-page object (JSHandle).
|
24
|
-
#
|
25
|
-
#
|
32
|
+
#
|
33
|
+
# The only difference between `worker.evaluate` and `worker.evaluateHandle` is that `worker.evaluateHandle` returns
|
34
|
+
# in-page object (JSHandle).
|
35
|
+
#
|
36
|
+
# If the function passed to the `worker.evaluateHandle` returns a [Promise], then `worker.evaluateHandle` would wait for
|
37
|
+
# the promise to resolve and return its value.
|
26
38
|
def evaluate_handle(pageFunction, arg: nil)
|
27
39
|
raise NotImplementedError.new('evaluate_handle is not implemented yet.')
|
28
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: playwright-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YusukeIwaki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -147,9 +147,12 @@ files:
|
|
147
147
|
- lib/playwright/channel_owners/browser_type.rb
|
148
148
|
- lib/playwright/channel_owners/chromium_browser.rb
|
149
149
|
- lib/playwright/channel_owners/chromium_browser_context.rb
|
150
|
+
- lib/playwright/channel_owners/console_message.rb
|
150
151
|
- lib/playwright/channel_owners/electron.rb
|
152
|
+
- lib/playwright/channel_owners/element_handle.rb
|
151
153
|
- lib/playwright/channel_owners/firefox_browser.rb
|
152
154
|
- lib/playwright/channel_owners/frame.rb
|
155
|
+
- lib/playwright/channel_owners/js_handle.rb
|
153
156
|
- lib/playwright/channel_owners/page.rb
|
154
157
|
- lib/playwright/channel_owners/playwright.rb
|
155
158
|
- lib/playwright/channel_owners/request.rb
|