playwright-ruby-client 1.18.0 → 1.19.0

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/api_request.md +7 -0
  3. data/documentation/docs/api/api_request_context.md +167 -45
  4. data/documentation/docs/api/api_response.md +104 -0
  5. data/documentation/docs/api/browser_context.md +4 -0
  6. data/documentation/docs/api/frame.md +1 -1
  7. data/documentation/docs/api/frame_locator.md +1 -1
  8. data/documentation/docs/api/locator.md +10 -2
  9. data/documentation/docs/api/page.md +9 -1
  10. data/documentation/docs/api/route.md +1 -0
  11. data/documentation/docs/api/tracing.md +6 -1
  12. data/documentation/docs/include/api_coverage.md +32 -14
  13. data/lib/playwright/api_response_impl.rb +77 -0
  14. data/lib/playwright/channel_owner.rb +4 -0
  15. data/lib/playwright/channel_owners/api_request_context.rb +236 -0
  16. data/lib/playwright/channel_owners/browser_context.rb +13 -10
  17. data/lib/playwright/channel_owners/frame.rb +2 -2
  18. data/lib/playwright/channel_owners/page.rb +15 -5
  19. data/lib/playwright/channel_owners/route.rb +18 -4
  20. data/lib/playwright/{tracing_impl.rb → channel_owners/tracing.rb} +4 -8
  21. data/lib/playwright/frame_locator_impl.rb +2 -1
  22. data/lib/playwright/locator_impl.rb +42 -15
  23. data/lib/playwright/route_handler.rb +11 -8
  24. data/lib/playwright/transport.rb +1 -1
  25. data/lib/playwright/version.rb +2 -2
  26. data/lib/playwright_api/android.rb +6 -6
  27. data/lib/playwright_api/android_device.rb +6 -6
  28. data/lib/playwright_api/api_request.rb +20 -0
  29. data/lib/playwright_api/api_request_context.rb +16 -16
  30. data/lib/playwright_api/api_response.rb +81 -0
  31. data/lib/playwright_api/browser.rb +6 -6
  32. data/lib/playwright_api/browser_context.rb +9 -9
  33. data/lib/playwright_api/browser_type.rb +6 -6
  34. data/lib/playwright_api/cdp_session.rb +6 -6
  35. data/lib/playwright_api/console_message.rb +6 -6
  36. data/lib/playwright_api/dialog.rb +6 -6
  37. data/lib/playwright_api/element_handle.rb +6 -6
  38. data/lib/playwright_api/frame.rb +8 -8
  39. data/lib/playwright_api/frame_locator.rb +2 -2
  40. data/lib/playwright_api/js_handle.rb +6 -6
  41. data/lib/playwright_api/locator.rb +8 -3
  42. data/lib/playwright_api/page.rb +18 -18
  43. data/lib/playwright_api/playwright.rb +8 -8
  44. data/lib/playwright_api/request.rb +6 -6
  45. data/lib/playwright_api/response.rb +6 -6
  46. data/lib/playwright_api/route.rb +8 -7
  47. data/lib/playwright_api/selectors.rb +6 -6
  48. data/lib/playwright_api/tracing.rb +29 -2
  49. data/lib/playwright_api/web_socket.rb +6 -6
  50. data/lib/playwright_api/worker.rb +6 -6
  51. metadata +10 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd0b003cf0d53da6959d90b63c1b925e5d5545b06a96c54f40109fb943bc4d6e
4
- data.tar.gz: 19db226c5ad72e480967e2476b6500607121d1b698396ff66061233eff46eeb1
3
+ metadata.gz: bfbbc528927aa551597f30f0abb057a13609726f473cfd6c625a97d135d0b705
4
+ data.tar.gz: f3f8dda3439bfaa0d3a8796ee8ed6eb453ae9934e9bf0b1768a8a0c9a62d5e4f
5
5
  SHA512:
