playwright-ruby-client 1.18.0 → 1.18.1
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/documentation/docs/api/api_request.md +7 -0
- data/documentation/docs/api/api_request_context.md +157 -45
- data/documentation/docs/api/api_response.md +104 -0
- data/documentation/docs/api/browser_context.md +4 -0
- data/documentation/docs/api/page.md +4 -0
- data/documentation/docs/include/api_coverage.md +31 -14
- data/lib/playwright/api_response_impl.rb +73 -0
- data/lib/playwright/channel_owners/api_request_context.rb +232 -0
- data/lib/playwright/channel_owners/browser_context.rb +3 -1
- data/lib/playwright/channel_owners/page.rb +4 -0
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright_api/api_request.rb +20 -0
- data/lib/playwright_api/api_request_context.rb +8 -8
- data/lib/playwright_api/api_response.rb +81 -0
- data/lib/playwright_api/browser_context.rb +6 -6
- data/lib/playwright_api/page.rb +6 -6
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4743c153d270bd3343d7f59b53e1ef03ebecf65495804c79ef4561e5db1263ac
|
4
|
+
data.tar.gz: 2f5db2b025b62ebece498cce6edc8f02f85a07377dee2945fbbcfb60e6718c48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36f2d941a86f2533ad494013346f68a3840e33065bf1d3021ff071f6caec635e890378eb7a88df3d096ffa85a86b037e93dae68535c0d30baacc699cb62292a5
|
7
|
+
data.tar.gz: 38757489faccca207351dfc8ff1d5519ee7fe329726a0024fe80fe83eb772abed986dbfcde5ad0b1cd5987a5b79666a4675cb360bb3333b1b29e4065087b2b75
|
@@ -9,51 +9,163 @@ environment or the service to your e2e test. When used on [Page](./page) or a [B
|
|
9
9
|
the cookies from the corresponding [BrowserContext](./browser_context). This means that if you log in using this API, your e2e test will be
|
10
10
|
logged in and vice versa.
|
11
11
|
|
12
|
-
```
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
with sync_playwright() as p:
|
21
|
-
# This will launch a new browser, create a context and page. When making HTTP
|
22
|
-
# requests with the internal APIRequestContext (e.g. `context.request` or `page.request`)
|
23
|
-
# it will automatically set the cookies to the browser page and vise versa.
|
24
|
-
browser = playwright.chromium.launch()
|
25
|
-
context = browser.new_context(base_url="https://api.github.com")
|
26
|
-
api_request_context = context.request
|
27
|
-
page = context.new_page()
|
28
|
-
|
29
|
-
# Alternatively you can create a APIRequestContext manually without having a browser context attached:
|
30
|
-
# api_request_context = playwright.request.new_context(base_url="https://api.github.com")
|
31
|
-
|
32
|
-
|
33
|
-
# Create a repository.
|
34
|
-
response = api_request_context.post(
|
35
|
-
"/user/repos",
|
36
|
-
headers={
|
37
|
-
"Accept": "application/vnd.github.v3+json",
|
38
|
-
# Add GitHub personal access token.
|
39
|
-
"Authorization": f"token {API_TOKEN}",
|
40
|
-
},
|
41
|
-
data={"name": REPO},
|
42
|
-
)
|
43
|
-
assert response.ok
|
44
|
-
assert response.json()["name"] == REPO
|
45
|
-
|
46
|
-
# Delete a repository.
|
47
|
-
response = api_request_context.delete(
|
48
|
-
f"/repos/{USER}/{REPO}",
|
49
|
-
headers={
|
50
|
-
"Accept": "application/vnd.github.v3+json",
|
51
|
-
# Add GitHub personal access token.
|
52
|
-
"Authorization": f"token {API_TOKEN}",
|
53
|
-
},
|
54
|
-
)
|
55
|
-
assert response.ok
|
56
|
-
assert await response.body() == '{"status": "ok"}'
|
12
|
+
```ruby
|
13
|
+
playwright.chromium.launch do |browser|
|
14
|
+
# This will launch a new browser, create a context and page. When making HTTP
|
15
|
+
# requests with the internal APIRequestContext (e.g. `context.request` or `page.request`)
|
16
|
+
# it will automatically set the cookies to the browser page and vise versa.
|
17
|
+
context = browser.new_context(base_url: 'https://api.github,com')
|
18
|
+
api_request_context = context.request
|
57
19
|
|
20
|
+
|
21
|
+
# Create a repository.
|
22
|
+
response = api_request_context.post(
|
23
|
+
"/user/repos",
|
24
|
+
headers: {
|
25
|
+
"Accept": "application/vnd.github.v3+json",
|
26
|
+
"Authorization": "Bearer #{API_TOKEN}",
|
27
|
+
},
|
28
|
+
data: { name: 'test-repo-1' },
|
29
|
+
)
|
30
|
+
response.ok? # => true
|
31
|
+
response.json['name'] # => "tes≈-repo-1"
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
|
36
|
+
## delete
|
37
|
+
|
38
|
+
```
|
39
|
+
def delete(
|
40
|
+
url,
|
41
|
+
data: nil,
|
42
|
+
failOnStatusCode: nil,
|
43
|
+
form: nil,
|
44
|
+
headers: nil,
|
45
|
+
ignoreHTTPSErrors: nil,
|
46
|
+
multipart: nil,
|
47
|
+
params: nil,
|
48
|
+
timeout: nil)
|
49
|
+
```
|
50
|
+
|
51
|
+
Sends HTTP(S) [DELETE](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE) request and returns its
|
52
|
+
response. The method will populate request cookies from the context and update context cookies from the response. The
|
53
|
+
method will automatically follow redirects.
|
54
|
+
|
55
|
+
## dispose
|
56
|
+
|
57
|
+
```
|
58
|
+
def dispose
|
59
|
+
```
|
60
|
+
|
61
|
+
All responses returned by [APIRequestContext#get](./api_request_context#get) and similar methods are stored in the memory, so that you
|
62
|
+
can later call [APIResponse#body](./api_response#body). This method discards all stored responses, and makes
|
63
|
+
[APIResponse#body](./api_response#body) throw "Response disposed" error.
|
64
|
+
|
65
|
+
## fetch
|
66
|
+
|
67
|
+
```
|
68
|
+
def fetch(
|
69
|
+
urlOrRequest,
|
70
|
+
data: nil,
|
71
|
+
failOnStatusCode: nil,
|
72
|
+
form: nil,
|
73
|
+
headers: nil,
|
74
|
+
ignoreHTTPSErrors: nil,
|
75
|
+
method: nil,
|
76
|
+
multipart: nil,
|
77
|
+
params: nil,
|
78
|
+
timeout: nil)
|
79
|
+
```
|
80
|
+
|
81
|
+
Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update
|
82
|
+
context cookies from the response. The method will automatically follow redirects.
|
83
|
+
|
84
|
+
## get
|
85
|
+
|
86
|
+
```
|
87
|
+
def get(
|
88
|
+
url,
|
89
|
+
failOnStatusCode: nil,
|
90
|
+
headers: nil,
|
91
|
+
ignoreHTTPSErrors: nil,
|
92
|
+
params: nil,
|
93
|
+
timeout: nil)
|
94
|
+
```
|
95
|
+
|
96
|
+
Sends HTTP(S) [GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) request and returns its response. The
|
97
|
+
method will populate request cookies from the context and update context cookies from the response. The method will
|
98
|
+
automatically follow redirects.
|
99
|
+
|
100
|
+
## head
|
101
|
+
|
102
|
+
```
|
103
|
+
def head(
|
104
|
+
url,
|
105
|
+
failOnStatusCode: nil,
|
106
|
+
headers: nil,
|
107
|
+
ignoreHTTPSErrors: nil,
|
108
|
+
params: nil,
|
109
|
+
timeout: nil)
|
110
|
+
```
|
111
|
+
|
112
|
+
Sends HTTP(S) [HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) request and returns its response.
|
113
|
+
The method will populate request cookies from the context and update context cookies from the response. The method will
|
114
|
+
automatically follow redirects.
|
115
|
+
|
116
|
+
## patch
|
117
|
+
|
118
|
+
```
|
119
|
+
def patch(
|
120
|
+
url,
|
121
|
+
data: nil,
|
122
|
+
failOnStatusCode: nil,
|
123
|
+
form: nil,
|
124
|
+
headers: nil,
|
125
|
+
ignoreHTTPSErrors: nil,
|
126
|
+
multipart: nil,
|
127
|
+
params: nil,
|
128
|
+
timeout: nil)
|
129
|
+
```
|
130
|
+
|
131
|
+
Sends HTTP(S) [PATCH](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) request and returns its response.
|
132
|
+
The method will populate request cookies from the context and update context cookies from the response. The method will
|
133
|
+
automatically follow redirects.
|
134
|
+
|
135
|
+
## post
|
136
|
+
|
137
|
+
```
|
138
|
+
def post(
|
139
|
+
url,
|
140
|
+
data: nil,
|
141
|
+
failOnStatusCode: nil,
|
142
|
+
form: nil,
|
143
|
+
headers: nil,
|
144
|
+
ignoreHTTPSErrors: nil,
|
145
|
+
multipart: nil,
|
146
|
+
params: nil,
|
147
|
+
timeout: nil)
|
148
|
+
```
|
149
|
+
|
150
|
+
Sends HTTP(S) [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) request and returns its response.
|
151
|
+
The method will populate request cookies from the context and update context cookies from the response. The method will
|
152
|
+
automatically follow redirects.
|
153
|
+
|
154
|
+
## put
|
155
|
+
|
156
|
+
```
|
157
|
+
def put(
|
158
|
+
url,
|
159
|
+
data: nil,
|
160
|
+
failOnStatusCode: nil,
|
161
|
+
form: nil,
|
162
|
+
headers: nil,
|
163
|
+
ignoreHTTPSErrors: nil,
|
164
|
+
multipart: nil,
|
165
|
+
params: nil,
|
166
|
+
timeout: nil)
|
58
167
|
```
|
59
168
|
|
169
|
+
Sends HTTP(S) [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) request and returns its response. The
|
170
|
+
method will populate request cookies from the context and update context cookies from the response. The method will
|
171
|
+
automatically follow redirects.
|
@@ -0,0 +1,104 @@
|
|
1
|
+
---
|
2
|
+
sidebar_position: 10
|
3
|
+
---
|
4
|
+
|
5
|
+
# APIResponse
|
6
|
+
|
7
|
+
[APIResponse](./api_response) class represents responses returned by [APIRequestContext#get](./api_request_context#get) and similar methods.
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
playwright.chromium.launch do |browser|
|
11
|
+
context = browser.new_context
|
12
|
+
response = context.request.get("https://example.com/user/repos")
|
13
|
+
|
14
|
+
response.ok? # => true
|
15
|
+
response.status # => 200
|
16
|
+
response.headers["content-type"] # => "application/json; charset=utf-8"
|
17
|
+
response.json # => { "name" => "Foo" }
|
18
|
+
response.body # => "{ \"name\" => \"Foo\" }"
|
19
|
+
end
|
20
|
+
```
|
21
|
+
|
22
|
+
|
23
|
+
## body
|
24
|
+
|
25
|
+
```
|
26
|
+
def body
|
27
|
+
```
|
28
|
+
|
29
|
+
Returns the buffer with response body.
|
30
|
+
|
31
|
+
## dispose
|
32
|
+
|
33
|
+
```
|
34
|
+
def dispose
|
35
|
+
```
|
36
|
+
|
37
|
+
Disposes the body of this response. If not called then the body will stay in memory until the context closes.
|
38
|
+
|
39
|
+
## headers
|
40
|
+
|
41
|
+
```
|
42
|
+
def headers
|
43
|
+
```
|
44
|
+
|
45
|
+
An object with all the response HTTP headers associated with this response.
|
46
|
+
|
47
|
+
## headers_array
|
48
|
+
|
49
|
+
```
|
50
|
+
def headers_array
|
51
|
+
```
|
52
|
+
|
53
|
+
An array with all the request HTTP headers associated with this response. Header names are not lower-cased. Headers with
|
54
|
+
multiple entries, such as `Set-Cookie`, appear in the array multiple times.
|
55
|
+
|
56
|
+
## json
|
57
|
+
|
58
|
+
```
|
59
|
+
def json
|
60
|
+
```
|
61
|
+
|
62
|
+
Returns the JSON representation of response body.
|
63
|
+
|
64
|
+
This method will throw if the response body is not parsable via `JSON.parse`.
|
65
|
+
|
66
|
+
## ok
|
67
|
+
|
68
|
+
```
|
69
|
+
def ok
|
70
|
+
```
|
71
|
+
|
72
|
+
Contains a boolean stating whether the response was successful (status in the range 200-299) or not.
|
73
|
+
|
74
|
+
## status
|
75
|
+
|
76
|
+
```
|
77
|
+
def status
|
78
|
+
```
|
79
|
+
|
80
|
+
Contains the status code of the response (e.g., 200 for a success).
|
81
|
+
|
82
|
+
## status_text
|
83
|
+
|
84
|
+
```
|
85
|
+
def status_text
|
86
|
+
```
|
87
|
+
|
88
|
+
Contains the status text of the response (e.g. usually an "OK" for a success).
|
89
|
+
|
90
|
+
## text
|
91
|
+
|
92
|
+
```
|
93
|
+
def text
|
94
|
+
```
|
95
|
+
|
96
|
+
Returns the text representation of response body.
|
97
|
+
|
98
|
+
## url
|
99
|
+
|
100
|
+
```
|
101
|
+
def url
|
102
|
+
```
|
103
|
+
|
104
|
+
Contains the URL of the response.
|
@@ -436,4 +436,8 @@ def expect_page(predicate: nil, timeout: nil)
|
|
436
436
|
Performs action and waits for a new [Page](./page) to be created in the context. If predicate is provided, it passes [Page](./page) value into the `predicate` and waits for `predicate.call(page)` to return a truthy value. Will throw an error if
|
437
437
|
the context closes before new [Page](./page) is created.
|
438
438
|
|
439
|
+
## request
|
440
|
+
|
441
|
+
API testing helper associated with this context. Requests made with this API will use context cookies.
|
442
|
+
|
439
443
|
## tracing
|
@@ -1,17 +1,5 @@
|
|
1
1
|
# API coverages
|
2
2
|
|
3
|
-
## APIRequestContext
|
4
|
-
|
5
|
-
* ~~delete~~
|
6
|
-
* ~~dispose~~
|
7
|
-
* ~~fetch~~
|
8
|
-
* ~~get~~
|
9
|
-
* ~~head~~
|
10
|
-
* ~~patch~~
|
11
|
-
* ~~post~~
|
12
|
-
* ~~put~~
|
13
|
-
* ~~storage_state~~
|
14
|
-
|
15
3
|
## Request
|
16
4
|
|
17
5
|
* all_headers
|
@@ -331,7 +319,7 @@
|
|
331
319
|
* accessibility
|
332
320
|
* keyboard
|
333
321
|
* mouse
|
334
|
-
*
|
322
|
+
* request
|
335
323
|
* touchscreen
|
336
324
|
|
337
325
|
## BrowserContext
|
@@ -362,7 +350,7 @@
|
|
362
350
|
* expect_event
|
363
351
|
* expect_page
|
364
352
|
* ~~wait_for_event~~
|
365
|
-
*
|
353
|
+
* request
|
366
354
|
* tracing
|
367
355
|
|
368
356
|
## CDPSession
|
@@ -466,6 +454,35 @@
|
|
466
454
|
## LocalUtils
|
467
455
|
|
468
456
|
|
457
|
+
## APIResponse
|
458
|
+
|
459
|
+
* body
|
460
|
+
* dispose
|
461
|
+
* headers
|
462
|
+
* headers_array
|
463
|
+
* json
|
464
|
+
* ok
|
465
|
+
* status
|
466
|
+
* status_text
|
467
|
+
* text
|
468
|
+
* url
|
469
|
+
|
470
|
+
## APIRequestContext
|
471
|
+
|
472
|
+
* delete
|
473
|
+
* dispose
|
474
|
+
* fetch
|
475
|
+
* get
|
476
|
+
* head
|
477
|
+
* patch
|
478
|
+
* post
|
479
|
+
* put
|
480
|
+
* ~~storage_state~~
|
481
|
+
|
482
|
+
## ~~APIRequest~~
|
483
|
+
|
484
|
+
* ~~new_context~~
|
485
|
+
|
469
486
|
## Android
|
470
487
|
|
471
488
|
* devices
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Playwright
|
2
|
+
define_api_implementation :APIResponseImpl do
|
3
|
+
include Utils::Errors::SafeCloseError
|
4
|
+
|
5
|
+
# @params context [APIRequestContext]
|
6
|
+
# @params initializer [Hash]
|
7
|
+
def initialize(context, initializer)
|
8
|
+
@request = context
|
9
|
+
@initializer = initializer
|
10
|
+
@headers = RawHeaders.new(initializer['headers'])
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
"#<APIResponse url=#{url} status=#{status} status_text=#{status_text}>"
|
15
|
+
end
|
16
|
+
|
17
|
+
def url
|
18
|
+
@initializer['url']
|
19
|
+
end
|
20
|
+
|
21
|
+
def ok
|
22
|
+
(200...300).include?(status)
|
23
|
+
end
|
24
|
+
alias_method :ok?, :ok
|
25
|
+
|
26
|
+
def status
|
27
|
+
@initializer['status']
|
28
|
+
end
|
29
|
+
|
30
|
+
def status_text
|
31
|
+
@initializer['statusText']
|
32
|
+
end
|
33
|
+
|
34
|
+
def headers
|
35
|
+
@headers.headers
|
36
|
+
end
|
37
|
+
|
38
|
+
def headers_array
|
39
|
+
@headers.headers_array
|
40
|
+
end
|
41
|
+
|
42
|
+
class AlreadyDisposedError < StandardError
|
43
|
+
def initialize
|
44
|
+
super('Response has been disposed')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def body
|
49
|
+
binary = @request.channel.send_message_to_server("fetchResponseBody", fetchUid: fetch_uid)
|
50
|
+
raise AlreadyDisposedError.new unless binary
|
51
|
+
Base64.strict_decode64(binary)
|
52
|
+
rescue => err
|
53
|
+
if safe_close_error?(err)
|
54
|
+
raise AlreadyDisposedError.new
|
55
|
+
else
|
56
|
+
raise
|
57
|
+
end
|
58
|
+
end
|
59
|
+
alias_method :text, :body
|
60
|
+
|
61
|
+
def json
|
62
|
+
JSON.parse(text)
|
63
|
+
end
|
64
|
+
|
65
|
+
def dispose
|
66
|
+
@request.channel.send_message_to_server("disposeAPIResponse", fetchUid: fetch_uid)
|
67
|
+
end
|
68
|
+
|
69
|
+
private def fetch_uid
|
70
|
+
@initializer['fetchUid']
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,4 +1,236 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
1
3
|
module Playwright
|
2
4
|
define_channel_owner :APIRequestContext do
|
5
|
+
def dispose
|
6
|
+
@channel.send_message_to_server('dispose')
|
7
|
+
end
|
8
|
+
|
9
|
+
def delete(
|
10
|
+
url,
|
11
|
+
data: nil,
|
12
|
+
failOnStatusCode: nil,
|
13
|
+
form: nil,
|
14
|
+
headers: nil,
|
15
|
+
ignoreHTTPSErrors: nil,
|
16
|
+
multipart: nil,
|
17
|
+
params: nil,
|
18
|
+
timeout: nil)
|
19
|
+
fetch(
|
20
|
+
url,
|
21
|
+
method: 'DELETE',
|
22
|
+
data: data,
|
23
|
+
failOnStatusCode: failOnStatusCode,
|
24
|
+
form: form,
|
25
|
+
headers: headers,
|
26
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
27
|
+
multipart: multipart,
|
28
|
+
params: params,
|
29
|
+
timeout: timeout,
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def head(
|
34
|
+
url,
|
35
|
+
failOnStatusCode: nil,
|
36
|
+
headers: nil,
|
37
|
+
ignoreHTTPSErrors: nil,
|
38
|
+
params: nil,
|
39
|
+
timeout: nil)
|
40
|
+
fetch(
|
41
|
+
url,
|
42
|
+
method: 'HEAD',
|
43
|
+
failOnStatusCode: failOnStatusCode,
|
44
|
+
headers: headers,
|
45
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
46
|
+
params: params,
|
47
|
+
timeout: timeout,
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def get(
|
52
|
+
url,
|
53
|
+
failOnStatusCode: nil,
|
54
|
+
headers: nil,
|
55
|
+
ignoreHTTPSErrors: nil,
|
56
|
+
params: nil,
|
57
|
+
timeout: nil)
|
58
|
+
fetch(
|
59
|
+
url,
|
60
|
+
method: 'GET',
|
61
|
+
failOnStatusCode: failOnStatusCode,
|
62
|
+
headers: headers,
|
63
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
64
|
+
params: params,
|
65
|
+
timeout: timeout,
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
def patch(
|
70
|
+
url,
|
71
|
+
data: nil,
|
72
|
+
failOnStatusCode: nil,
|
73
|
+
form: nil,
|
74
|
+
headers: nil,
|
75
|
+
ignoreHTTPSErrors: nil,
|
76
|
+
multipart: nil,
|
77
|
+
params: nil,
|
78
|
+
timeout: nil)
|
79
|
+
fetch(
|
80
|
+
url,
|
81
|
+
method: 'PATCH',
|
82
|
+
data: data,
|
83
|
+
failOnStatusCode: failOnStatusCode,
|
84
|
+
form: form,
|
85
|
+
headers: headers,
|
86
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
87
|
+
multipart: multipart,
|
88
|
+
params: params,
|
89
|
+
timeout: timeout,
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
def put(
|
94
|
+
url,
|
95
|
+
data: nil,
|
96
|
+
failOnStatusCode: nil,
|
97
|
+
form: nil,
|
98
|
+
headers: nil,
|
99
|
+
ignoreHTTPSErrors: nil,
|
100
|
+
multipart: nil,
|
101
|
+
params: nil,
|
102
|
+
timeout: nil)
|
103
|
+
fetch(
|
104
|
+
url,
|
105
|
+
method: 'PUT',
|
106
|
+
data: data,
|
107
|
+
failOnStatusCode: failOnStatusCode,
|
108
|
+
form: form,
|
109
|
+
headers: headers,
|
110
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
111
|
+
multipart: multipart,
|
112
|
+
params: params,
|
113
|
+
timeout: timeout,
|
114
|
+
)
|
115
|
+
end
|
116
|
+
|
117
|
+
def post(
|
118
|
+
url,
|
119
|
+
data: nil,
|
120
|
+
failOnStatusCode: nil,
|
121
|
+
form: nil,
|
122
|
+
headers: nil,
|
123
|
+
ignoreHTTPSErrors: nil,
|
124
|
+
multipart: nil,
|
125
|
+
params: nil,
|
126
|
+
timeout: nil)
|
127
|
+
fetch(
|
128
|
+
url,
|
129
|
+
method: 'POST',
|
130
|
+
data: data,
|
131
|
+
failOnStatusCode: failOnStatusCode,
|
132
|
+
form: form,
|
133
|
+
headers: headers,
|
134
|
+
ignoreHTTPSErrors: ignoreHTTPSErrors,
|
135
|
+
multipart: multipart,
|
136
|
+
params: params,
|
137
|
+
timeout: timeout,
|
138
|
+
)
|
139
|
+
end
|
140
|
+
|
141
|
+
def fetch(
|
142
|
+
urlOrRequest,
|
143
|
+
data: nil,
|
144
|
+
failOnStatusCode: nil,
|
145
|
+
form: nil,
|
146
|
+
headers: nil,
|
147
|
+
ignoreHTTPSErrors: nil,
|
148
|
+
method: nil,
|
149
|
+
multipart: nil,
|
150
|
+
params: nil,
|
151
|
+
timeout: nil)
|
152
|
+
|
153
|
+
if [ChannelOwners::Request, String].none? { |type| urlOrRequest.is_a?(type) }
|
154
|
+
raise ArgumentError.new("First argument must be either URL string or Request")
|
155
|
+
end
|
156
|
+
if [data, form, multipart].compact.count > 1
|
157
|
+
raise ArgumentError.new("Only one of 'data', 'form' or 'multipart' can be specified")
|
158
|
+
end
|
159
|
+
|
160
|
+
request = urlOrRequest.is_a?(ChannelOwners::Request) ? urlOrRequest : nil
|
161
|
+
headers_obj = headers || request&.headers
|
162
|
+
fetch_params = {
|
163
|
+
url: request&.url || urlOrRequest,
|
164
|
+
params: object_to_array(params),
|
165
|
+
method: method || request&.method || 'GET',
|
166
|
+
headers: headers_obj ? HttpHeaders.new(headers_obj).as_serialized : nil,
|
167
|
+
}
|
168
|
+
|
169
|
+
json_data = nil
|
170
|
+
form_data = nil
|
171
|
+
multipart_data = nil
|
172
|
+
post_data_buffer = nil
|
173
|
+
if data
|
174
|
+
case data
|
175
|
+
when String
|
176
|
+
if headers_obj&.any? { |key, value| key.downcase == 'content-type' && value == 'application/json' }
|
177
|
+
json_data = data
|
178
|
+
else
|
179
|
+
post_data_buffer = data
|
180
|
+
end
|
181
|
+
when Hash, Array, Numeric, true, false
|
182
|
+
json_data = data
|
183
|
+
else
|
184
|
+
raise ArgumentError.new("Unsupported 'data' type: #{data.class}")
|
185
|
+
end
|
186
|
+
elsif form
|
187
|
+
form_data = object_to_array(form)
|
188
|
+
elsif multipart
|
189
|
+
multipart_data = multipart.map do |name, value|
|
190
|
+
if file_payload?(value)
|
191
|
+
{ name: name, file: file_payload_to_json(value) }
|
192
|
+
else
|
193
|
+
{ name: name, value: value.to_s }
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
if !json_data && !form_data && !multipart_data
|
199
|
+
post_data_buffer ||= request&.post_data_buffer
|
200
|
+
end
|
201
|
+
if post_data_buffer
|
202
|
+
fetch_params[:postData] = Base64.strict_encode64(post_data_buffer)
|
203
|
+
end
|
204
|
+
|
205
|
+
fetch_params[:jsonData] = json_data
|
206
|
+
fetch_params[:formData] = form_data
|
207
|
+
fetch_params[:multipartData] = multipart_data
|
208
|
+
fetch_params[:timeout] = timeout
|
209
|
+
fetch_params[:failOnStatusCode] = failOnStatusCode
|
210
|
+
fetch_params[:ignoreHTTPSErrors] = ignoreHTTPSErrors
|
211
|
+
fetch_params.compact!
|
212
|
+
response = @channel.send_message_to_server('fetch', fetch_params)
|
213
|
+
|
214
|
+
APIResponseImpl.new(self, response)
|
215
|
+
end
|
216
|
+
|
217
|
+
private def file_payload?(value)
|
218
|
+
value.is_a?(Hash) &&
|
219
|
+
%w(name mimeType buffer).all? { |key| value.has_key?(key) || value.has_key?(key.to_sym) }
|
220
|
+
end
|
221
|
+
|
222
|
+
private def file_payload_to_json(payload)
|
223
|
+
{
|
224
|
+
name: payload[:name] || payload['name'],
|
225
|
+
mimeType: payload[:mimeType] || payload['mimeType'],
|
226
|
+
buffer: Base64.strict_encode64(payload[:buffer] || payload['buffer'])
|
227
|
+
}
|
228
|
+
end
|
229
|
+
|
230
|
+
private def object_to_array(hash)
|
231
|
+
hash&.map do |key, value|
|
232
|
+
{ name: key, value: value.to_s }
|
233
|
+
end
|
234
|
+
end
|
3
235
|
end
|
4
236
|
end
|
@@ -4,7 +4,7 @@ module Playwright
|
|
4
4
|
include Utils::Errors::SafeCloseError
|
5
5
|
attr_accessor :browser
|
6
6
|
attr_writer :owner_page, :options
|
7
|
-
attr_reader :tracing
|
7
|
+
attr_reader :tracing, :request
|
8
8
|
|
9
9
|
private def after_initialize
|
10
10
|
@pages = Set.new
|
@@ -15,6 +15,8 @@ module Playwright
|
|
15
15
|
@background_pages = Set.new
|
16
16
|
|
17
17
|
@tracing = TracingImpl.new(@channel, self)
|
18
|
+
@request = ChannelOwners::APIRequestContext.from(@initializer['APIRequestContext'])
|
19
|
+
|
18
20
|
@channel.on('bindingCall', ->(params) { on_binding(ChannelOwners::BindingCall.from(params['binding'])) })
|
19
21
|
@channel.once('close', ->(_) { on_close })
|
20
22
|
@channel.on('page', ->(params) { on_page(ChannelOwners::Page.from(params['page']) )})
|
data/lib/playwright/version.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Playwright
|
2
|
+
# Exposes API that can be used for the Web API testing. Each Playwright browser context has a APIRequestContext instance
|
3
|
+
# attached which shares cookies with the page context. Its also possible to create a new APIRequestContext instance
|
4
|
+
# manually. For more information see [here](./class-apirequestcontext).
|
5
|
+
class APIRequest < PlaywrightApi
|
6
|
+
|
7
|
+
# Creates new instances of `APIRequestContext`.
|
8
|
+
def new_context(
|
9
|
+
baseURL: nil,
|
10
|
+
extraHTTPHeaders: nil,
|
11
|
+
httpCredentials: nil,
|
12
|
+
ignoreHTTPSErrors: nil,
|
13
|
+
proxy: nil,
|
14
|
+
storageState: nil,
|
15
|
+
timeout: nil,
|
16
|
+
userAgent: nil)
|
17
|
+
raise NotImplementedError.new('new_context is not implemented yet.')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -65,14 +65,14 @@ module Playwright
|
|
65
65
|
multipart: nil,
|
66
66
|
params: nil,
|
67
67
|
timeout: nil)
|
68
|
-
|
68
|
+
wrap_impl(@impl.delete(unwrap_impl(url), data: unwrap_impl(data), failOnStatusCode: unwrap_impl(failOnStatusCode), form: unwrap_impl(form), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), multipart: unwrap_impl(multipart), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
69
69
|
end
|
70
70
|
|
71
71
|
# All responses returned by [`method: APIRequestContext.get`] and similar methods are stored in the memory, so that you
|
72
72
|
# can later call [`method: APIResponse.body`]. This method discards all stored responses, and makes
|
73
73
|
# [`method: APIResponse.body`] throw "Response disposed" error.
|
74
74
|
def dispose
|
75
|
-
|
75
|
+
wrap_impl(@impl.dispose)
|
76
76
|
end
|
77
77
|
|
78
78
|
# Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update
|
@@ -88,7 +88,7 @@ module Playwright
|
|
88
88
|
multipart: nil,
|
89
89
|
params: nil,
|
90
90
|
timeout: nil)
|
91
|
-
|
91
|
+
wrap_impl(@impl.fetch(unwrap_impl(urlOrRequest), data: unwrap_impl(data), failOnStatusCode: unwrap_impl(failOnStatusCode), form: unwrap_impl(form), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), method: unwrap_impl(method), multipart: unwrap_impl(multipart), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
92
92
|
end
|
93
93
|
|
94
94
|
# Sends HTTP(S) [GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) request and returns its response. The
|
@@ -101,7 +101,7 @@ module Playwright
|
|
101
101
|
ignoreHTTPSErrors: nil,
|
102
102
|
params: nil,
|
103
103
|
timeout: nil)
|
104
|
-
|
104
|
+
wrap_impl(@impl.get(unwrap_impl(url), failOnStatusCode: unwrap_impl(failOnStatusCode), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
105
105
|
end
|
106
106
|
|
107
107
|
# Sends HTTP(S) [HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) request and returns its response.
|
@@ -114,7 +114,7 @@ module Playwright
|
|
114
114
|
ignoreHTTPSErrors: nil,
|
115
115
|
params: nil,
|
116
116
|
timeout: nil)
|
117
|
-
|
117
|
+
wrap_impl(@impl.head(unwrap_impl(url), failOnStatusCode: unwrap_impl(failOnStatusCode), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
118
118
|
end
|
119
119
|
|
120
120
|
# Sends HTTP(S) [PATCH](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) request and returns its response.
|
@@ -130,7 +130,7 @@ module Playwright
|
|
130
130
|
multipart: nil,
|
131
131
|
params: nil,
|
132
132
|
timeout: nil)
|
133
|
-
|
133
|
+
wrap_impl(@impl.patch(unwrap_impl(url), data: unwrap_impl(data), failOnStatusCode: unwrap_impl(failOnStatusCode), form: unwrap_impl(form), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), multipart: unwrap_impl(multipart), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
134
134
|
end
|
135
135
|
|
136
136
|
# Sends HTTP(S) [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) request and returns its response.
|
@@ -146,7 +146,7 @@ module Playwright
|
|
146
146
|
multipart: nil,
|
147
147
|
params: nil,
|
148
148
|
timeout: nil)
|
149
|
-
|
149
|
+
wrap_impl(@impl.post(unwrap_impl(url), data: unwrap_impl(data), failOnStatusCode: unwrap_impl(failOnStatusCode), form: unwrap_impl(form), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), multipart: unwrap_impl(multipart), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
150
150
|
end
|
151
151
|
|
152
152
|
# Sends HTTP(S) [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) request and returns its response. The
|
@@ -162,7 +162,7 @@ module Playwright
|
|
162
162
|
multipart: nil,
|
163
163
|
params: nil,
|
164
164
|
timeout: nil)
|
165
|
-
|
165
|
+
wrap_impl(@impl.put(unwrap_impl(url), data: unwrap_impl(data), failOnStatusCode: unwrap_impl(failOnStatusCode), form: unwrap_impl(form), headers: unwrap_impl(headers), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), multipart: unwrap_impl(multipart), params: unwrap_impl(params), timeout: unwrap_impl(timeout)))
|
166
166
|
end
|
167
167
|
|
168
168
|
# Returns storage state for this request context, contains current cookies and local storage snapshot if it was passed to
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Playwright
|
2
|
+
# `APIResponse` class represents responses returned by [`method: APIRequestContext.get`] and similar methods.
|
3
|
+
#
|
4
|
+
# ```python sync
|
5
|
+
# from playwright.sync_api import sync_playwright
|
6
|
+
#
|
7
|
+
# with sync_playwright() as p:
|
8
|
+
# context = playwright.request.new_context()
|
9
|
+
# response = context.get("https://example.com/user/repos")
|
10
|
+
# assert response.ok
|
11
|
+
# assert response.status == 200
|
12
|
+
# assert response.headers["content-type"] == "application/json; charset=utf-8"
|
13
|
+
# assert response.json()["name"] == "foobar"
|
14
|
+
# assert response.body() == '{"status": "ok"}'
|
15
|
+
# ```
|
16
|
+
class APIResponse < PlaywrightApi
|
17
|
+
|
18
|
+
# Returns the buffer with response body.
|
19
|
+
def body
|
20
|
+
wrap_impl(@impl.body)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Disposes the body of this response. If not called then the body will stay in memory until the context closes.
|
24
|
+
def dispose
|
25
|
+
wrap_impl(@impl.dispose)
|
26
|
+
end
|
27
|
+
|
28
|
+
# An object with all the response HTTP headers associated with this response.
|
29
|
+
def headers
|
30
|
+
wrap_impl(@impl.headers)
|
31
|
+
end
|
32
|
+
|
33
|
+
# An array with all the request HTTP headers associated with this response. Header names are not lower-cased. Headers with
|
34
|
+
# multiple entries, such as `Set-Cookie`, appear in the array multiple times.
|
35
|
+
def headers_array
|
36
|
+
wrap_impl(@impl.headers_array)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the JSON representation of response body.
|
40
|
+
#
|
41
|
+
# This method will throw if the response body is not parsable via `JSON.parse`.
|
42
|
+
def json
|
43
|
+
wrap_impl(@impl.json)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Contains a boolean stating whether the response was successful (status in the range 200-299) or not.
|
47
|
+
def ok
|
48
|
+
wrap_impl(@impl.ok)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Contains the status code of the response (e.g., 200 for a success).
|
52
|
+
def status
|
53
|
+
wrap_impl(@impl.status)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Contains the status text of the response (e.g. usually an "OK" for a success).
|
57
|
+
def status_text
|
58
|
+
wrap_impl(@impl.status_text)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns the text representation of response body.
|
62
|
+
def text
|
63
|
+
wrap_impl(@impl.text)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Contains the URL of the response.
|
67
|
+
def url
|
68
|
+
wrap_impl(@impl.url)
|
69
|
+
end
|
70
|
+
|
71
|
+
# @nodoc
|
72
|
+
def ok?
|
73
|
+
wrap_impl(@impl.ok?)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @nodoc
|
77
|
+
def to_s
|
78
|
+
wrap_impl(@impl.to_s)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -22,7 +22,7 @@ module Playwright
|
|
22
22
|
|
23
23
|
# API testing helper associated with this context. Requests made with this API will use context cookies.
|
24
24
|
def request # property
|
25
|
-
|
25
|
+
wrap_impl(@impl.request)
|
26
26
|
end
|
27
27
|
|
28
28
|
def tracing # property
|
@@ -376,6 +376,11 @@ module Playwright
|
|
376
376
|
wrap_impl(@impl.pause)
|
377
377
|
end
|
378
378
|
|
379
|
+
# @nodoc
|
380
|
+
def enable_debug_console!
|
381
|
+
wrap_impl(@impl.enable_debug_console!)
|
382
|
+
end
|
383
|
+
|
379
384
|
# @nodoc
|
380
385
|
def browser=(req)
|
381
386
|
wrap_impl(@impl.browser=(unwrap_impl(req)))
|
@@ -391,11 +396,6 @@ module Playwright
|
|
391
396
|
wrap_impl(@impl.options=(unwrap_impl(req)))
|
392
397
|
end
|
393
398
|
|
394
|
-
# @nodoc
|
395
|
-
def enable_debug_console!
|
396
|
-
wrap_impl(@impl.enable_debug_console!)
|
397
|
-
end
|
398
|
-
|
399
399
|
# -- inherited from EventEmitter --
|
400
400
|
# @nodoc
|
401
401
|
def once(event, callback)
|
data/lib/playwright_api/page.rb
CHANGED
@@ -58,7 +58,7 @@ module Playwright
|
|
58
58
|
|
59
59
|
# API testing helper associated with this page. Requests made with this API will use page cookies.
|
60
60
|
def request # property
|
61
|
-
|
61
|
+
wrap_impl(@impl.request)
|
62
62
|
end
|
63
63
|
|
64
64
|
def touchscreen # property
|
@@ -1391,11 +1391,6 @@ module Playwright
|
|
1391
1391
|
wrap_impl(@impl.start_js_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
|
1392
1392
|
end
|
1393
1393
|
|
1394
|
-
# @nodoc
|
1395
|
-
def stop_js_coverage
|
1396
|
-
wrap_impl(@impl.stop_js_coverage)
|
1397
|
-
end
|
1398
|
-
|
1399
1394
|
# @nodoc
|
1400
1395
|
def start_css_coverage(resetOnNavigation: nil, reportAnonymousScripts: nil)
|
1401
1396
|
wrap_impl(@impl.start_css_coverage(resetOnNavigation: unwrap_impl(resetOnNavigation), reportAnonymousScripts: unwrap_impl(reportAnonymousScripts)))
|
@@ -1406,6 +1401,11 @@ module Playwright
|
|
1406
1401
|
wrap_impl(@impl.stop_css_coverage)
|
1407
1402
|
end
|
1408
1403
|
|
1404
|
+
# @nodoc
|
1405
|
+
def stop_js_coverage
|
1406
|
+
wrap_impl(@impl.stop_js_coverage)
|
1407
|
+
end
|
1408
|
+
|
1409
1409
|
# @nodoc
|
1410
1410
|
def guid
|
1411
1411
|
wrap_impl(@impl.guid)
|
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: 1.18.
|
4
|
+
version: 1.18.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YusukeIwaki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -210,7 +210,9 @@ files:
|
|
210
210
|
- documentation/README.md
|
211
211
|
- documentation/babel.config.js
|
212
212
|
- documentation/docs/api/accessibility.md
|
213
|
+
- documentation/docs/api/api_request.md
|
213
214
|
- documentation/docs/api/api_request_context.md
|
215
|
+
- documentation/docs/api/api_response.md
|
214
216
|
- documentation/docs/api/browser.md
|
215
217
|
- documentation/docs/api/browser_context.md
|
216
218
|
- documentation/docs/api/browser_type.md
|
@@ -275,6 +277,7 @@ files:
|
|
275
277
|
- lib/playwright/accessibility_impl.rb
|
276
278
|
- lib/playwright/android_input_impl.rb
|
277
279
|
- lib/playwright/api_implementation.rb
|
280
|
+
- lib/playwright/api_response_impl.rb
|
278
281
|
- lib/playwright/channel.rb
|
279
282
|
- lib/playwright/channel_owner.rb
|
280
283
|
- lib/playwright/channel_owners/android.rb
|
@@ -341,7 +344,9 @@ files:
|
|
341
344
|
- lib/playwright_api/android_input.rb
|
342
345
|
- lib/playwright_api/android_socket.rb
|
343
346
|
- lib/playwright_api/android_web_view.rb
|
347
|
+
- lib/playwright_api/api_request.rb
|
344
348
|
- lib/playwright_api/api_request_context.rb
|
349
|
+
- lib/playwright_api/api_response.rb
|
345
350
|
- lib/playwright_api/browser.rb
|
346
351
|
- lib/playwright_api/browser_context.rb
|
347
352
|
- lib/playwright_api/browser_type.rb
|
@@ -391,5 +396,5 @@ requirements: []
|
|
391
396
|
rubygems_version: 3.3.3
|
392
397
|
signing_key:
|
393
398
|
specification_version: 4
|
394
|
-
summary: The Ruby binding of playwright driver 1.18.
|
399
|
+
summary: The Ruby binding of playwright driver 1.18.1
|
395
400
|
test_files: []
|