playwright-ruby-client 1.28.1 → 1.29.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/accessibility.md +9 -14
- data/documentation/docs/api/api_request_context.md +44 -41
- data/documentation/docs/api/api_response.md +13 -3
- data/documentation/docs/api/browser.md +24 -23
- data/documentation/docs/api/browser_context.md +71 -45
- data/documentation/docs/api/browser_type.md +21 -14
- data/documentation/docs/api/cdp_session.md +3 -5
- data/documentation/docs/api/console_message.md +7 -4
- data/documentation/docs/api/dialog.md +9 -5
- data/documentation/docs/api/download.md +19 -11
- data/documentation/docs/api/element_handle.md +125 -116
- data/documentation/docs/api/experimental/android.md +4 -5
- data/documentation/docs/api/experimental/android_device.md +11 -2
- data/documentation/docs/api/experimental/android_input.md +5 -0
- data/documentation/docs/api/file_chooser.md +6 -3
- data/documentation/docs/api/frame.md +182 -171
- data/documentation/docs/api/frame_locator.md +27 -38
- data/documentation/docs/api/js_handle.md +16 -10
- data/documentation/docs/api/keyboard.md +29 -16
- data/documentation/docs/api/locator.md +189 -140
- data/documentation/docs/api/mouse.md +9 -4
- data/documentation/docs/api/page.md +304 -289
- data/documentation/docs/api/playwright.md +8 -5
- data/documentation/docs/api/request.md +34 -15
- data/documentation/docs/api/response.md +27 -10
- data/documentation/docs/api/route.md +44 -12
- data/documentation/docs/api/selectors.md +5 -3
- data/documentation/docs/api/touchscreen.md +2 -0
- data/documentation/docs/api/tracing.md +11 -11
- data/documentation/docs/api/web_socket.md +9 -4
- data/documentation/docs/api/worker.md +12 -11
- data/documentation/docs/include/api_coverage.md +2 -0
- data/lib/playwright/channel_owners/api_request_context.rb +37 -2
- data/lib/playwright/channel_owners/browser_context.rb +22 -26
- data/lib/playwright/channel_owners/page.rb +35 -25
- data/lib/playwright/channel_owners/route.rb +28 -8
- data/lib/playwright/event_emitter.rb +6 -1
- data/lib/playwright/locator_impl.rb +8 -0
- data/lib/playwright/select_option_values.rb +2 -0
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright_api/accessibility.rb +9 -13
- data/lib/playwright_api/android.rb +8 -6
- data/lib/playwright_api/android_device.rb +32 -7
- data/lib/playwright_api/android_input.rb +5 -0
- data/lib/playwright_api/android_socket.rb +4 -2
- data/lib/playwright_api/android_web_view.rb +5 -2
- data/lib/playwright_api/api_request.rb +6 -3
- data/lib/playwright_api/api_request_context.rb +46 -36
- data/lib/playwright_api/api_response.rb +13 -2
- data/lib/playwright_api/browser.rb +24 -16
- data/lib/playwright_api/browser_context.rb +76 -39
- data/lib/playwright_api/browser_type.rb +23 -13
- data/lib/playwright_api/cdp_session.rb +3 -4
- data/lib/playwright_api/console_message.rb +7 -2
- data/lib/playwright_api/dialog.rb +8 -4
- data/lib/playwright_api/download.rb +19 -9
- data/lib/playwright_api/element_handle.rb +116 -93
- data/lib/playwright_api/file_chooser.rb +6 -1
- data/lib/playwright_api/frame.rb +180 -135
- data/lib/playwright_api/frame_locator.rb +29 -32
- data/lib/playwright_api/js_handle.rb +16 -6
- data/lib/playwright_api/keyboard.rb +29 -14
- data/lib/playwright_api/locator.rb +183 -112
- data/lib/playwright_api/mouse.rb +9 -2
- data/lib/playwright_api/page.rb +301 -253
- data/lib/playwright_api/playwright.rb +11 -4
- data/lib/playwright_api/request.rb +34 -7
- data/lib/playwright_api/response.rb +27 -10
- data/lib/playwright_api/route.rb +44 -11
- data/lib/playwright_api/selectors.rb +6 -1
- data/lib/playwright_api/touchscreen.rb +2 -0
- data/lib/playwright_api/tracing.rb +11 -5
- data/lib/playwright_api/web_socket.rb +9 -4
- data/lib/playwright_api/worker.rb +16 -13
- data/playwright.gemspec +1 -1
- metadata +7 -7
@@ -4,6 +4,7 @@ sidebar_position: 10
|
|
4
4
|
|
5
5
|
# WebSocket
|
6
6
|
|
7
|
+
|
7
8
|
The [WebSocket](./web_socket) class represents websocket connections in the page.
|
8
9
|
|
9
10
|
## closed?
|
@@ -12,6 +13,7 @@ The [WebSocket](./web_socket) class represents websocket connections in the page
|
|
12
13
|
def closed?
|
13
14
|
```
|
14
15
|
|
16
|
+
|
15
17
|
Indicates that the web socket has been closed.
|
16
18
|
|
17
19
|
## url
|
@@ -20,6 +22,7 @@ Indicates that the web socket has been closed.
|
|
20
22
|
def url
|
21
23
|
```
|
22
24
|
|
25
|
+
|
23
26
|
Contains the URL of the WebSocket.
|
24
27
|
|
25
28
|
## expect_event
|
@@ -28,6 +31,7 @@ Contains the URL of the WebSocket.
|
|
28
31
|
def expect_event(event, predicate: nil, timeout: nil, &block)
|
29
32
|
```
|
30
33
|
|
34
|
+
|
31
35
|
Waits for event to fire and passes its value into the predicate function. Returns when the predicate returns truthy
|
32
36
|
value. Will throw an error if the webSocket is closed before the event is fired. Returns the event data value.
|
33
37
|
|
@@ -37,8 +41,9 @@ value. Will throw an error if the webSocket is closed before the event is fired.
|
|
37
41
|
def wait_for_event(event, predicate: nil, timeout: nil, &block)
|
38
42
|
```
|
39
43
|
|
40
|
-
> NOTE: In most cases, you should use [WebSocket#wait_for_event](./web_socket#wait_for_event).
|
41
44
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
+
**NOTE**: In most cases, you should use [WebSocket#wait_for_event](./web_socket#wait_for_event).
|
46
|
+
|
47
|
+
Waits for given `event` to fire. If predicate is provided, it passes
|
48
|
+
event's value into the `predicate` function and waits for `predicate(event)` to return a truthy value.
|
49
|
+
Will throw an error if the socket is closed before the `event` is fired.
|
@@ -4,6 +4,7 @@ sidebar_position: 10
|
|
4
4
|
|
5
5
|
# Worker
|
6
6
|
|
7
|
+
|
7
8
|
The Worker class represents a [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API). `worker`
|
8
9
|
event is emitted on the page object to signal a worker creation. `close` event is emitted on the worker object when the
|
9
10
|
worker is gone.
|
@@ -22,22 +23,20 @@ page.workers.each do |worker|
|
|
22
23
|
end
|
23
24
|
```
|
24
25
|
|
25
|
-
|
26
|
-
|
27
26
|
## evaluate
|
28
27
|
|
29
28
|
```
|
30
29
|
def evaluate(expression, arg: nil)
|
31
30
|
```
|
32
31
|
|
32
|
+
|
33
33
|
Returns the return value of `expression`.
|
34
34
|
|
35
|
-
If the function passed to the [Worker#evaluate](./worker#evaluate) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then [Worker#evaluate](./worker#evaluate) would
|
36
|
-
|
35
|
+
If the function passed to the [Worker#evaluate](./worker#evaluate) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then [Worker#evaluate](./worker#evaluate) would wait for the promise
|
36
|
+
to resolve and return its value.
|
37
37
|
|
38
|
-
If the function passed to the [Worker#evaluate](./worker#evaluate) returns a non-[Serializable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description) value, then
|
39
|
-
|
40
|
-
not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`.
|
38
|
+
If the function passed to the [Worker#evaluate](./worker#evaluate) returns a non-[Serializable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description) value, then [Worker#evaluate](./worker#evaluate) returns `undefined`. Playwright also supports transferring some
|
39
|
+
additional values that are not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`.
|
41
40
|
|
42
41
|
## evaluate_handle
|
43
42
|
|
@@ -45,13 +44,15 @@ not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`.
|
|
45
44
|
def evaluate_handle(expression, arg: nil)
|
46
45
|
```
|
47
46
|
|
47
|
+
|
48
48
|
Returns the return value of `expression` as a [JSHandle](./js_handle).
|
49
49
|
|
50
|
-
The only difference between [Worker#evaluate](./worker#evaluate) and
|
51
|
-
[Worker#evaluate_handle](./worker#evaluate_handle)
|
50
|
+
The only difference between [Worker#evaluate](./worker#evaluate) and
|
51
|
+
[Worker#evaluate_handle](./worker#evaluate_handle) is that [Worker#evaluate_handle](./worker#evaluate_handle)
|
52
|
+
returns [JSHandle](./js_handle).
|
52
53
|
|
53
|
-
If the function passed to the [Worker#evaluate_handle](./worker#evaluate_handle) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then
|
54
|
-
|
54
|
+
If the function passed to the [Worker#evaluate_handle](./worker#evaluate_handle) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then [Worker#evaluate_handle](./worker#evaluate_handle) would wait for
|
55
|
+
the promise to resolve and return its value.
|
55
56
|
|
56
57
|
## url
|
57
58
|
|
@@ -56,6 +56,42 @@ module Playwright
|
|
56
56
|
if [ChannelOwners::Request, String].none? { |type| urlOrRequest.is_a?(type) }
|
57
57
|
raise ArgumentError.new("First argument must be either URL string or Request")
|
58
58
|
end
|
59
|
+
if urlOrRequest.is_a?(ChannelOwners::Request)
|
60
|
+
request = urlOrRequest
|
61
|
+
url = nil
|
62
|
+
else
|
63
|
+
url = urlOrRequest
|
64
|
+
request = nil
|
65
|
+
end
|
66
|
+
_inner_fetch(
|
67
|
+
request,
|
68
|
+
url,
|
69
|
+
data: data,
|
70
|
+
failOnStatusCode: failOnStatusCode,
|
71
|
+
form: form,
|
72
|
+
headers: headers,
|
73
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
74
|
+
maxRedirects: maxRedirects,
|
75
|
+
method: method,
|
76
|
+
multipart: multipart,
|
77
|
+
params: params,
|
78
|
+
timeout: timeout,
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
private def _inner_fetch(
|
83
|
+
request,
|
84
|
+
url,
|
85
|
+
data: nil,
|
86
|
+
failOnStatusCode: nil,
|
87
|
+
form: nil,
|
88
|
+
headers: nil,
|
89
|
+
ignoreHTTPSErrors: nil,
|
90
|
+
maxRedirects: nil,
|
91
|
+
method: nil,
|
92
|
+
multipart: nil,
|
93
|
+
params: nil,
|
94
|
+
timeout: nil)
|
59
95
|
if [data, form, multipart].compact.count > 1
|
60
96
|
raise ArgumentError.new("Only one of 'data', 'form' or 'multipart' can be specified")
|
61
97
|
end
|
@@ -63,10 +99,9 @@ module Playwright
|
|
63
99
|
raise ArgumentError.new("'maxRedirects' should be greater than or equal to '0'")
|
64
100
|
end
|
65
101
|
|
66
|
-
request = urlOrRequest.is_a?(ChannelOwners::Request) ? urlOrRequest : nil
|
67
102
|
headers_obj = headers || request&.headers
|
68
103
|
fetch_params = {
|
69
|
-
url:
|
104
|
+
url: url || request.url,
|
70
105
|
params: object_to_array(params),
|
71
106
|
method: method || request&.method || 'GET',
|
72
107
|
headers: headers_obj ? HttpHeaders.new(headers_obj).as_serialized : nil,
|
@@ -24,13 +24,7 @@ module Playwright
|
|
24
24
|
@channel.on('bindingCall', ->(params) { on_binding(ChannelOwners::BindingCall.from(params['binding'])) })
|
25
25
|
@channel.once('close', ->(_) { on_close })
|
26
26
|
@channel.on('page', ->(params) { on_page(ChannelOwners::Page.from(params['page']) )})
|
27
|
-
@channel.on('route', ->(params) {
|
28
|
-
Concurrent::Promises.future {
|
29
|
-
on_route(ChannelOwners::Route.from(params['route']))
|
30
|
-
}.rescue do |err|
|
31
|
-
puts err, err.backtrace
|
32
|
-
end
|
33
|
-
})
|
27
|
+
@channel.on('route', ->(params) { on_route(ChannelOwners::Route.from(params['route'])) })
|
34
28
|
@channel.on('backgroundPage', ->(params) {
|
35
29
|
on_background_page(ChannelOwners::Page.from(params['page']))
|
36
30
|
})
|
@@ -93,31 +87,33 @@ module Playwright
|
|
93
87
|
# It is not desired to use PlaywrightApi.wrap directly.
|
94
88
|
# However it is a little difficult to define wrapper for `handler` parameter in generate_api.
|
95
89
|
# Just a workaround...
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
next false unless handler_entry.match?(route.request.url)
|
90
|
+
Concurrent::Promises.future(PlaywrightApi.wrap(route)) do |wrapped_route|
|
91
|
+
handled = @routes.any? do |handler_entry|
|
92
|
+
next false unless handler_entry.match?(route.request.url)
|
100
93
|
|
101
|
-
|
102
|
-
|
94
|
+
promise = Concurrent::Promises.resolvable_future
|
95
|
+
route.send(:set_handling_future, promise)
|
103
96
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
97
|
+
promise_handled = Concurrent::Promises.zip(
|
98
|
+
promise,
|
99
|
+
handler_entry.async_handle(wrapped_route)
|
100
|
+
).value!.first
|
108
101
|
|
109
|
-
|
110
|
-
|
102
|
+
promise_handled
|
103
|
+
end
|
111
104
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
105
|
+
@routes.reject!(&:expired?)
|
106
|
+
if @routes.count == 0
|
107
|
+
@channel.async_send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
108
|
+
end
|
116
109
|
|
117
|
-
|
118
|
-
|
119
|
-
|
110
|
+
unless handled
|
111
|
+
route.send(:async_continue_route).rescue do |err|
|
112
|
+
puts err, err.backtrace
|
113
|
+
end
|
120
114
|
end
|
115
|
+
end.rescue do |err|
|
116
|
+
puts err, err.backtrace
|
121
117
|
end
|
122
118
|
end
|
123
119
|
|
@@ -59,13 +59,7 @@ module Playwright
|
|
59
59
|
@channel.on('pageError', ->(params) {
|
60
60
|
emit(Events::Page::PageError, Error.parse(params['error']['error']))
|
61
61
|
})
|
62
|
-
@channel.on('route', ->(params) {
|
63
|
-
Concurrent::Promises.future {
|
64
|
-
on_route(ChannelOwners::Route.from(params['route']))
|
65
|
-
}.rescue do |err|
|
66
|
-
puts err, err.backtrace
|
67
|
-
end
|
68
|
-
})
|
62
|
+
@channel.on('route', ->(params) { on_route(ChannelOwners::Route.from(params['route'])) })
|
69
63
|
@channel.on('video', method(:on_video))
|
70
64
|
@channel.on('webSocket', ->(params) {
|
71
65
|
emit(Events::Page::WebSocket, ChannelOwners::WebSocket.from(params['webSocket']))
|
@@ -108,29 +102,31 @@ module Playwright
|
|
108
102
|
# It is not desired to use PlaywrightApi.wrap directly.
|
109
103
|
# However it is a little difficult to define wrapper for `handler` parameter in generate_api.
|
110
104
|
# Just a workaround...
|
111
|
-
|
105
|
+
Concurrent::Promises.future(PlaywrightApi.wrap(route)) do |wrapped_route|
|
106
|
+
handled = @routes.any? do |handler_entry|
|
107
|
+
next false unless handler_entry.match?(route.request.url)
|
112
108
|
|
113
|
-
|
114
|
-
|
109
|
+
promise = Concurrent::Promises.resolvable_future
|
110
|
+
route.send(:set_handling_future, promise)
|
115
111
|
|
116
|
-
|
117
|
-
|
112
|
+
promise_handled = Concurrent::Promises.zip(
|
113
|
+
promise,
|
114
|
+
handler_entry.async_handle(wrapped_route)
|
115
|
+
).value!.first
|
118
116
|
|
119
|
-
|
120
|
-
|
121
|
-
handler_entry.async_handle(wrapped_route)
|
122
|
-
).value!.first
|
123
|
-
|
124
|
-
promise_handled
|
125
|
-
end
|
117
|
+
promise_handled
|
118
|
+
end
|
126
119
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
120
|
+
@routes.reject!(&:expired?)
|
121
|
+
if @routes.count == 0
|
122
|
+
@channel.async_send_message_to_server('setNetworkInterceptionEnabled', enabled: false)
|
123
|
+
end
|
131
124
|
|
132
|
-
|
133
|
-
|
125
|
+
unless handled
|
126
|
+
@browser_context.send(:on_route, route)
|
127
|
+
end
|
128
|
+
end.rescue do |err|
|
129
|
+
puts err, err.backtrace
|
134
130
|
end
|
135
131
|
end
|
136
132
|
|
@@ -178,6 +174,20 @@ module Playwright
|
|
178
174
|
video.send(:set_artifact, artifact)
|
179
175
|
end
|
180
176
|
|
177
|
+
# @override
|
178
|
+
private def perform_event_emitter_callback(event, callback, args)
|
179
|
+
should_callback_async = [
|
180
|
+
Events::Page::Dialog,
|
181
|
+
Events::Page::Response,
|
182
|
+
].freeze
|
183
|
+
|
184
|
+
if should_callback_async.include?(event)
|
185
|
+
Concurrent::Promises.future { super }
|
186
|
+
else
|
187
|
+
super
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
181
191
|
def context
|
182
192
|
@browser_context
|
183
193
|
end
|
@@ -31,21 +31,27 @@ module Playwright
|
|
31
31
|
body: nil,
|
32
32
|
contentType: nil,
|
33
33
|
headers: nil,
|
34
|
+
json: nil,
|
34
35
|
path: nil,
|
35
36
|
status: nil,
|
36
37
|
response: nil)
|
37
38
|
handling_with_result(true) do
|
38
|
-
|
39
|
-
|
40
|
-
status: status,
|
41
|
-
}.compact
|
39
|
+
option_status = status
|
40
|
+
option_headers = headers
|
42
41
|
option_body = body
|
43
42
|
|
43
|
+
if json
|
44
|
+
raise ArgumentError.new('Can specify either body or json parameters') if body
|
45
|
+
option_body = JSON.generate(json)
|
46
|
+
end
|
47
|
+
|
48
|
+
params = {}
|
49
|
+
|
44
50
|
if response
|
45
|
-
|
46
|
-
|
51
|
+
option_status ||= response.status
|
52
|
+
option_headers ||= response.headers
|
47
53
|
|
48
|
-
if !body && !path && response.is_a?(
|
54
|
+
if !body && !path && response.is_a?(APIResponseImpl)
|
49
55
|
if response.send(:_request).send(:same_connection?, self)
|
50
56
|
params[:fetchResponseUid] = response.send(:fetch_uid)
|
51
57
|
else
|
@@ -63,9 +69,11 @@ module Playwright
|
|
63
69
|
nil
|
64
70
|
end
|
65
71
|
|
66
|
-
param_headers =
|
72
|
+
param_headers = option_headers || {}
|
67
73
|
if contentType
|
68
74
|
param_headers['content-type'] = contentType
|
75
|
+
elsif json
|
76
|
+
param_headers['content-type'] = 'application/json'
|
69
77
|
elsif path
|
70
78
|
param_headers['content-type'] = mime_type_for(path)
|
71
79
|
end
|
@@ -81,6 +89,7 @@ module Playwright
|
|
81
89
|
param_headers['content-length'] ||= content.length.to_s
|
82
90
|
end
|
83
91
|
|
92
|
+
params[:status] = option_status || 200
|
84
93
|
params[:headers] = HttpHeaders.new(param_headers).as_serialized
|
85
94
|
|
86
95
|
@channel.async_send_message_to_server('fulfill', params)
|
@@ -100,6 +109,17 @@ module Playwright
|
|
100
109
|
end
|
101
110
|
end
|
102
111
|
|
112
|
+
def fetch(headers: nil, method: nil, postData: nil, url: nil)
|
113
|
+
api_request_context = request.frame.page.context.request
|
114
|
+
api_request_context.send(:_inner_fetch,
|
115
|
+
request,
|
116
|
+
url,
|
117
|
+
headers: headers,
|
118
|
+
method: method,
|
119
|
+
data: postData,
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
103
123
|
def continue(headers: nil, method: nil, postData: nil, url: nil)
|
104
124
|
overrides = {
|
105
125
|
headers: headers,
|
@@ -38,7 +38,7 @@ module Playwright
|
|
38
38
|
def emit(event, *args)
|
39
39
|
handled = false
|
40
40
|
(@__event_emitter ||= {})[event.to_s]&.each do |callback|
|
41
|
-
callback
|
41
|
+
perform_event_emitter_callback(event, callback, args)
|
42
42
|
handled = true
|
43
43
|
end
|
44
44
|
handled
|
@@ -48,6 +48,11 @@ module Playwright
|
|
48
48
|
((@__event_emitter ||= {})[event.to_s] ||= Set.new).count
|
49
49
|
end
|
50
50
|
|
51
|
+
# can be overriden
|
52
|
+
private def perform_event_emitter_callback(event, callback, args)
|
53
|
+
callback.call(*args)
|
54
|
+
end
|
55
|
+
|
51
56
|
# @param event [String]
|
52
57
|
# @param callback [Proc]
|
53
58
|
def on(event, callback)
|
@@ -263,6 +263,14 @@ module Playwright
|
|
263
263
|
@frame.channel.send_message_to_server('blur', params)
|
264
264
|
end
|
265
265
|
|
266
|
+
def all
|
267
|
+
Enumerator.new do |out|
|
268
|
+
count.times do |i|
|
269
|
+
out << nth(i)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
266
274
|
def count
|
267
275
|
@frame.eval_on_selector_all(@selector, 'ee => ee.length')
|
268
276
|
end
|
data/lib/playwright/version.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
module Playwright
|
2
|
-
# **DEPRECATED** This class is deprecated. Please use other libraries such as [Axe](https://www.deque.com/axe/) if you
|
3
|
-
# need to test page accessibility. See our Node.js [guide](https://playwright.dev/docs/accessibility-testing) for
|
4
|
-
# integration with Axe.
|
5
2
|
#
|
6
3
|
# The Accessibility class provides methods for inspecting Chromium's accessibility tree. The accessibility tree is used by
|
7
4
|
# assistive technology such as [screen readers](https://en.wikipedia.org/wiki/Screen_reader) or
|
@@ -10,23 +7,22 @@ module Playwright
|
|
10
7
|
# Accessibility is a very platform-specific thing. On different platforms, there are different screen readers that might
|
11
8
|
# have wildly different output.
|
12
9
|
#
|
13
|
-
# Rendering engines of Chromium, Firefox and WebKit have a concept of "accessibility tree", which is then translated into
|
14
|
-
#
|
10
|
+
# Rendering engines of Chromium, Firefox and WebKit have a concept of "accessibility tree", which is then translated into different
|
11
|
+
# platform-specific APIs. Accessibility namespace gives access to this Accessibility Tree.
|
15
12
|
#
|
16
|
-
# Most of the accessibility tree gets filtered out when converting from internal browser AX Tree to Platform-specific
|
17
|
-
#
|
18
|
-
#
|
13
|
+
# Most of the accessibility tree gets filtered out when converting from internal browser AX Tree to Platform-specific AX-Tree or by
|
14
|
+
# assistive technologies themselves. By default, Playwright tries to approximate this filtering, exposing only the
|
15
|
+
# "interesting" nodes of the tree.
|
19
16
|
class Accessibility < PlaywrightApi
|
20
17
|
|
21
|
-
# **DEPRECATED** This method is deprecated. Please use other libraries such as [Axe](https://www.deque.com/axe/) if you
|
22
|
-
# need to test page accessibility. See our Node.js [guide](https://playwright.dev/docs/accessibility-testing) for
|
23
|
-
# integration with Axe.
|
24
18
|
#
|
25
19
|
# Captures the current state of the accessibility tree. The returned object represents the root accessible node of the
|
26
20
|
# page.
|
27
21
|
#
|
28
|
-
#
|
29
|
-
#
|
22
|
+
# **NOTE**: The Chromium accessibility tree contains nodes that go unused on most platforms and by most screen readers. Playwright
|
23
|
+
# will discard them as well for an easier to process tree, unless `interestingOnly` is set to `false`.
|
24
|
+
#
|
25
|
+
# **Usage**
|
30
26
|
#
|
31
27
|
# An example of dumping the entire accessibility tree:
|
32
28
|
#
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Playwright
|
2
|
+
#
|
2
3
|
# Playwright has **experimental** support for Android automation. This includes Chrome for Android and Android WebView.
|
3
4
|
#
|
4
5
|
# *Requirements*
|
5
6
|
# - Android device or AVD Emulator.
|
6
|
-
# - [ADB daemon](https://developer.android.com/studio/command-line/adb) running and authenticated with your device.
|
7
|
-
# Typically running `adb devices` is all you need to do.
|
7
|
+
# - [ADB daemon](https://developer.android.com/studio/command-line/adb) running and authenticated with your device. Typically running `adb devices` is all you need to do.
|
8
8
|
# - [`Chrome 87`](https://play.google.com/store/apps/details?id=com.android.chrome) or newer installed on the device
|
9
9
|
# - "Enable command line on non-rooted devices" enabled in `chrome://flags`.
|
10
10
|
#
|
@@ -17,25 +17,27 @@ module Playwright
|
|
17
17
|
#
|
18
18
|
# An example of the Android automation script would be:
|
19
19
|
#
|
20
|
-
# Note that since you don't need Playwright to install web browsers when testing Android, you can omit browser download
|
21
|
-
# via setting the following environment variable when installing Playwright:
|
20
|
+
# Note that since you don't need Playwright to install web browsers when testing Android, you can omit browser download via setting the following environment variable when installing Playwright:
|
22
21
|
#
|
23
22
|
# ```bash js
|
24
23
|
# PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright
|
25
24
|
# ```
|
26
25
|
class Android < PlaywrightApi
|
27
26
|
|
28
|
-
#
|
29
|
-
# Android
|
27
|
+
#
|
28
|
+
# This methods attaches Playwright to an existing Android device.
|
29
|
+
# Use [`method: Android.launchServer`] to launch a new Android server instance.
|
30
30
|
def connect(wsEndpoint, headers: nil, slowMo: nil, timeout: nil)
|
31
31
|
raise NotImplementedError.new('connect is not implemented yet.')
|
32
32
|
end
|
33
33
|
|
34
|
+
#
|
34
35
|
# Returns the list of detected Android devices.
|
35
36
|
def devices(host: nil, omitDriverInstall: nil, port: nil)
|
36
37
|
wrap_impl(@impl.devices(host: unwrap_impl(host), omitDriverInstall: unwrap_impl(omitDriverInstall), port: unwrap_impl(port)))
|
37
38
|
end
|
38
39
|
|
40
|
+
#
|
39
41
|
# This setting will change the default maximum time for all the methods accepting `timeout` option.
|
40
42
|
def set_default_timeout(timeout)
|
41
43
|
raise NotImplementedError.new('set_default_timeout is not implemented yet.')
|