6
- metadata.gz: 49ad61dde3eb71a242401225fb16c834dc6ec75f5f5b8baef959f0a162b0fac5960373b6fa2cc091f90e9dfe90bc66c72ec7858af42000c37a543daa6520974d
7
- data.tar.gz: 3492a3ce647a6ee0e44ca38f10948e0b6d6a8c818595ebf4d8f57bed802ebce6065d5f8d507bbc617d2fe8d075556c8f031ede00fab902d39b77dabe1be9ec42
6
+ metadata.gz: 14e62113089e96e77fd11dabdda86582ac5c4004465a4007396b71a954927396e1a77c5abf2c10199e43b41b119a5879bbdf491400ec8de5d9f1bd2b3da19ef8
7
+ data.tar.gz: 6ee4b4854cf14ba4cd1cad9dd4c847cea5dea58c892298e15daecce174754b35beccfaff8386f9c97ca103d500aeea476f82c232fa88291741d075685d2fc789
@@ -0,0 +1,7 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # APIRequest
6
+
7
+ Not Implemented
@@ -9,51 +9,173 @@ 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
- ```python sync title=example_6db210740dd2dcb4551c2207b3204fde7127b24c7850226b273d15c0d6624ba5.py
13
- import os
14
- from playwright.sync_api import sync_playwright
15
-
16
- REPO = "test-repo-1"
17
- USER = "github-username"
18
- API_TOKEN = os.getenv("GITHUB_API_TOKEN")
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'] # => "test-repo-1"
32
+
33
+ # Delete a repository.
34
+ response = api_request_context.delete(
35
+ "/repos/YourName/test-repo-1",
36
+ headers: {
37
+ "Accept": "application/vnd.github.v3+json",
38
+ "Authorization": "Bearer #{API_TOKEN}",
39
+ },
40
+ )
41
+ response.ok? # => true
42
+ end
43
+ ```
44
+
45
+
46
+ ## delete
47
+
48
+ ```
49
+ def delete(
50
+ url,
51
+ data: nil,
52
+ failOnStatusCode: nil,
53
+ form: nil,
54
+ headers: nil,
55
+ ignoreHTTPSErrors: nil,
56
+ multipart: nil,
57
+ params: nil,
58
+ timeout: nil)
59
+ ```
60
+
61
+ Sends HTTP(S) [DELETE](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE) request and returns its
62
+ response. The method will populate request cookies from the context and update context cookies from the response. The
63
+ method will automatically follow redirects.
64
+
65
+ ## dispose
66
+
67
+ ```
68
+ def dispose
69
+ ```
70
+
71
+ All responses returned by [APIRequestContext#get](./api_request_context#get) and similar methods are stored in the memory, so that you
72
+ can later call [APIResponse#body](./api_response#body). This method discards all stored responses, and makes
73
+ [APIResponse#body](./api_response#body) throw "Response disposed" error.
74
+
75
+ ## fetch
76
+
77
+ ```
78
+ def fetch(
79
+ urlOrRequest,
80
+ data: nil,
81
+ failOnStatusCode: nil,
82
+ form: nil,
83
+ headers: nil,
84
+ ignoreHTTPSErrors: nil,
85
+ method: nil,
86
+ multipart: nil,
87
+ params: nil,
88
+ timeout: nil)
89
+ ```
90
+
91
+ Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update
92
+ context cookies from the response. The method will automatically follow redirects.
93
+
94
+ ## get
95
+
96
+ ```
97
+ def get(
98
+ url,
99
+ failOnStatusCode: nil,
100
+ headers: nil,
101
+ ignoreHTTPSErrors: nil,
102
+ params: nil,
103
+ timeout: nil)
104
+ ```
105
+
106
+ Sends HTTP(S) [GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) request and returns its response. The
107
+ method will populate request cookies from the context and update context cookies from the response. The method will
108
+ automatically follow redirects.
109
+
110
+ ## head
111
+
112
+ ```
113
+ def head(
114
+ url,
115
+ failOnStatusCode: nil,
116
+ headers: nil,
117
+ ignoreHTTPSErrors: nil,
118
+ params: nil,
119
+ timeout: nil)
120
+ ```
121
+
122
+ Sends HTTP(S) [HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) request and returns its response.
123
+ The method will populate request cookies from the context and update context cookies from the response. The method will
124
+ automatically follow redirects.
125
+
126
+ ## patch
127
+
128
+ ```
129
+ def patch(
130
+ url,
131
+ data: nil,
132
+ failOnStatusCode: nil,
133
+ form: nil,
134
+ headers: nil,
135
+ ignoreHTTPSErrors: nil,
136
+ multipart: nil,
137
+ params: nil,
138
+ timeout: nil)
139
+ ```
140
+
141
+ Sends HTTP(S) [PATCH](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) request and returns its response.
142
+ The method will populate request cookies from the context and update context cookies from the response. The method will
143
+ automatically follow redirects.
144
+
145
+ ## post
146
+
147
+ ```
148
+ def post(
149
+ url,
150
+ data: nil,
151
+ failOnStatusCode: nil,
152
+ form: nil,
153
+ headers: nil,
154
+ ignoreHTTPSErrors: nil,
155
+ multipart: nil,
156
+ params: nil,
157
+ timeout: nil)
158
+ ```
159
+
160
+ Sends HTTP(S) [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) request and returns its response.
161
+ The method will populate request cookies from the context and update context cookies from the response. The method will
162
+ automatically follow redirects.
163
+
164
+ ## put
165
+
166
+ ```
167
+ def put(
168
+ url,
169
+ data: nil,
170
+ failOnStatusCode: nil,
171
+ form: nil,
172
+ headers: nil,
173
+ ignoreHTTPSErrors: nil,
174
+ multipart: nil,
175
+ params: nil,
176
+ timeout: nil)
58
177
  ```
59
178
 
179
+ Sends HTTP(S) [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) request and returns its response. The
180
+ method will populate request cookies from the context and update context cookies from the response. The method will
181
+ 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
@@ -549,7 +549,7 @@ considered not visible.
549
549
  ## locator
550
550
 
551
551
  ```
552
- def locator(selector, hasText: nil)
552
+ def locator(selector, has: nil, hasText: nil)
553
553
  ```
554
554
 
555
555
  The method returns an element locator that can be used to perform actions in the frame. Locator is resolved to the
@@ -65,7 +65,7 @@ Returns locator to the last matching frame.
65
65
  ## locator
66
66
 
67
67
  ```
68
- def locator(selector, hasText: nil)
68
+ def locator(selector, has: nil, hasText: nil)
69
69
  ```
70
70
 
71
71
  The method finds an element matching the specified selector in the FrameLocator's subtree.
@@ -311,7 +311,7 @@ When working with iframes, you can create a frame locator that will enter the if
311
311
  that iframe:
312
312
 
313
313
  ```ruby
314
- locator = page.frame_locator("text=Submit").locator("text=Submit")
314
+ locator = page.frame_locator("iframe").locator("text=Submit")
315
315
  locator.click
316
316
  ```
317
317
 
@@ -430,7 +430,7 @@ Returns locator to the last matching element.
430
430
  ## locator
431
431
 
432
432
  ```
433
- def locator(selector, hasText: nil)
433
+ def locator(selector, has: nil, hasText: nil)
434
434
  ```
435
435
 
436
436
  The method finds an element matching the specified selector in the [Locator](./locator)'s subtree.
@@ -443,6 +443,14 @@ def nth(index)
443
443
 
444
444
  Returns locator to the n-th matching element.
445
445
 
446
+ ## page
447
+
448
+ ```
449
+ def page
450
+ ```
451
+
452
+ A page this locator belongs to.
453
+
446
454
  ## press
447
455
 
448
456
  ```
@@ -774,7 +774,7 @@ considered not visible.
774
774
  ## locator
775
775
 
776
776
  ```
777
- def locator(selector, hasText: nil)
777
+ def locator(selector, has: nil, hasText: nil)
778
778
  ```
779
779
 
780
780
  The method returns an element locator that can be used to perform actions on the page. Locator is resolved to the
@@ -1491,6 +1491,9 @@ response = page.expect_response(/example.com\/resource/) do
1491
1491
  page.click("input")
1492
1492
  end
1493
1493
  puts response.body
1494
+ puts response.ok?
1495
+
1496
+ page.wait_for_load_state # wait for request finished.
1494
1497
 
1495
1498
  # or with a predicate
1496
1499
  page.content = '<form action="https://example.com/resource"><input type="submit" /></form>'
@@ -1498,6 +1501,7 @@ response = page.expect_response(->(res) { res.url.start_with? 'https://example.c
1498
1501
  page.click("input")
1499
1502
  end
1500
1503
  puts response.body
1504
+ puts response.ok?
1501
1505
  ```
1502
1506
 
1503
1507
 
@@ -1597,4 +1601,8 @@ associated with the page.
1597
1601
 
1598
1602
  ## mouse
1599
1603
 
1604
+ ## request
1605
+
1606
+ API testing helper associated with this page. Requests made with this API will use page cookies.
1607
+
1600
1608
  ## touchscreen
@@ -45,6 +45,7 @@ def fulfill(
45
45
  contentType: nil,
46
46
  headers: nil,
47
47
  path: nil,
48
+ response: nil,
48
49
  status: nil)
49
50
  ```
50
51
 
@@ -23,7 +23,12 @@ end
23
23
  ## start
24
24
 
25
25
  ```
26
- def start(name: nil, screenshots: nil, snapshots: nil, title: nil)
26
+ def start(
27
+ name: nil,
28
+ screenshots: nil,
29
+ snapshots: nil,
30
+ sources: nil,
31
+ title: nil)
27
32
  ```
28
33
 
29
34
  Start 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
- * ~~request~~
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
- * ~~request~~
353
+ * request
366
354
  * tracing
367
355
 
368
356
  ## CDPSession
@@ -442,6 +430,7 @@
442
430
  * last
443
431
  * locator
444
432
  * nth
433
+ * page
445
434
  * press
446
435
  * screenshot
447
436
  * scroll_into_view_if_needed
@@ -466,6 +455,35 @@
466
455
  ## LocalUtils
467
456
 
468
457
 
458
+ ## APIResponse
459
+
460
+ * body
461
+ * dispose
462
+ * headers
463
+ * headers_array
464
+ * json
465
+ * ok
466
+ * status
467
+ * status_text
468
+ * text
469
+ * url
470
+
471
+ ## APIRequestContext
472
+
473
+ * delete
474
+ * dispose
475
+ * fetch
476
+ * get
477
+ * head
478
+ * patch
479
+ * post
480
+ * put
481
+ * ~~storage_state~~
482
+
483
+ ## ~~APIRequest~~
484
+
485
+ * ~~new_context~~
486
+
469
487
  ## Android
470
488
 
471
489
  * devices
@@ -0,0 +1,77 @@
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 _request
70
+ @request
71
+ end
72
+
73
+ private def fetch_uid
74
+ @initializer['fetchUid']
75
+ end
76
+ end
77
+ end
@@ -72,6 +72,10 @@ module Playwright
72
72
  private def delete_object_from_child(guid)
73
73
  @objects.delete(guid)
74
74
  end
75
+
76
+ private def same_connection?(other)
77
+ @connection == other.instance_variable_get(:@connection)
78
+ end
75
79
  end
76
80
 
77
81
  class RootChannelOwner < ChannelOwner