playwright-ruby-client 1.42.0 → 1.43.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/documentation/docs/api/browser_context.md +22 -10
  4. data/documentation/docs/api/frame_locator.md +26 -4
  5. data/documentation/docs/api/locator.md +22 -0
  6. data/documentation/docs/api/page.md +10 -8
  7. data/documentation/docs/article/guides/download_playwright_driver.md +7 -10
  8. data/documentation/docs/article/guides/playwright_on_alpine_linux.md +3 -1
  9. data/documentation/docs/include/api_coverage.md +2 -0
  10. data/documentation/docusaurus.config.js +6 -0
  11. data/documentation/package.json +2 -2
  12. data/documentation/yarn.lock +1732 -1815
  13. data/lib/playwright/channel_owners/browser_context.rb +31 -2
  14. data/lib/playwright/channel_owners/js_handle.rb +4 -0
  15. data/lib/playwright/channel_owners/request.rb +1 -1
  16. data/lib/playwright/connection.rb +3 -0
  17. data/lib/playwright/frame_locator_impl.rb +8 -0
  18. data/lib/playwright/locator_impl.rb +8 -0
  19. data/lib/playwright/transport.rb +6 -0
  20. data/lib/playwright/version.rb +2 -2
  21. data/lib/playwright/waiter.rb +4 -6
  22. data/lib/playwright/web_socket_transport.rb +8 -0
  23. data/lib/playwright.rb +1 -1
  24. data/lib/playwright_api/android.rb +6 -6
  25. data/lib/playwright_api/android_device.rb +6 -6
  26. data/lib/playwright_api/api_request_context.rb +6 -6
  27. data/lib/playwright_api/browser.rb +6 -6
  28. data/lib/playwright_api/browser_context.rb +24 -14
  29. data/lib/playwright_api/browser_type.rb +6 -6
  30. data/lib/playwright_api/cdp_session.rb +6 -6
  31. data/lib/playwright_api/dialog.rb +6 -6
  32. data/lib/playwright_api/element_handle.rb +6 -6
  33. data/lib/playwright_api/frame.rb +6 -6
  34. data/lib/playwright_api/frame_locator.rb +23 -4
  35. data/lib/playwright_api/js_handle.rb +6 -6
  36. data/lib/playwright_api/locator.rb +19 -0
  37. data/lib/playwright_api/page.rb +26 -22
  38. data/lib/playwright_api/playwright.rb +6 -6
  39. data/lib/playwright_api/request.rb +6 -6
  40. data/lib/playwright_api/response.rb +6 -6
  41. data/lib/playwright_api/route.rb +6 -6
  42. data/lib/playwright_api/selectors.rb +6 -6
  43. data/lib/playwright_api/tracing.rb +6 -6
  44. data/lib/playwright_api/web_socket.rb +6 -6
  45. data/lib/playwright_api/worker.rb +6 -6
  46. data/sig/playwright.rbs +3 -1
  47. metadata +3 -3
@@ -267,8 +267,37 @@ module Playwright
267
267
  @channel.send_message_to_server('addCookies', cookies: cookies)
268
268
  end
269
269
 
270
- def clear_cookies
271
- @channel.send_message_to_server('clearCookies')
270
+ def clear_cookies(domain: nil, name: nil, path: nil)
271
+ params = {}
272
+
273
+ case name
274
+ when String
275
+ params[:name] = name
276
+ when Regexp
277
+ regex = JavaScript::Regex.new(name)
278
+ params[:nameRegexSource] = regex.source
279
+ params[:nameRegexFlags] = regex.flag
280
+ end
281
+
282
+ case domain
283
+ when String
284
+ params[:domain] = domain
285
+ when Regexp
286
+ regex = JavaScript::Regex.new(domain)
287
+ params[:domainRegexSource] = regex.source
288
+ params[:domainRegexFlags] = regex.flag
289
+ end
290
+
291
+ case path
292
+ when String
293
+ params[:path] = path
294
+ when Regexp
295
+ regex = JavaScript::Regex.new(path)
296
+ params[:pathRegexSource] = regex.source
297
+ params[:pathRegexFlags] = regex.flag
298
+ end
299
+
300
+ @channel.send_message_to_server('clearCookies', params)
272
301
  end
273
302
 
