playwright-ruby-client 0.8.1 → 1.14.beta3

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/accessibility.md +51 -1
  3. data/documentation/docs/api/browser_context.md +28 -0
  4. data/documentation/docs/api/download.md +97 -0
  5. data/documentation/docs/api/element_handle.md +28 -3
  6. data/documentation/docs/api/experimental/android.md +15 -2
  7. data/documentation/docs/api/frame.md +116 -114
  8. data/documentation/docs/api/locator.md +650 -0
  9. data/documentation/docs/api/mouse.md +3 -4
  10. data/documentation/docs/api/page.md +109 -19
  11. data/documentation/docs/api/request.md +15 -19
  12. data/documentation/docs/api/touchscreen.md +8 -0
  13. data/documentation/docs/api/tracing.md +13 -12
  14. data/documentation/docs/api/worker.md +37 -0
  15. data/documentation/docs/article/guides/inspector.md +31 -0
  16. data/documentation/docs/article/guides/playwright_on_alpine_linux.md +1 -1
  17. data/documentation/docs/article/guides/semi_automation.md +1 -1
  18. data/documentation/docs/include/api_coverage.md +70 -14
  19. data/lib/playwright.rb +0 -1
  20. data/lib/playwright/accessibility_impl.rb +50 -0
  21. data/lib/playwright/channel_owners/browser_context.rb +70 -0
  22. data/lib/playwright/channel_owners/frame.rb +79 -33
  23. data/lib/playwright/channel_owners/page.rb +133 -42
  24. data/lib/playwright/channel_owners/request.rb +8 -8
  25. data/lib/playwright/channel_owners/worker.rb +23 -0
  26. data/lib/playwright/{download.rb → download_impl.rb} +1 -1
  27. data/lib/playwright/javascript/expression.rb +5 -4
  28. data/lib/playwright/locator_impl.rb +314 -0
  29. data/lib/playwright/timeout_settings.rb +4 -4
  30. data/lib/playwright/touchscreen_impl.rb +7 -0
  31. data/lib/playwright/tracing_impl.rb +9 -8
  32. data/lib/playwright/version.rb +2 -2
  33. data/lib/playwright_api/accessibility.rb +1 -1
  34. data/lib/playwright_api/android.rb +21 -8
  35. data/lib/playwright_api/android_device.rb +6 -6
  36. data/lib/playwright_api/browser.rb +6 -6
  37. data/lib/playwright_api/browser_context.rb +16 -11
  38. data/lib/playwright_api/browser_type.rb +6 -6
  39. data/lib/playwright_api/cdp_session.rb +6 -6
  40. data/lib/playwright_api/console_message.rb +6 -6
  41. data/lib/playwright_api/dialog.rb +6 -6
  42. data/lib/playwright_api/download.rb +70 -0
  43. data/lib/playwright_api/element_handle.rb +34 -20
  44. data/lib/playwright_api/frame.rb +85 -53
  45. data/lib/playwright_api/js_handle.rb +6 -6
  46. data/lib/playwright_api/locator.rb +509 -0
  47. data/lib/playwright_api/page.rb +91 -57
  48. data/lib/playwright_api/playwright.rb +6 -6
  49. data/lib/playwright_api/request.rb +6 -6
  50. data/lib/playwright_api/response.rb +6 -6
  51. data/lib/playwright_api/route.rb +6 -6
  52. data/lib/playwright_api/selectors.rb +6 -6
  53. data/lib/playwright_api/touchscreen.rb +1 -1
  54. data/lib/playwright_api/web_socket.rb +6 -6
  55. data/lib/playwright_api/worker.rb +16 -6
  56. metadata +13 -6
