playwright-ruby-client 1.42.0 → 1.43.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 (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
  #