274
303
  def grant_permissions(permissions, origin: nil)
@@ -1,5 +1,7 @@
1
1
  module Playwright
2
2
  define_channel_owner :JSHandle do
3
+ include Utils::Errors::TargetClosedErrorMethods
4
+
3
5
  private def after_initialize
4
6
  @preview = @initializer['preview']
5
7
  @channel.on('previewUpdated', method(:on_preview_updated))
@@ -37,6 +39,8 @@ module Playwright
37
39
 
38
40
  def dispose
39
41
  @channel.send_message_to_server('dispose')
42
+ rescue => err
43
+ raise if !target_closed_error?(err)
40
44
  end
41
45
 
42
46
  def json_value
@@ -62,7 +62,7 @@ module Playwright
62
62
  content_type = headers['content-type']
63
63
  return unless content_type
64
64
 
65
- if content_type == "application/x-www-form-urlencoded"
65
+ if content_type.include?("application/x-www-form-urlencoded")
66
66
  URI.decode_www_form(data).to_h
67
67
  else
68
68
  JSON.parse(data)
@@ -16,6 +16,9 @@ module Playwright
16
16
  end
17
17
  raise ::Playwright::DriverCrashedError.new
18
18
  end
19
+ @transport.on_driver_closed do
20
+ cleanup
21
+ end
19
22
 
20
23
  @objects = {} # Hash[ guid => ChannelOwner ]
21
24
  @waiting_for_object = {} # Hash[ guid => Promise<ChannelOwner> ]
@@ -26,6 +26,14 @@ module Playwright
26
26
  hasText: hasText)
27
27
  end
28
28
 
29
+ def owner
30
+ LocatorImpl.new(
31
+ frame: @frame,
32
+ timeout_settings: @timeout_settings,
33
+ selector: @frame_selector,
34
+ )
35
+ end
36
+
29
37
  def frame_locator(selector)