@@ -22,3 +22,40 @@ for worker in page.workers:
22
22
  ```
23
23
 
24
24
 
25
+
26
+ ## evaluate
27
+
28
+ ```
29
+ def evaluate(expression, arg: nil)
30
+ ```
31
+
32
+ Returns the return value of `expression`.
33
+
34
+ If the function passed to the [Worker#evaluate](./worker#evaluate) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then [Worker#evaluate](./worker#evaluate) would
35
+ wait for the promise to resolve and return its value.
36
+
37
+ If the function passed to the [Worker#evaluate](./worker#evaluate) returns a non-[Serializable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description) value, then
38
+ [Worker#evaluate](./worker#evaluate) returns `undefined`. Playwright also supports transferring some additional values that are
39
+ not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`.
40
+
41
+ ## evaluate_handle
42
+
43
+ ```
44
+ def evaluate_handle(expression, arg: nil)
45
+ ```
46
+
47
+ Returns the return value of `expression` as a [JSHandle](./js_handle).
48
+
49
+ The only difference between [Worker#evaluate](./worker#evaluate) and [Worker#evaluate_handle](./worker#evaluate_handle) is that
50
+ [Worker#evaluate_handle](./worker#evaluate_handle) returns [JSHandle](./js_handle).
51
+
52
+ If the function passed to the [Worker#evaluate_handle](./worker#evaluate_handle) returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), then
53
+ [Worker#evaluate_handle](./worker#evaluate_handle) would wait for the promise to resolve and return its value.
54
+
55
+ ## url
56
+
57
+ ```
58
+ def url
59
+ ```
60
+
61
+
@@ -0,0 +1,31 @@
1
+ ---
2
+ sidebar_position: 6
3
+ ---
4
+
5
+ # Playwright inspector
6
+
7
+ Playwright provides an useful inspector.
8
+ https://playwright.dev/docs/inspector/
9
+
10
+ ## Overview
11
+
12
+ ```ruby {4,8}
13
+ playwright.chromium.launch(headless: false) do |browser|
14
+ browser.new_context do |context|
15
+ # This method call should be put just after creating BrowserContext.
16
+ context.enable_debug_console!
17
+
18
+ page = context.new_pagè
19
+ page.goto('http://example.com/')
20
+ page.pause
21
+ end
22
+ end
23
+ ```
24
+
25
+ `page.pause` requires Playwright debug session, and it can be enabled by calling `BrowserContext#enable_debug_console!` in advance.
26
+
27
+ Note that since Ruby is not officially supported in Playwright, many limitations exist. We CANNOT
28
+
29
+ * Launch inspector via `PWDEBUG=1`
30
+ * Debug without inspector UI (`PWDEBUG=console` is not working well)
31
+ * Show Ruby code in inspector
@@ -1,5 +1,5 @@
1
1
  ---
2
- sidebar_position: 6
2
+ sidebar_position: 7
3
3
  ---
4
4
 
5
5
  # Playwright on Alpine Linux
@@ -14,7 +14,7 @@ Keep in mind repeatedly that persistent browser context is NOT RECOMMENDED for m
14
14
 
15
15
  ## Pause automation for manual operation
16
16
 
17
- `Page#pause` is not implemented yet, however we can use `binding.pry` (with `pry-byebug` installed) instead.
17
+ We can simply use `binding.pry` (with `pry-byebug` installed).
18
18
 
19
19
  ```ruby {4}
20
20
  playwright.chromium.launch_persistent_context('./data/', headless: false) do |context|
@@ -65,7 +65,7 @@
65
65
 
66
66
  ## Touchscreen
67
67
 
68
- * ~~tap_point~~
68
+ * tap_point
69
69
 
70
70
  ## JSHandle
71
71
 
@@ -116,9 +116,9 @@
116
116
  * wait_for_element_state
117
117
  * wait_for_selector
118
118
 
119
- ## ~~Accessibility~~
119
+ ## Accessibility
120
120
 
121
- * ~~snapshot~~
121
+ * snapshot
122
122
 
123
123
  ## FileChooser
124
124
 
@@ -158,6 +158,7 @@
158
158
  * enabled?
159
159
  * hidden?
160
160
  * visible?
161
+ * locator
161
162
  * name
162
163
  * page
163
164
  * parent_frame
@@ -177,14 +178,14 @@
177
178
  * wait_for_load_state
178
179
  * expect_navigation
179
180
  * wait_for_selector
180
- * ~~wait_for_timeout~~
181
+ * wait_for_timeout
181
182
  * wait_for_url
182
183
 
183
184
  ## Worker
184
185
 
185
- * ~~evaluate~~
186
- * ~~evaluate_handle~~
187
- * ~~url~~
186
+ * evaluate
187
+ * evaluate_handle
188
+ * url
188
189
 
189
190
  ## Selectors
190
191
 
@@ -205,6 +206,17 @@
205
206
  * message
206
207
  * type
207
208
 
209
+ ## Download
210
+
211
+ * cancel
212
+ * delete
213
+ * failure
214
+ * page
215
+ * path
216
+ * save_as
217
+ * suggested_filename
218
+ * url
219
+
208
220
  ## Page
209
221
 
210
222
  * add_init_script
@@ -245,9 +257,10 @@
245
257
  * enabled?
246
258
  * hidden?
247
259
  * visible?
260
+ * locator
248
261
  * main_frame
249
262
  * opener
250
- * ~~pause~~
263
+ * pause
251
264
  * pdf
252
265
  * press
253
266
  * query_selector
@@ -283,11 +296,11 @@
283
296
  * expect_request_finished
284
297
  * expect_response
285
298
  * wait_for_selector
286
- * ~~wait_for_timeout~~
299
+ * wait_for_timeout
287
300
  * wait_for_url
288
301
  * expect_websocket
289
- * ~~expect_worker~~
290
- * ~~workers~~
302
+ * expect_worker
303
+ * workers
291
304
  * ~~wait_for_event~~
292
305
  * accessibility
293
306
  * keyboard
@@ -298,7 +311,7 @@
298
311
 
299
312
  * add_cookies
300
313
  * add_init_script
301
- * ~~background_pages~~
314
+ * background_pages
302
315
  * browser
303
316
  * clear_cookies
304
317
  * clear_permissions
@@ -311,13 +324,13 @@
311
324
  * new_page
312
325
  * pages
313
326
  * route
314
- * ~~service_workers~~
327
+ * service_workers
315
328
  * set_default_navigation_timeout
316
329
  * set_default_timeout
317
330
  * set_extra_http_headers
318
331
  * set_geolocation
319
332
  * set_offline
320
- * ~~storage_state~~
333
+ * storage_state
321
334
  * unroute
322
335
  * expect_event
323
336
  * expect_page
@@ -364,6 +377,49 @@
364
377
  * start
365
378
  * stop
366
379
 
380
+ ## Locator
381
+
382
+ * all_inner_texts
383
+ * all_text_contents
384
+ * bounding_box
385
+ * check
386
+ * click
387
+ * count
388
+ * dblclick
389
+ * dispatch_event
390
+ * element_handle
391
+ * element_handles
392
+ * evaluate
393
+ * evaluate_all
394
+ * evaluate_handle
395
+ * fill
396
+ * first
397
+ * focus
398
+ * get_attribute
399
+ * hover
400
+ * inner_html
401
+ * inner_text
402
+ * input_value
403
+ * checked?
404
+ * disabled?
405
+ * editable?
406
+ * enabled?
407
+ * hidden?
408
+ * visible?
409
+ * last
410
+ * locator
411
+ * nth
412
+ * press
413
+ * screenshot
414
+ * scroll_into_view_if_needed
415
+ * select_option
416
+ * select_text
417
+ * set_input_files
418
+ * tap_point
419
+ * text_content
420
+ * type
421
+ * uncheck
422
+
367
423
  ## Android
368
424
 
369
425
  * devices
data/lib/playwright.rb CHANGED
@@ -17,7 +17,6 @@ require 'playwright/utils'
17
17
  require 'playwright/api_implementation'
18
18
  require 'playwright/channel'
19
19
  require 'playwright/channel_owner'
20
- require 'playwright/download'
21
20
  require 'playwright/http_headers'
22
21
  require 'playwright/input_files'
23
22
  require 'playwright/connection'
@@ -0,0 +1,50 @@
1
+ module Playwright
2
+ define_api_implementation :AccessibilityImpl do
3
+ def initialize(channel)
4
+ @channel = channel
5
+ end
6
+
7
+ def snapshot(interestingOnly: nil, root: nil)
8
+ params = {
9
+ interestingOnly: interestingOnly,
10
+ root: root&.channel,
11
+ }.compact
12
+ result = @channel.send_message_to_server('accessibilitySnapshot', params)
13
+ format_ax_node_from_protocol(result) if result
14
+ result
15
+ end
16
+
17
+ # original JS implementation create a new Hash from ax_node,
18
+ # but this implementation directly modify ax_node and don't return hash.
19
+ private def format_ax_node_from_protocol(ax_node)
20
+ value = ax_node.delete('valueNumber') || ax_node.delete('valueString')
21
+ ax_node['value'] = value unless value.nil?
22
+
23
+ checked =
24
+ case ax_node['checked']
25
+ when 'checked'
26
+ true
27
+ when 'unchecked'
28
+ false
29
+ else
30
+ ax_node['checked']
31
+ end
32
+ ax_node['checked'] = checked unless checked.nil?
33
+
34
+ pressed =
35
+ case ax_node['pressed']
36
+ when 'pressed'
37
+ true
38
+ when 'released'
39
+ false
40
+ else
41
+ ax_node['pressed']
42
+ end
43
+ ax_node['pressed'] = pressed unless pressed.nil?
44
+
45
+ ax_node['children']&.each do |child|
46
+ format_ax_node_from_protocol(child)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -11,6 +11,8 @@ module Playwright
11
11
  @routes = []
12
12
  @bindings = {}
13
13
  @timeout_settings = TimeoutSettings.new
14
+ @service_workers = Set.new
15
+ @background_pages = Set.new
14
16
 
15
17
  @tracing = TracingImpl.new(@channel, self)
16
18
  @channel.on('bindingCall', ->(params) { on_binding(ChannelOwners::BindingCall.from(params['binding'])) })
@@ -19,6 +21,12 @@ module Playwright
19
21
  @channel.on('route', ->(params) {
20
22
  on_route(ChannelOwners::Route.from(params['route']), ChannelOwners::Request.from(params['request']))
21
23
  })
24
+ @channel.on('backgroundPage', ->(params) {
25
+ on_background_page(ChannelOwners::Page.from(params['page']))
26
+ })
27
+ @channel.on('serviceWorker', ->(params) {
28
+ on_service_worker(ChannelOwners::Worker.from(params['worker']))
29
+ })
22
30
  @channel.on('request', ->(params) {
23
31
  on_request(
24
32
  ChannelOwners::Request.from(params['request']),
@@ -56,6 +64,11 @@ module Playwright
56
64
  page.send(:emit_popup_event_from_browser_context)
57
65
  end
58
66
 
67
+ private def on_background_page(page)
68
+ @background_pages << page
69
+ emit(Events::BrowserContext::BackgroundPage, page)
70
+ end
71
+
59
72
  private def on_route(route, request)
60
73
  # It is not desired to use PlaywrightApi.wrap directly.
61
74
  # However it is a little difficult to define wrapper for `handler` parameter in generate_api.
@@ -98,6 +111,20 @@ module Playwright
98
111
  page&.emit(Events::Page::Response, response)
99
112
  end
100
113
 
114
+ private def on_service_worker(worker)
115
+ worker.context = self
116
+ @service_workers << worker
117
+ emit(Events::BrowserContext::ServiceWorker, worker)
118
+ end
119
+
120
+ def background_pages
121
+ @background_pages.to_a
122
+ end
123
+
124
+ def service_workers
125
+ @service_workers.to_a
126
+ end
127
+
101
128
  def new_cdp_session(page)
102
129
  resp = @channel.send_message_to_server('newCDPSession', page: page.channel)
103
130
  ChannelOwners::CDPSession.from(resp)
@@ -250,10 +277,45 @@ module Playwright
250
277
  raise unless safe_close_error?(err)
251
278
  end
252
279
 
280
+ # REMARK: enable_debug_console is playwright-ruby-client specific method.
281
+ def enable_debug_console!
282
+ # Ruby is not supported in Playwright officially,
283
+ # and causes error:
284
+ #
285
+ # Error:
286
+ # ===============================
287
+ # Unsupported language: 'ruby'
288
+ # ===============================
289
+ #
290
+ # So, launch inspector as Python app.
291
+ # NOTE: This should be used only for Page#pause at this moment.
292
+ @channel.send_message_to_server('recorderSupplementEnable', language: :python)
293
+ @debug_console_enabled = true
294
+ end
295
+
296
+ class DebugConsoleNotEnabledError < StandardError
297
+ def initialize
298
+ super('Debug console should be enabled in advance, by calling `browser_context.enable_debug_console!`')
299
+ end
300
+ end
301
+
253
302
  def pause
303
+ unless @debug_console_enabled
304
+ raise DebugConsoleNotEnabledError.new
305
+ end
254
306
  @channel.send_message_to_server('pause')
255
307
  end
256
308
 
309
+ def storage_state(path: nil)
310
+ @channel.send_message_to_server_result('storageState', {}).tap do |result|
311
+ if path
312
+ File.open(path, 'w') do |f|
313
+ f.write(JSON.dump(result))
314
+ end
315
+ end
316
+ end
317
+ end
318
+
257
319
  def expect_page(predicate: nil, timeout: nil)
258
320
  params = {
259
321
  predicate: predicate,
@@ -267,6 +329,14 @@ module Playwright
267
329
  @pages.delete(page)
268
330
  end
269
331
 
332
+ private def remove_background_page(page)
333
+ @background_pages.delete(page)
334
+ end
335
+
336
+ private def remove_service_worker(worker)
337
+ @service_workers.delete(worker)
338
+ end
339
+
270
340
  # called from Page with send(:_timeout_settings), so keep private.
271
341
  private def _timeout_settings
272
342
  @timeout_settings
@@ -139,8 +139,12 @@ module Playwright
139
139
  JavaScript::Expression.new(pageFunction, arg).evaluate_handle(@channel)
140
140
  end
141
141
 
142
- def query_selector(selector)
143
- resp = @channel.send_message_to_server('querySelector', selector: selector)
142
+ def query_selector(selector, strict: nil)
143
+ params = {
144
+ selector: selector,
145
+ strict: strict,
146
+ }.compact
147
+ resp = @channel.send_message_to_server('querySelector', params)
144
148
  ChannelOwners::ElementHandle.from_nullable(resp)
145
149
  end
146
150
 
@@ -150,48 +154,53 @@ module Playwright
150
154
  end
151
155
  end
152
156
 
153
- def wait_for_selector(selector, state: nil, timeout: nil)
154
- params = { selector: selector, state: state, timeout: timeout }.compact
157
+ def wait_for_selector(selector, state: nil, strict: nil, timeout: nil)
158
+ params = { selector: selector, state: state, strict: strict, timeout: timeout }.compact
155
159
  resp = @channel.send_message_to_server('waitForSelector', params)
156
160
 
157
161
  ChannelOwners::ElementHandle.from_nullable(resp)
158
162
  end
159
163
 
160
- def checked?(selector, timeout: nil)
161
- params = { selector: selector, timeout: timeout }.compact
164
+ def checked?(selector, strict: nil, timeout: nil)
165
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
162
166
  @channel.send_message_to_server('isChecked', params)
163
167
  end
164
168
 
165
- def disabled?(selector, timeout: nil)
166
- params = { selector: selector, timeout: timeout }.compact
169
+ def disabled?(selector, strict: nil, timeout: nil)
170
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
167
171
  @channel.send_message_to_server('isDisabled', params)
168
172
  end
169
173
 
170
- def editable?(selector, timeout: nil)
171
- params = { selector: selector, timeout: timeout }.compact
174
+ def editable?(selector, strict: nil, timeout: nil)
175
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
172
176
  @channel.send_message_to_server('isEditable', params)
173
177
  end
174
178
 
175
- def enabled?(selector, timeout: nil)
176
- params = { selector: selector, timeout: timeout }.compact
179
+ def enabled?(selector, strict: nil, timeout: nil)
180
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
177
181
  @channel.send_message_to_server('isEnabled', params)
178
182
  end
179
183
 
180
- def hidden?(selector, timeout: nil)
181
- params = { selector: selector, timeout: timeout }.compact
184
+ def hidden?(selector, strict: nil, timeout: nil)
185
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
182
186
  @channel.send_message_to_server('isHidden', params)
183
187
  end
184
188
 
185
- def visible?(selector, timeout: nil)
186
- params = { selector: selector, timeout: timeout }.compact
189
+ def visible?(selector, strict: nil, timeout: nil)
190
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
187
191
  @channel.send_message_to_server('isVisible', params)
188
192
  end
189
193
 
190
- def dispatch_event(selector, type, eventInit: nil, timeout: nil)
194
+ def locator(selector)
195
+ LocatorImpl.new(frame: self, timeout_settings: @page.send(:timeout_settings), selector: selector)
196
+ end
197
+
198
+ def dispatch_event(selector, type, eventInit: nil, strict: nil, timeout: nil)
191
199
  params = {
192
200
  selector: selector,
193
201
  type: type,
194
202
  eventInit: JavaScript::ValueSerializer.new(eventInit).serialize,
203
+ strict: strict,
195
204
  timeout: timeout,
196
205
  }.compact
197
206
  @channel.send_message_to_server('dispatchEvent', params)
@@ -199,8 +208,8 @@ module Playwright
199
208
  nil
200
209
  end
201
210
 
202
- def eval_on_selector(selector, pageFunction, arg: nil)
203
- JavaScript::Expression.new(pageFunction, arg).eval_on_selector(@channel, selector)
211
+ def eval_on_selector(selector, pageFunction, arg: nil, strict: nil)
212
+ JavaScript::Expression.new(pageFunction, arg).eval_on_selector(@channel, selector, strict: strict)
204
213
  end
205
214
 
206
215
  def eval_on_selector_all(selector, pageFunction, arg: nil)
@@ -273,6 +282,7 @@ module Playwright
273
282
  modifiers: nil,
274
283
  noWaitAfter: nil,
275
284
  position: nil,
285
+ strict: nil,
276
286
  timeout: nil,
277
287
  trial: nil)
278
288
 
@@ -285,6 +295,7 @@ module Playwright
285
295
  modifiers: modifiers,
286
296
  noWaitAfter: noWaitAfter,
287
297
  position: position,
298
+ strict: strict,
288
299
  timeout: timeout,
289
300
  trial: trial,
290
301
  }.compact
@@ -298,13 +309,20 @@ module Playwright
298
309
  target,
299
310
  force: nil,
300
311
  noWaitAfter: nil,
312
+ sourcePosition: nil,
313
+ strict: nil,
314
+ targetPosition: nil,
301
315
  timeout: nil,
302
316
  trial: nil)
317
+
303
318
  params = {
304
319
  source: source,
305
320
  target: target,
306
321
  force: force,
307
322
  noWaitAfter: noWaitAfter,
323
+ sourcePosition: sourcePosition,
324
+ strict: strict,
325
+ targetPosition: targetPosition,
308
326
  timeout: timeout,
309
327
  trial: trial,
310
328
  }.compact
@@ -321,6 +339,7 @@ module Playwright
321
339
  modifiers: nil,
322
340
  noWaitAfter: nil,
323
341
  position: nil,
342
+ strict: nil,
324
343
  timeout: nil,
325
344
  trial: nil)
326
345
 
@@ -332,6 +351,7 @@ module Playwright
332
351
  modifiers: modifiers,
333
352
  noWaitAfter: noWaitAfter,
334
353
  position: position,
354
+ strict: strict,
335
355
  timeout: timeout,
336
356
  trial: trial,
337
357
  }.compact
@@ -346,6 +366,7 @@ module Playwright
346
366
  modifiers: nil,
347
367
  noWaitAfter: nil,
348
368
  position: nil,
369
+ strict: nil,
349
370
  timeout: nil,
350
371
  trial: nil)
351
372
  params = {
@@ -354,6 +375,7 @@ module Playwright
354
375
  modifiers: modifiers,
355
376
  noWaitAfter: noWaitAfter,
356
377
  position: position,
378
+ strict: strict,
357
379
  timeout: timeout,
358
380
  trial: trial,
359
381
  }.compact
@@ -367,12 +389,14 @@ module Playwright
367
389
  value,
368
390
  force: nil,
369
391
  noWaitAfter: nil,
392
+ strict: nil,
370
393
  timeout: nil)
371
394
  params = {
372
395
  selector: selector,
373
396
  value: value,
374
397
  force: force,
375
398
  noWaitAfter: noWaitAfter,
399
+ strict: strict,
376
400
  timeout: timeout,
377
401
  }.compact
378
402
  @channel.send_message_to_server('fill', params)
@@ -380,31 +404,32 @@ module Playwright
380
404
  nil
381
405
  end
382
406
 
383
- def focus(selector, timeout: nil)
384
- params = { selector: selector, timeout: timeout }.compact
407
+ def focus(selector, strict: nil, timeout: nil)
408
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
385
409
  @channel.send_message_to_server('focus', params)
386
410
  nil
387
411
  end
388
412
 
389
- def text_content(selector, timeout: nil)
390
- params = { selector: selector, timeout: timeout }.compact
413
+ def text_content(selector, strict: nil, timeout: nil)
414
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
391
415
  @channel.send_message_to_server('textContent', params)
392
416
  end
393
417
 
394
- def inner_text(selector, timeout: nil)
395
- params = { selector: selector, timeout: timeout }.compact
418
+ def inner_text(selector, strict: nil, timeout: nil)
419
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
396
420
  @channel.send_message_to_server('innerText', params)
397
421
  end
398
422
 
399
- def inner_html(selector, timeout: nil)
400
- params = { selector: selector, timeout: timeout }.compact
423
+ def inner_html(selector, strict: nil, timeout: nil)
424
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
401
425
  @channel.send_message_to_server('innerHTML', params)
402
426
  end
403
427
 
404
- def get_attribute(selector, name, timeout: nil)
428
+ def get_attribute(selector, name, strict: nil, timeout: nil)
405
429
  params = {
406
430
  selector: selector,
407
431
  name: name,
432
+ strict: strict,
408
433
  timeout: timeout,
409
434
  }.compact
410
435
  @channel.send_message_to_server('getAttribute', params)
@@ -415,6 +440,7 @@ module Playwright
415
440
  force: nil,
416
441
  modifiers: nil,
417
442
  position: nil,
443
+ strict: nil,
418
444
  timeout: nil,
419
445
  trial: nil)
420
446
  params = {
@@ -422,6 +448,7 @@ module Playwright
422
448
  force: force,
423
449
  modifiers: modifiers,
424
450
  position: position,
451
+ strict: strict,
425
452
  timeout: timeout,
426
453
  trial: trial,
427
454
  }.compact
@@ -438,6 +465,7 @@ module Playwright
438
465
  label: nil,
439
466
  force: nil,
440
467
  noWaitAfter: nil,
468
+ strict: nil,
441
469
  timeout: nil)
442
470
  base_params = SelectOptionValues.new(
443
471
  element: element,
@@ -445,18 +473,24 @@ module Playwright
445
473
  value: value,
446
474
  label: label,
447
475
  ).as_params
448
- params = base_params.merge({ selector: selector, force: force, noWaitAfter: noWaitAfter, timeout: timeout }.compact)
476
+ params = base_params.merge({ selector: selector, force: force, noWaitAfter: noWaitAfter, strict: strict, timeout: timeout }.compact)
449
477
  @channel.send_message_to_server('selectOption', params)
450
478
  end
451
479
 
452
- def input_value(selector, timeout: nil)
453
- params = { selector: selector, timeout: timeout }.compact
480
+ def input_value(selector, strict: nil, timeout: nil)
481
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
454
482
  @channel.send_message_to_server('inputValue', params)
455
483
  end
456
484
 
457
- def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
485
+ def set_input_files(selector, files, noWaitAfter: nil, strict: nil, timeout: nil)
458
486
  file_payloads = InputFiles.new(files).as_params
459
- params = { files: file_payloads, selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact
487
+ params = {
488
+ files: file_payloads,
489
+ selector: selector,
490
+ noWaitAfter: noWaitAfter,
491
+ strict: strict,
492
+ timeout: timeout,
493
+ }.compact
460
494
  @channel.send_message_to_server('setInputFiles', params)
461
495
 
462
496
  nil
@@ -467,6 +501,7 @@ module Playwright
467
501
  text,
468
502
  delay: nil,
469
503
  noWaitAfter: nil,
504
+ strict: nil,
470
505
  timeout: nil)
471
506
 
472
507
  params = {
@@ -474,6 +509,7 @@ module Playwright
474
509
  text: text,
475
510
  delay: delay,
476
511
  noWaitAfter: noWaitAfter,
512
+ strict: strict,
477
513
  timeout: timeout,
478
514
  }.compact
479
515
  @channel.send_message_to_server('type', params)
@@ -486,6 +522,7 @@ module Playwright
486
522
  key,
487
523
  delay: nil,
488
524
  noWaitAfter: nil,
525
+ strict: nil,
489
526
  timeout: nil)
490
527
 
491
528
  params = {
@@ -493,6 +530,7 @@ module Playwright
493
530
  key: key,
494
531
  delay: delay,
495
532
  noWaitAfter: noWaitAfter,
533
+ strict: strict,
496
534
  timeout: timeout,
497
535
  }.compact
498
536
  @channel.send_message_to_server('press', params)
@@ -505,6 +543,7 @@ module Playwright
505
543
  force: nil,
506
544
  noWaitAfter: nil,
507
545
  position: nil,
546
+ strict: nil,
508
547
  timeout: nil,
509
548
  trial: nil)
510
549
 
@@ -513,6 +552,7 @@ module Playwright
513
552
  force: force,
514
553
  noWaitAfter: noWaitAfter,
515
554
  position: position,
555
+ strict: strict,
516
556
  timeout: timeout,
517
557
  trial: trial,
518
558
  }.compact
@@ -526,6 +566,7 @@ module Playwright
526
566
  force: nil,
527
567
  noWaitAfter: nil,
528
568
  position: nil,
569
+ strict: nil,
529
570
  timeout: nil,
530
571
  trial: nil)
531
572
 
@@ -534,6 +575,7 @@ module Playwright
534
575
  force: force,
535
576
  noWaitAfter: noWaitAfter,
536
577
  position: position,
578
+ strict: strict,
537
579
  timeout: timeout,
538
580
  trial: trial,
539
581
  }.compact
@@ -542,6 +584,10 @@ module Playwright
542
584
  nil
543
585
  end
544
586
 
587
+ def wait_for_timeout(timeout)
588
+ sleep(timeout / 1000.0)
589
+ end
590
+
545
591
  def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
546
592
  if polling.is_a?(String) && polling != 'raf'
547
593
  raise ArgumentError.new("Unknown polling option: #{polling}")