30
38
  FrameLocatorImpl.new(
31
39
  frame: @frame,
@@ -233,6 +233,14 @@ module Playwright
233
233
  @frame.query_selector_all(@selector)
234
234
  end
235
235
 
236
+ def content_frame
237
+ FrameLocatorImpl.new(
238
+ frame: @frame,
239
+ timeout_settings: @timeout_settings,
240
+ frame_selector: @selector,
241
+ )
242
+ end
243
+
236
244
  def filter(has: nil, hasNot: nil, hasNotText: nil, hasText: nil)
237
245
  LocatorImpl.new(
238
246
  frame: @frame,
@@ -18,6 +18,10 @@ module Playwright
18
18
  @on_message = block
19
19
  end
20
20
 
21
+ def on_driver_closed(&block)
22
+ @on_driver_closed = block
23
+ end
24
+
21
25
  def on_driver_crashed(&block)
22
26
  @on_driver_crashed = block
23
27
  end
@@ -83,6 +87,7 @@ module Playwright
83
87
  end
84
88
  rescue IOError
85
89
  # disconnected by remote.
90
+ @on_driver_closed&.call
86
91
  end
87
92
 
88
93
  def handle_stderr
@@ -106,6 +111,7 @@ module Playwright
106
111
  end
107
112
  rescue IOError
108
113
  # disconnected by remote.
114
+ @on_driver_closed&.call
109
115
  end
110
116
 
111
117
  def debug_send_message(message)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playwright
4
- VERSION = '1.42.0'
5
- COMPATIBLE_PLAYWRIGHT_VERSION = '1.42.0'
4
+ VERSION = '1.43.0'
5
+ COMPATIBLE_PLAYWRIGHT_VERSION = '1.43.1'
6
6
  end
@@ -81,19 +81,17 @@ module Playwright
81
81
 
82
82
  private def fulfill(result)
83
83
  cleanup
84
- unless @result.resolved?
85
- @result.fulfill(result)
86
- end
84
+ return if @result.resolved?
85
+ @result.fulfill(result)
87
86
  wait_for_event_info_after
88
87
  end
89
88
 
90
89
  private def reject(error)
91
90
  cleanup
91
+ return if @result.resolved?
92
92
  klass = error.is_a?(TimeoutError) ? TimeoutError : Error
93
93
  ex = klass.new(message: "#{error.message}#{format_log_recording(@logs)}")
94
- unless @result.resolved?
95
- @result.reject(ex)
96
- end
94
+ @result.reject(ex)
97
95
  wait_for_event_info_after(error: ex)
98
96
  end
99
97
 
@@ -15,6 +15,10 @@ module Playwright
15
15
  @on_message = block
16
16
  end
17
17
 
18
+ def on_driver_closed(&block)
19
+ @on_driver_closed = block
20
+ end
21
+
18
22
  def on_driver_crashed(&block)
19
23
  @on_driver_crashed = block
20
24
  end
@@ -76,6 +80,10 @@ module Playwright
76
80
 
77
81
  ws.start
78
82
  @ws = promise.value!
83
+ @ws.on_close do |reason, code|
84
+ puts "[WebSocketTransport] closed with code: #{code}, reason: #{reason}"
85
+ @on_driver_closed&.call(reason, code)
86
+ end
79
87
  @ws.on_error do |error|
80
88
  puts "[WebSocketTransport] error: #{error}"
81
89
  @on_driver_crashed&.call
data/lib/playwright.rb CHANGED
@@ -181,7 +181,7 @@ module Playwright
181
181
 
182
182
  # Connects to Playwright server, launched by `npx playwright launch-server chromium` or `playwright.chromium.launchServer()`
183
183
  #
184
- # Playwright.connect_to_browser_server('ws://....') do |browser|
184
+ # Playwright.connect_to_android_server('ws://....') do |browser|
185
185
  # page = browser.new_page
186
186
  # ...
187
187
  # end
@@ -40,20 +40,20 @@ module Playwright
40
40
 
41
41
  # -- inherited from EventEmitter --
42
42
  # @nodoc
43
- def off(event, callback)
44
- event_emitter_proxy.off(event, callback)
43
+ def on(event, callback)
44
+ event_emitter_proxy.on(event, callback)
45
45
  end
46
46
 
47
47
  # -- inherited from EventEmitter --
48
48
  # @nodoc
49
- def once(event, callback)
50
- event_emitter_proxy.once(event, callback)
49
+ def off(event, callback)
50
+ event_emitter_proxy.off(event, callback)
51
51
  end
52
52
 
53
53
  # -- inherited from EventEmitter --
54
54
  # @nodoc
55
- def on(event, callback)
56
- event_emitter_proxy.on(event, callback)
55
+ def once(event, callback)
56
+ event_emitter_proxy.once(event, callback)
57
57
  end
58
58
 
59
59
  private def event_emitter_proxy
@@ -205,20 +205,20 @@ module Playwright
205
205
 
206
206
  # -- inherited from EventEmitter --
207
207
  # @nodoc
208
- def off(event, callback)
209
- event_emitter_proxy.off(event, callback)
208
+ def on(event, callback)
209
+ event_emitter_proxy.on(event, callback)
210
210
  end
211
211
 
212
212
  # -- inherited from EventEmitter --
213
213
  # @nodoc
214
- def once(event, callback)
215
- event_emitter_proxy.once(event, callback)
214
+ def off(event, callback)
215
+ event_emitter_proxy.off(event, callback)
216
216
  end
217
217
 
218
218
  # -- inherited from EventEmitter --
219
219
  # @nodoc
220
- def on(event, callback)
221
- event_emitter_proxy.on(event, callback)
220
+ def once(event, callback)
221
+ event_emitter_proxy.once(event, callback)
222
222
  end
223
223
 
224
224
  private def event_emitter_proxy
@@ -280,20 +280,20 @@ module Playwright
280
280
 
281
281
  # -- inherited from EventEmitter --
282
282
  # @nodoc
283
- def off(event, callback)
284
- event_emitter_proxy.off(event, callback)
283
+ def on(event, callback)
284
+ event_emitter_proxy.on(event, callback)
285
285
  end
286
286
 
287
287
  # -- inherited from EventEmitter --
288
288
  # @nodoc
289
- def once(event, callback)
290
- event_emitter_proxy.once(event, callback)
289
+ def off(event, callback)
290
+ event_emitter_proxy.off(event, callback)
291
291
  end
292
292
 
293
293
  # -- inherited from EventEmitter --
294
294
  # @nodoc
295
- def on(event, callback)
296
- event_emitter_proxy.on(event, callback)
295
+ def once(event, callback)
296
+ event_emitter_proxy.once(event, callback)
297
297
  end
298
298
 
299
299
  private def event_emitter_proxy
@@ -202,20 +202,20 @@ module Playwright
202
202
 
203
203
  # -- inherited from EventEmitter --
204
204
  # @nodoc
205
- def off(event, callback)
206
- event_emitter_proxy.off(event, callback)
205
+ def on(event, callback)
206
+ event_emitter_proxy.on(event, callback)
207
207
  end
208
208
 
209
209
  # -- inherited from EventEmitter --
210
210
  # @nodoc
211
- def once(event, callback)
212
- event_emitter_proxy.once(event, callback)
211
+ def off(event, callback)
212
+ event_emitter_proxy.off(event, callback)
213
213
  end
214
214
 
215
215
  # -- inherited from EventEmitter --
216
216
  # @nodoc
217
- def on(event, callback)
218
- event_emitter_proxy.on(event, callback)
217
+ def once(event, callback)
218
+ event_emitter_proxy.once(event, callback)
219
219
  end
220
220
 
221
221
  private def event_emitter_proxy
@@ -81,9 +81,19 @@ module Playwright
81
81
  end
82
82
 
83
83
  #
84
- # Clears context cookies.
85
- def clear_cookies
86
- wrap_impl(@impl.clear_cookies)
84
+ # Removes cookies from context. Accepts optional filter.
85
+ #
86
+ # **Usage**
87
+ #
88
+ # ```python sync
89
+ # context.clear_cookies()
90
+ # context.clear_cookies(name="session-id")
91
+ # context.clear_cookies(domain="my-origin.com")
92
+ # context.clear_cookies(path="/api/v1")
93
+ # context.clear_cookies(name="session-id", domain="my-origin.com")
94
+ # ```
95
+ def clear_cookies(domain: nil, name: nil, path: nil)
96
+ wrap_impl(@impl.clear_cookies(domain: unwrap_impl(domain), name: unwrap_impl(name), path: unwrap_impl(path)))
87
97
  end
88
98
 
89
99
  #
@@ -438,6 +448,11 @@ module Playwright
438
448
  raise NotImplementedError.new('wait_for_event is not implemented yet.')
439
449
  end
440
450
 
451
+ # @nodoc
452
+ def owner_page=(req)
453
+ wrap_impl(@impl.owner_page=(unwrap_impl(req)))
454
+ end
455
+
441
456
  # @nodoc
442
457
  def pause
443
458
  wrap_impl(@impl.pause)
@@ -448,11 +463,6 @@ module Playwright
448
463
  wrap_impl(@impl.options=(unwrap_impl(req)))
449
464
  end
450
465
 
451
- # @nodoc
452
- def owner_page=(req)
453
- wrap_impl(@impl.owner_page=(unwrap_impl(req)))
454
- end
455
-
456
466
  # @nodoc
457
467
  def enable_debug_console!
458
468
  wrap_impl(@impl.enable_debug_console!)
@@ -465,20 +475,20 @@ module Playwright
465
475
 
466
476
  # -- inherited from EventEmitter --
467
477
  # @nodoc
468
- def off(event, callback)
469
- event_emitter_proxy.off(event, callback)
478
+ def on(event, callback)
479
+ event_emitter_proxy.on(event, callback)
470
480
  end
471
481
 
472
482
  # -- inherited from EventEmitter --
473
483
  # @nodoc
474
- def once(event, callback)
475
- event_emitter_proxy.once(event, callback)
484
+ def off(event, callback)
485
+ event_emitter_proxy.off(event, callback)
476
486
  end
477
487
 
478
488
  # -- inherited from EventEmitter --
479
489
  # @nodoc
480
- def on(event, callback)
481
- event_emitter_proxy.on(event, callback)
490
+ def once(event, callback)
491
+ event_emitter_proxy.once(event, callback)
482
492
  end
483
493
 
484
494
  private def event_emitter_proxy
@@ -176,20 +176,20 @@ module Playwright
176
176
 
177
177
  # -- inherited from EventEmitter --
178
178
  # @nodoc
179
- def off(event, callback)
180
- event_emitter_proxy.off(event, callback)
179
+ def on(event, callback)
180
+ event_emitter_proxy.on(event, callback)
181
181
  end
182
182
 
183
183
  # -- inherited from EventEmitter --
184
184
  # @nodoc
185
- def once(event, callback)
186
- event_emitter_proxy.once(event, callback)
185
+ def off(event, callback)
186
+ event_emitter_proxy.off(event, callback)
187
187
  end
188
188
 
189
189
  # -- inherited from EventEmitter --
190
190
  # @nodoc
191
- def on(event, callback)
192
- event_emitter_proxy.on(event, callback)
191
+ def once(event, callback)
192
+ event_emitter_proxy.once(event, callback)
193
193
  end
194
194
 
195
195
  private def event_emitter_proxy
@@ -34,20 +34,20 @@ module Playwright
34
34
 
35
35
  # -- inherited from EventEmitter --
36
36
  # @nodoc
37
- def off(event, callback)
38
- event_emitter_proxy.off(event, callback)
37
+ def on(event, callback)
38
+ event_emitter_proxy.on(event, callback)
39
39
  end
40
40
 
41
41
  # -- inherited from EventEmitter --
42
42
  # @nodoc
43
- def once(event, callback)
44
- event_emitter_proxy.once(event, callback)
43
+ def off(event, callback)
44
+ event_emitter_proxy.off(event, callback)
45
45
  end
46
46
 
47
47
  # -- inherited from EventEmitter --
48
48
  # @nodoc
49
- def on(event, callback)
50
- event_emitter_proxy.on(event, callback)
49
+ def once(event, callback)
50
+ event_emitter_proxy.once(event, callback)
51
51
  end
52
52
 
53
53
  private def event_emitter_proxy
@@ -70,20 +70,20 @@ module Playwright
70
70
 
71
71
  # -- inherited from EventEmitter --
72
72
  # @nodoc
73
- def off(event, callback)
74
- event_emitter_proxy.off(event, callback)
73
+ def on(event, callback)
74
+ event_emitter_proxy.on(event, callback)
75
75
  end
76
76
 
77
77
  # -- inherited from EventEmitter --
78
78
  # @nodoc
79
- def once(event, callback)
80
- event_emitter_proxy.once(event, callback)
79
+ def off(event, callback)
80
+ event_emitter_proxy.off(event, callback)
81
81
  end
82
82
 
83
83
  # -- inherited from EventEmitter --
84
84
  # @nodoc
85
- def on(event, callback)
86
- event_emitter_proxy.on(event, callback)
85
+ def once(event, callback)
86
+ event_emitter_proxy.once(event, callback)
87
87
  end
88
88
 
89
89
  private def event_emitter_proxy
@@ -575,20 +575,20 @@ module Playwright
575
575
 
576
576
  # -- inherited from EventEmitter --
577
577
  # @nodoc
578
- def off(event, callback)
579
- event_emitter_proxy.off(event, callback)
578
+ def on(event, callback)
579
+ event_emitter_proxy.on(event, callback)
580
580
  end
581
581
 
582
582
  # -- inherited from EventEmitter --
583
583
  # @nodoc
584
- def once(event, callback)
585
- event_emitter_proxy.once(event, callback)
584
+ def off(event, callback)
585
+ event_emitter_proxy.off(event, callback)
586
586
  end
587
587
 
588
588
  # -- inherited from EventEmitter --
589
589
  # @nodoc
590
- def on(event, callback)
591
- event_emitter_proxy.on(event, callback)
590
+ def once(event, callback)
591
+ event_emitter_proxy.once(event, callback)
592
592
  end
593
593
 
594
594
  private def event_emitter_proxy
@@ -1049,20 +1049,20 @@ module Playwright
1049
1049
 
1050
1050
  # -- inherited from EventEmitter --
1051
1051
  # @nodoc
1052
- def off(event, callback)
1053
- event_emitter_proxy.off(event, callback)
1052
+ def on(event, callback)
1053
+ event_emitter_proxy.on(event, callback)
1054
1054
  end
1055
1055
 
1056
1056
  # -- inherited from EventEmitter --
1057
1057
  # @nodoc
1058
- def once(event, callback)
1059
- event_emitter_proxy.once(event, callback)
1058
+ def off(event, callback)
1059
+ event_emitter_proxy.off(event, callback)
1060
1060
  end
1061
1061
 
1062
1062
  # -- inherited from EventEmitter --
1063
1063
  # @nodoc
1064
- def on(event, callback)
1065
- event_emitter_proxy.on(event, callback)
1064
+ def once(event, callback)
1065
+ event_emitter_proxy.once(event, callback)
1066
1066
  end
1067
1067
 
1068
1068
  private def event_emitter_proxy
@@ -21,11 +21,11 @@ module Playwright
21
21
  #
22
22
  # **Converting Locator to FrameLocator**
23
23
  #
24
- # If you have a `Locator` object pointing to an `iframe` it can be converted to `FrameLocator` using [`:scope`](https://developer.mozilla.org/en-US/docs/Web/CSS/:scope) CSS selector:
24
+ # If you have a `Locator` object pointing to an `iframe` it can be converted to `FrameLocator` using [`method: Locator.contentFrame`].
25
25
  #
26
- # ```python sync
27
- # frameLocator = locator.frame_locator(":scope")
28
- # ```
26
+ # **Converting FrameLocator to Locator**
27
+ #
28
+ # If you have a `FrameLocator` object it can be converted to `Locator` pointing to the same `iframe` using [`method: FrameLocator.owner`].
29
29
  class FrameLocator < PlaywrightApi
30
30
 
31
31
  #
@@ -255,5 +255,24 @@ module Playwright
255
255
  def nth(index)
256
256
  wrap_impl(@impl.nth(unwrap_impl(index)))
257
257
  end
258
+
259
+ #
260
+ # Returns a `Locator` object pointing to the same `iframe` as this frame locator.
261
+ #
262
+ # Useful when you have a `FrameLocator` object obtained somewhere, and later on would like to interact with the `iframe` element.
263
+ #
264
+ # For a reverse operation, use [`method: Locator.contentFrame`].
265
+ #
266
+ # **Usage**
267
+ #
268
+ # ```python sync
269
+ # frame_locator = page.frame_locator("iframe[name=\"embedded\"]")
270
+ # # ...
271
+ # locator = frame_locator.owner
272
+ # expect(locator).to_be_visible()
273
+ # ```
274
+ def owner
275
+ wrap_impl(@impl.owner)
276
+ end
258
277
  end
259
278
  end
@@ -100,20 +100,20 @@ module Playwright
100
100
 
101
101
  # -- inherited from EventEmitter --
102
102
  # @nodoc
103
- def off(event, callback)
104
- event_emitter_proxy.off(event, callback)
103
+ def on(event, callback)
104
+ event_emitter_proxy.on(event, callback)
105
105
  end
106
106
 
107
107
  # -- inherited from EventEmitter --
108
108
  # @nodoc
109
- def once(event, callback)
110
- event_emitter_proxy.once(event, callback)
109
+ def off(event, callback)
110
+ event_emitter_proxy.off(event, callback)
111
111
  end
112
112
 
113
113
  # -- inherited from EventEmitter --
114
114
  # @nodoc
115
- def on(event, callback)
116
- event_emitter_proxy.on(event, callback)
115
+ def once(event, callback)
116
+ event_emitter_proxy.once(event, callback)
117
117
  end
118
118
 
119
119
  private def event_emitter_proxy
@@ -325,6 +325,25 @@ module Playwright
325
325
  wrap_impl(@impl.element_handles)
326
326
  end
327
327
 
328
+ #
329
+ # Returns a `FrameLocator` object pointing to the same `iframe` as this locator.
330
+ #
331
+ # Useful when you have a `Locator` object obtained somewhere, and later on would like to interact with the content inside the frame.
332
+ #
333
+ # For a reverse operation, use [`method: FrameLocator.owner`].
334
+ #
335
+ # **Usage**
336
+ #
337
+ # ```python sync
338
+ # locator = page.locator("iframe[name=\"embedded\"]")
339
+ # # ...
340
+ # frame_locator = locator.content_frame
341
+ # frame_locator.get_by_role("button").click()
342
+ # ```
343
+ def content_frame
344
+ wrap_impl(@impl.content_frame)
345
+ end
346
+
328
347
  #
329
348
  # Execute JavaScript code in the page, taking the matching element as an argument.
330
349
  #