playwright-ruby-client 0.7.1 → 1.14.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -0
  3. data/documentation/docs/api/accessibility.md +52 -1
  4. data/documentation/docs/api/browser.md +8 -2
  5. data/documentation/docs/api/browser_context.md +28 -0
  6. data/documentation/docs/api/browser_type.md +1 -0
  7. data/documentation/docs/api/download.md +97 -0
  8. data/documentation/docs/api/element_handle.md +38 -4
  9. data/documentation/docs/api/experimental/android_device.md +1 -0
  10. data/documentation/docs/api/frame.md +89 -17
  11. data/documentation/docs/api/keyboard.md +11 -20
  12. data/documentation/docs/api/locator.md +650 -0
  13. data/documentation/docs/api/page.md +135 -19
  14. data/documentation/docs/api/response.md +16 -0
  15. data/documentation/docs/api/touchscreen.md +8 -0
  16. data/documentation/docs/api/worker.md +37 -0
  17. data/documentation/docs/article/guides/inspector.md +31 -0
  18. data/documentation/docs/article/guides/playwright_on_alpine_linux.md +91 -0
  19. data/documentation/docs/article/guides/semi_automation.md +5 -1
  20. data/documentation/docs/include/api_coverage.md +77 -14
  21. data/lib/playwright.rb +36 -4
  22. data/lib/playwright/accessibility_impl.rb +50 -0
  23. data/lib/playwright/channel_owners/artifact.rb +4 -0
  24. data/lib/playwright/channel_owners/browser_context.rb +77 -3
  25. data/lib/playwright/channel_owners/element_handle.rb +11 -4
  26. data/lib/playwright/channel_owners/frame.rb +107 -34
  27. data/lib/playwright/channel_owners/page.rb +163 -55
  28. data/lib/playwright/channel_owners/response.rb +8 -0
  29. data/lib/playwright/channel_owners/worker.rb +23 -0
  30. data/lib/playwright/connection.rb +2 -4
  31. data/lib/playwright/{download.rb → download_impl.rb} +5 -1
  32. data/lib/playwright/javascript/expression.rb +5 -4
  33. data/lib/playwright/locator_impl.rb +314 -0
  34. data/lib/playwright/route_handler_entry.rb +3 -2
  35. data/lib/playwright/timeout_settings.rb +4 -4
  36. data/lib/playwright/touchscreen_impl.rb +7 -0
  37. data/lib/playwright/transport.rb +0 -1
  38. data/lib/playwright/url_matcher.rb +12 -2
  39. data/lib/playwright/version.rb +2 -2
  40. data/lib/playwright/web_socket_client.rb +164 -0
  41. data/lib/playwright/web_socket_transport.rb +104 -0
  42. data/lib/playwright_api/accessibility.rb +1 -1
  43. data/lib/playwright_api/android_device.rb +6 -5
  44. data/lib/playwright_api/browser.rb +10 -4
  45. data/lib/playwright_api/browser_context.rb +12 -7
  46. data/lib/playwright_api/browser_type.rb +2 -1
  47. data/lib/playwright_api/cdp_session.rb +6 -6
  48. data/lib/playwright_api/download.rb +70 -0
  49. data/lib/playwright_api/element_handle.rb +38 -18
  50. data/lib/playwright_api/frame.rb +95 -44
  51. data/lib/playwright_api/locator.rb +509 -0
  52. data/lib/playwright_api/page.rb +102 -49
  53. data/lib/playwright_api/response.rb +10 -0
  54. data/lib/playwright_api/touchscreen.rb +1 -1
  55. data/lib/playwright_api/worker.rb +13 -3
  56. metadata +17 -7
@@ -146,6 +146,7 @@ module Playwright
146
146
  index: nil,
147
147
  value: nil,
148
148
  label: nil,
149
+ force: nil,
149
150
  noWaitAfter: nil,
150
151
  timeout: nil)
151
152
  base_params = SelectOptionValues.new(
@@ -154,7 +155,7 @@ module Playwright
154
155
  value: value,
155
156
  label: label,
156
157
  ).as_params
157
- params = base_params.merge({ noWaitAfter: noWaitAfter, timeout: timeout }.compact)
158
+ params = base_params.merge({ force: force, noWaitAfter: noWaitAfter, timeout: timeout }.compact)
158
159
  @channel.send_message_to_server('selectOption', params)
159
160
  end
160
161
 
@@ -179,9 +180,10 @@ module Playwright
179
180
  nil
180
181
  end
181
182
 
182
- def fill(value, noWaitAfter: nil, timeout: nil)
183
+ def fill(value, force: nil, noWaitAfter: nil, timeout: nil)
183
184
  params = {
184
185
  value: value,
186
+ force: force,
185
187
  noWaitAfter: noWaitAfter,
186
188
  timeout: timeout,
187
189
  }.compact
@@ -190,13 +192,18 @@ module Playwright
190
192
  nil
191
193
  end
192
194
 
193
- def select_text(timeout: nil)
194
- params = { timeout: timeout }.compact
195
+ def select_text(force: nil, timeout: nil)
196
+ params = { force: force, timeout: timeout }.compact
195
197
  @channel.send_message_to_server('selectText', params)
196
198
 
197
199
  nil
198
200
  end
199
201
 
202
+ def input_value(timeout: nil)
203
+ params = { timeout: timeout }.compact
204
+ @channel.send_message_to_server('inputValue', params)
205
+ end
206
+
200
207
  def set_input_files(files, noWaitAfter: nil, timeout: nil)
201
208
  file_payloads = InputFiles.new(files).as_params
202
209
  params = { files: file_payloads, noWaitAfter: noWaitAfter, timeout: timeout }.compact
@@ -71,7 +71,7 @@ module Playwright
71
71
 
72
72
  predicate =
73
73
  if url
74
- matcher = UrlMatcher.new(url)
74
+ matcher = UrlMatcher.new(url, base_url: @page.context.send(:base_url))
75
75
  ->(event) { event['error'] || matcher.match?(event['url']) }
76
76
  else
77
77
  ->(_) { true }
@@ -99,7 +99,7 @@ module Playwright
99
99
  end
100
100
 
101
101
  def wait_for_url(url, timeout: nil, waitUntil: nil)
102
- matcher = UrlMatcher.new(url)
102
+ matcher = UrlMatcher.new(url, base_url: @page.context.send(:base_url))
103
103
  if matcher.match?(@url)
104
104
  wait_for_load_state(state: waitUntil, timeout: timeout)
105
105
  else
@@ -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
@@ -293,6 +304,28 @@ module Playwright
293
304
  nil
294
305
  end
295
306
 
307
+ def drag_and_drop(
308
+ source,
309
+ target,
310
+ force: nil,
311
+ noWaitAfter: nil,
312
+ strict: nil,
313
+ timeout: nil,
314
+ trial: nil)
315
+ params = {
316
+ source: source,
317
+ target: target,
318
+ force: force,
319
+ noWaitAfter: noWaitAfter,
320
+ strict: strict,
321
+ timeout: timeout,
322
+ trial: trial,
323
+ }.compact
324
+ @channel.send_message_to_server('dragAndDrop', params)
325
+
326
+ nil
327
+ end
328
+
296
329
  def dblclick(
297
330
  selector,
298
331
  button: nil,
@@ -301,6 +334,7 @@ module Playwright
301
334
  modifiers: nil,
302
335
  noWaitAfter: nil,
303
336
  position: nil,
337
+ strict: nil,
304
338
  timeout: nil,
305
339
  trial: nil)
306
340
 
@@ -312,6 +346,7 @@ module Playwright
312
346
  modifiers: modifiers,
313
347
  noWaitAfter: noWaitAfter,
314
348
  position: position,
349
+ strict: strict,
315
350
  timeout: timeout,
316
351
  trial: trial,
317
352
  }.compact
@@ -326,6 +361,7 @@ module Playwright
326
361
  modifiers: nil,
327
362
  noWaitAfter: nil,
328
363
  position: nil,
364
+ strict: nil,
329
365
  timeout: nil,
330
366
  trial: nil)
331
367
  params = {
@@ -334,6 +370,7 @@ module Playwright
334
370
  modifiers: modifiers,
335
371
  noWaitAfter: noWaitAfter,
336
372
  position: position,
373
+ strict: strict,
337
374
  timeout: timeout,
338
375
  trial: trial,
339
376
  }.compact
@@ -342,11 +379,19 @@ module Playwright
342
379
  nil
343
380
  end
344
381
 
345
- def fill(selector, value, noWaitAfter: nil, timeout: nil)
382
+ def fill(
383
+ selector,
384
+ value,
385
+ force: nil,
386
+ noWaitAfter: nil,
387
+ strict: nil,
388
+ timeout: nil)
346
389
  params = {
347
390
  selector: selector,
348
391
  value: value,
392
+ force: force,
349
393
  noWaitAfter: noWaitAfter,
394
+ strict: strict,
350
395
  timeout: timeout,
351
396
  }.compact
352
397
  @channel.send_message_to_server('fill', params)
@@ -354,31 +399,32 @@ module Playwright
354
399
  nil
355
400
  end
356
401
 
357
- def focus(selector, timeout: nil)
358
- params = { selector: selector, timeout: timeout }.compact
402
+ def focus(selector, strict: nil, timeout: nil)
403
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
359
404
  @channel.send_message_to_server('focus', params)
360
405
  nil
361
406
  end
362
407
 
363
- def text_content(selector, timeout: nil)
364
- params = { selector: selector, timeout: timeout }.compact
408
+ def text_content(selector, strict: nil, timeout: nil)
409
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
365
410
  @channel.send_message_to_server('textContent', params)
366
411
  end
367
412
 
368
- def inner_text(selector, timeout: nil)
369
- params = { selector: selector, timeout: timeout }.compact
413
+ def inner_text(selector, strict: nil, timeout: nil)
414
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
370
415
  @channel.send_message_to_server('innerText', params)
371
416
  end
372
417
 
373
- def inner_html(selector, timeout: nil)
374
- params = { selector: selector, timeout: timeout }.compact
418
+ def inner_html(selector, strict: nil, timeout: nil)
419
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
375
420
  @channel.send_message_to_server('innerHTML', params)
376
421
  end
377
422
 
378
- def get_attribute(selector, name, timeout: nil)
423
+ def get_attribute(selector, name, strict: nil, timeout: nil)
379
424
  params = {
380
425
  selector: selector,
381
426
  name: name,
427
+ strict: strict,
382
428
  timeout: timeout,
383
429
  }.compact
384
430
  @channel.send_message_to_server('getAttribute', params)
@@ -389,6 +435,7 @@ module Playwright
389
435
  force: nil,
390
436
  modifiers: nil,
391
437
  position: nil,
438
+ strict: nil,
392
439
  timeout: nil,
393
440
  trial: nil)
394
441
  params = {
@@ -396,6 +443,7 @@ module Playwright
396
443
  force: force,
397
444
  modifiers: modifiers,
398
445
  position: position,
446
+ strict: strict,
399
447
  timeout: timeout,
400
448
  trial: trial,
401
449
  }.compact
@@ -410,7 +458,9 @@ module Playwright
410
458
  index: nil,
411
459
  value: nil,
412
460
  label: nil,
461
+ force: nil,
413
462
  noWaitAfter: nil,
463
+ strict: nil,
414
464
  timeout: nil)
415
465
  base_params = SelectOptionValues.new(
416
466
  element: element,
@@ -418,13 +468,24 @@ module Playwright
418
468
  value: value,
419
469
  label: label,
420
470
  ).as_params
421
- params = base_params.merge({ selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact)
471
+ params = base_params.merge({ selector: selector, force: force, noWaitAfter: noWaitAfter, strict: strict, timeout: timeout }.compact)
422
472
  @channel.send_message_to_server('selectOption', params)
423
473
  end
424
474
 
425
- def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
475
+ def input_value(selector, strict: nil, timeout: nil)
476
+ params = { selector: selector, strict: strict, timeout: timeout }.compact
477
+ @channel.send_message_to_server('inputValue', params)
478
+ end
479
+
480
+ def set_input_files(selector, files, noWaitAfter: nil, strict: nil, timeout: nil)
426
481
  file_payloads = InputFiles.new(files).as_params
427
- params = { files: file_payloads, selector: selector, noWaitAfter: noWaitAfter, timeout: timeout }.compact
482
+ params = {
483
+ files: file_payloads,
484
+ selector: selector,
485
+ noWaitAfter: noWaitAfter,
486
+ strict: strict,
487
+ timeout: timeout,
488
+ }.compact
428
489
  @channel.send_message_to_server('setInputFiles', params)
429
490
 
430
491
  nil
@@ -435,6 +496,7 @@ module Playwright
435
496
  text,
436
497
  delay: nil,
437
498
  noWaitAfter: nil,
499
+ strict: nil,
438
500
  timeout: nil)
439
501
 
440
502
  params = {
@@ -442,6 +504,7 @@ module Playwright
442
504
  text: text,
443
505
  delay: delay,
444
506
  noWaitAfter: noWaitAfter,
507
+ strict: strict,
445
508
  timeout: timeout,
446
509
  }.compact
447
510
  @channel.send_message_to_server('type', params)
@@ -454,6 +517,7 @@ module Playwright
454
517
  key,
455
518
  delay: nil,
456
519
  noWaitAfter: nil,
520
+ strict: nil,
457
521
  timeout: nil)
458
522
 
459
523
  params = {
@@ -461,6 +525,7 @@ module Playwright
461
525
  key: key,
462
526
  delay: delay,
463
527
  noWaitAfter: noWaitAfter,
528
+ strict: strict,
464
529
  timeout: timeout,
465
530
  }.compact
466
531
  @channel.send_message_to_server('press', params)
@@ -473,6 +538,7 @@ module Playwright
473
538
  force: nil,
474
539
  noWaitAfter: nil,
475
540
  position: nil,
541
+ strict: nil,
476
542
  timeout: nil,
477
543
  trial: nil)
478
544
 
@@ -481,6 +547,7 @@ module Playwright
481
547
  force: force,
482
548
  noWaitAfter: noWaitAfter,
483
549
  position: position,
550
+ strict: strict,
484
551
  timeout: timeout,
485
552
  trial: trial,
486
553
  }.compact
@@ -494,6 +561,7 @@ module Playwright
494
561
  force: nil,
495
562
  noWaitAfter: nil,
496
563
  position: nil,
564
+ strict: nil,
497
565
  timeout: nil,
498
566
  trial: nil)
499
567
 
@@ -502,6 +570,7 @@ module Playwright
502
570
  force: force,
503
571
  noWaitAfter: noWaitAfter,
504
572
  position: position,
573
+ strict: strict,
505
574
  timeout: timeout,
506
575
  trial: trial,
507
576
  }.compact
@@ -510,6 +579,10 @@ module Playwright
510
579
  nil
511
580
  end
512
581
 
582
+ def wait_for_timeout(timeout)
583
+ sleep(timeout / 1000.0)
584
+ end
585
+
513
586
  def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
514
587
  if polling.is_a?(String) && polling != 'raf'
515
588
  raise ArgumentError.new("Unknown polling option: #{polling}")
@@ -9,7 +9,7 @@ module Playwright
9
9
  private def after_initialize
10
10
  @browser_context = @parent
11
11
  @timeout_settings = TimeoutSettings.new(@browser_context.send(:_timeout_settings))
12
- @accessibility = Accessibility.new(@channel)
12
+ @accessibility = AccessibilityImpl.new(@channel)
13
13
  @keyboard = KeyboardImpl.new(@channel)
14
14
  @mouse = MouseImpl.new(@channel)
15
15
  @touchscreen = TouchscreenImpl.new(@channel)
@@ -21,8 +21,9 @@ module Playwright
21
21
  }
22
22
  end
23
23
  @closed = false
24
+ @workers = Set.new
24
25
  @bindings = {}
25
- @routes = Set.new
26
+ @routes = []
26
27
 
27
28
  @main_frame = ChannelOwners::Frame.from(@initializer['mainFrame'])
28
29
  @main_frame.send(:update_page_from_page, self)
@@ -66,7 +67,7 @@ module Playwright
66
67
  })
67
68
  @channel.on('worker', ->(params) {
68
69
  worker = ChannelOwners::Worker.from(params['worker'])
69
- # on_worker(worker)
70
+ on_worker(worker)
70
71
  })
71
72
  end
72
73
 
@@ -110,9 +111,16 @@ module Playwright
110
111
  @browser_context.send(:on_binding, binding_call)
111
112
  end
112
113
 
114
+ private def on_worker(worker)
115
+ worker.page = self
116
+ @workers << worker
117
+ emit(Events::Page::Worker, worker)
118
+ end
119
+
113
120
  private def on_close
114
121
  @closed = true
115
122
  @browser_context.send(:remove_page, self)
123
+ @browser_context.send(:remove_background_page, self)
116
124
  emit(Events::Page::Close)
117
125
  end
118
126
 
@@ -124,7 +132,7 @@ module Playwright
124
132
  end
125
133
 
126
134
  private def on_download(params)
127
- download = Download.new(
135
+ download = DownloadImpl.new(
128
136
  page: self,
129
137
  url: params['url'],
130
138
  suggested_filename: params['suggestedFilename'],
@@ -184,15 +192,8 @@ module Playwright
184
192
  if name
185
193
  @frames.find { |f| f.name == name }
186
194
  elsif url
187
- # ref: https://github.com/microsoft/playwright-python/blob/c4320c27cb080b385a5e45be46baa3cb7a9409ff/playwright/_impl/_helper.py#L104
188
- case url
189
- when String
190
- @frames.find { |f| f.url == url }
191
- when Regexp
192
- @frames.find { |f| url.match?(f.url) }
193
- else
194
- raise NotImplementedError.new('Page#frame with url is not completely implemented yet')
195
- end
195
+ matcher = UrlMatcher.new(url, base_url: @browser_context.send(:base_url))
196
+ @frames.find { |f| matcher.match?(f.url) }
196
197
  else
197
198
  raise ArgumentError.new('Either name or url matcher should be specified')
198
199
  end
@@ -212,44 +213,48 @@ module Playwright
212
213
  @channel.send_message_to_server('setDefaultTimeoutNoReply', timeout: timeout)
213
214
  end
214
215
 
215
- def query_selector(selector)
216
- @main_frame.query_selector(selector)
216
+ def query_selector(selector, strict: nil)
217
+ @main_frame.query_selector(selector, strict: strict)
217
218
  end
218
219
 
219
220
  def query_selector_all(selector)
220
221
  @main_frame.query_selector_all(selector)
221
222
  end
222
223
 
223
- def wait_for_selector(selector, state: nil, timeout: nil)
224
- @main_frame.wait_for_selector(selector, state: state, timeout: timeout)
224
+ def wait_for_selector(selector, state: nil, strict: nil, timeout: nil)
225
+ @main_frame.wait_for_selector(selector, state: state, strict: strict, timeout: timeout)
225
226
  end
226
227
 
227
- def checked?(selector, timeout: nil)
228
- @main_frame.checked?(selector, timeout: timeout)
228
+ def checked?(selector, strict: nil, timeout: nil)
229
+ @main_frame.checked?(selector, strict: strict, timeout: timeout)
229
230
  end
230
231
 
231
- def disabled?(selector, timeout: nil)
232
- @main_frame.disabled?(selector, timeout: timeout)
232
+ def disabled?(selector, strict: nil, timeout: nil)
233
+ @main_frame.disabled?(selector, strict: strict, timeout: timeout)
233
234
  end
234
235
 
235
- def editable?(selector, timeout: nil)
236
- @main_frame.editable?(selector, timeout: timeout)
236
+ def editable?(selector, strict: nil, timeout: nil)
237
+ @main_frame.editable?(selector, strict: strict, timeout: timeout)
237
238
  end
238
239
 
239
- def enabled?(selector, timeout: nil)
240
- @main_frame.enabled?(selector, timeout: timeout)
240
+ def enabled?(selector, strict: nil, timeout: nil)
241
+ @main_frame.enabled?(selector, strict: strict, timeout: timeout)
241
242
  end
242
243
 
243
- def hidden?(selector, timeout: nil)
244
- @main_frame.hidden?(selector, timeout: timeout)
244
+ def hidden?(selector, strict: nil, timeout: nil)
245
+ @main_frame.hidden?(selector, strict: strict, timeout: timeout)
245
246
  end
246
247
 
247
- def visible?(selector, timeout: nil)
248
- @main_frame.visible?(selector, timeout: timeout)
248
+ def visible?(selector, strict: nil, timeout: nil)
249
+ @main_frame.visible?(selector, strict: strict, timeout: timeout)
249
250
  end
250
251
 
251
- def dispatch_event(selector, type, eventInit: nil, timeout: nil)
252
- @main_frame.dispatch_event(selector, type, eventInit: eventInit, timeout: timeout)
252
+ def locator(selector)
253
+ @main_frame.locator(selector)
254
+ end
255
+
256
+ def dispatch_event(selector, type, eventInit: nil, strict: nil, timeout: nil)
257
+ @main_frame.dispatch_event(selector, type, eventInit: eventInit, strict: strict, timeout: timeout)
253
258
  end
254
259
 
255
260
  def evaluate(pageFunction, arg: nil)
@@ -260,8 +265,8 @@ module Playwright
260
265
  @main_frame.evaluate_handle(pageFunction, arg: arg)
261
266
  end
262
267
 
263
- def eval_on_selector(selector, pageFunction, arg: nil)
264
- @main_frame.eval_on_selector(selector, pageFunction, arg: arg)
268
+ def eval_on_selector(selector, pageFunction, arg: nil, strict: nil)
269
+ @main_frame.eval_on_selector(selector, pageFunction, arg: arg, strict: strict)
265
270
  end
266
271
 
267
272
  def eval_on_selector_all(selector, pageFunction, arg: nil)
@@ -377,8 +382,8 @@ module Playwright
377
382
  end
378
383
 
379
384
  def route(url, handler)
380
- entry = RouteHandlerEntry.new(url, handler)
381
- @routes << entry
385
+ entry = RouteHandlerEntry.new(url, @browser_context.send(:base_url), handler)
386
+ @routes.unshift(entry)
382
387
  if @routes.count >= 1
383
388
  @channel.send_message_to_server('setNetworkInterceptionEnabled', enabled: true)
384
389
  end
@@ -446,6 +451,7 @@ module Playwright
446
451
  modifiers: nil,
447
452
  noWaitAfter: nil,
448
453
  position: nil,
454
+ strict: nil,
449
455
  timeout: nil,
450
456
  trial: nil)
451
457
 
@@ -458,11 +464,31 @@ module Playwright
458
464
  modifiers: modifiers,
459
465
  noWaitAfter: noWaitAfter,
460
466
  position: position,
467
+ strict: strict,
461
468
  timeout: timeout,
462
469
  trial: trial,
463
470
  )
464
471
  end
465
472
 
473
+ def drag_and_drop(
474
+ source,
475
+ target,
476
+ force: nil,
477
+ noWaitAfter: nil,
478
+ strict: nil,
479
+ timeout: nil,
480
+ trial: nil)
481
+
482
+ @main_frame.drag_and_drop(
483
+ source,
484
+ target,
485
+ force: force,
486
+ noWaitAfter: noWaitAfter,
487
+ strict: strict,
488
+ timeout: timeout,
489
+ trial: trial)
490
+ end
491
+
466
492
  def dblclick(
467
493
  selector,
468
494
  button: nil,
@@ -471,6 +497,7 @@ module Playwright
471
497
  modifiers: nil,
472
498
  noWaitAfter: nil,
473
499
  position: nil,
500
+ strict: nil,
474
501
  timeout: nil,
475
502
  trial: nil)
476
503
  @main_frame.dblclick(
@@ -481,6 +508,7 @@ module Playwright
481
508
  modifiers: modifiers,
482
509
  noWaitAfter: noWaitAfter,
483
510
  position: position,
511
+ strict: strict,
484
512
  timeout: timeout,
485
513
  trial: trial,
486
514
  )
@@ -492,6 +520,7 @@ module Playwright
492
520
  modifiers: nil,
493
521
  noWaitAfter: nil,
494
522
  position: nil,
523
+ strict: nil,
495
524
  timeout: nil,
496
525
  trial: nil)
497
526
  @main_frame.tap_point(
@@ -500,33 +529,46 @@ module Playwright
500
529
  modifiers: modifiers,
501
530
  noWaitAfter: noWaitAfter,
502
531
  position: position,
532
+ strict: strict,
503
533
  timeout: timeout,
504
534
  trial: trial,
505
535
  )
506
536
  end
507
537
 
508
- def fill(selector, value, noWaitAfter: nil, timeout: nil)
509
- @main_frame.fill(selector, value, noWaitAfter: noWaitAfter, timeout: timeout)
538
+ def fill(
539
+ selector,
540
+ value,
541
+ force: nil,
542
+ noWaitAfter: nil,
543
+ strict: nil,
544
+ timeout: nil)
545
+ @main_frame.fill(
546
+ selector,
547
+ value,
548
+ force: force,
549
+ noWaitAfter: noWaitAfter,
550
+ strict: strict,
551
+ timeout: timeout)
510
552
  end
511
553
 
512
- def focus(selector, timeout: nil)
513
- @main_frame.focus(selector, timeout: timeout)
554
+ def focus(selector, strict: nil, timeout: nil)
555
+ @main_frame.focus(selector, strict: strict, timeout: timeout)
514
556
  end
515
557
 
516
- def text_content(selector, timeout: nil)
517
- @main_frame.text_content(selector, timeout: timeout)
558
+ def text_content(selector, strict: nil, timeout: nil)
559
+ @main_frame.text_content(selector, strict: strict, timeout: timeout)
518
560
  end
519
561
 
520
- def inner_text(selector, timeout: nil)
521
- @main_frame.inner_text(selector, timeout: timeout)
562
+ def inner_text(selector, strict: nil, timeout: nil)
563
+ @main_frame.inner_text(selector, strict: strict, timeout: timeout)
522
564
  end
523
565
 
524
- def inner_html(selector, timeout: nil)
525
- @main_frame.inner_html(selector, timeout: timeout)
566
+ def inner_html(selector, strict: nil, timeout: nil)
567
+ @main_frame.inner_html(selector, strict: strict, timeout: timeout)
526
568
  end
527
569
 
528
- def get_attribute(selector, name, timeout: nil)
529
- @main_frame.get_attribute(selector, name, timeout: timeout)
570
+ def get_attribute(selector, name, strict: nil, timeout: nil)
571
+ @main_frame.get_attribute(selector, name, strict: strict, timeout: timeout)
530
572
  end
531
573
 
532
574
  def hover(
@@ -534,6 +576,7 @@ module Playwright
534
576
  force: nil,
535
577
  modifiers: nil,
536
578
  position: nil,
579
+ strict: nil,
537
580
  timeout: nil,
538
581
  trial: nil)
539
582
  @main_frame.hover(
@@ -541,6 +584,7 @@ module Playwright
541
584
  force: force,
542
585
  modifiers: modifiers,
543
586
  position: position,
587
+ strict: strict,
544
588
  timeout: timeout,
545
589
  trial: trial,
546
590
  )
@@ -552,7 +596,9 @@ module Playwright
552
596
  index: nil,
553
597
  value: nil,
554
598
  label: nil,
599
+ force: nil,
555
600
  noWaitAfter: nil,
601
+ strict: nil,
556
602
  timeout: nil)
557
603
  @main_frame.select_option(
558
604
  selector,
@@ -560,13 +606,24 @@ module Playwright
560
606
  index: index,
561
607
  value: value,
562
608
  label: label,
609
+ force: force,
563
610
  noWaitAfter: noWaitAfter,
611
+ strict: strict,
564
612
  timeout: timeout,
565
613
  )
566
614
  end
567
615
 
568
- def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
569
- @main_frame.set_input_files(selector, files, noWaitAfter: noWaitAfter, timeout: timeout)
616
+ def input_value(selector, strict: nil, timeout: nil)
617
+ @main_frame.input_value(selector, strict: strict, timeout: timeout)
618
+ end
619
+
620
+ def set_input_files(selector, files, noWaitAfter: nil, strict: nil,timeout: nil)
621
+ @main_frame.set_input_files(
622
+ selector,
623
+ files,
624
+ noWaitAfter: noWaitAfter,
625
+ strict: strict,
626
+ timeout: timeout)
570
627
  end
571
628
 
572
629
  def type(
@@ -574,9 +631,16 @@ module Playwright
574
631
  text,
575
632
  delay: nil,
576
633
  noWaitAfter: nil,
634
+ strict: nil,
577
635
  timeout: nil)
578
636
 
579
- @main_frame.type(selector, text, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout)
637
+ @main_frame.type(
638
+ selector,
639
+ text,
640
+ delay: delay,
641
+ noWaitAfter: noWaitAfter,
642
+ strict: strict,
643
+ timeout: timeout)
580
644
  end
581
645
 
582
646
  def press(
@@ -584,9 +648,16 @@ module Playwright
584
648
  key,
585
649
  delay: nil,
586
650
  noWaitAfter: nil,
651
+ strict: nil,
587
652
  timeout: nil)
588
653
 
589
- @main_frame.press(selector, key, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout)
654
+ @main_frame.press(
655
+ selector,
656
+ key,
657
+ delay: delay,
658
+ noWaitAfter: noWaitAfter,
659
+ strict: strict,
660
+ timeout: timeout)
590
661
  end
591
662
 
592
663
  def check(
@@ -594,10 +665,18 @@ module Playwright
594
665
  force: nil,
595
666
  noWaitAfter: nil,
596
667
  position: nil,
668
+ strict: nil,
597
669
  timeout: nil,
598
670
  trial: nil)
599
671
 
600
- @main_frame.check(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout, trial: trial)
672
+ @main_frame.check(
673
+ selector,
674
+ force: force,
675
+ noWaitAfter: noWaitAfter,
676
+ position: position,
677
+ strict: strict,
678
+ timeout: timeout,
679
+ trial: trial)
601
680
  end
602
681
 
603
682
  def uncheck(
@@ -605,16 +684,36 @@ module Playwright
605
684
  force: nil,
606
685
  noWaitAfter: nil,
607
686
  position: nil,
687
+ strict: nil,
608
688
  timeout: nil,
609
689
  trial: nil)
610
690
 
611
- @main_frame.uncheck(selector, force: force, noWaitAfter: noWaitAfter, position: position, timeout: timeout, trial: trial)
691
+ @main_frame.uncheck(
692
+ selector,
693
+ force: force,
694
+ noWaitAfter: noWaitAfter,
695
+ position: position,
696
+ strict: strict,
697
+ timeout: timeout,
698
+ trial: trial)
699
+ end
700
+
701
+ def wait_for_timeout(timeout)
702
+ @main_frame.wait_for_timeout(timeout)
612
703
  end
613
704
 
614
705
  def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
615
706
  @main_frame.wait_for_function(pageFunction, arg: arg, polling: polling, timeout: timeout)
616
707
  end
617
708
 
709
+ def workers
710
+ @workers.to_a
711
+ end
712
+
713
+ def pause
714
+ @browser_context.send(:pause)
715
+ end
716
+
618
717
  def pdf(
619
718
  displayHeaderFooter: nil,
620
719
  footerTemplate: nil,
@@ -748,7 +847,7 @@ module Playwright
748
847
  predicate =
749
848
  case urlOrPredicate
750
849
  when String, Regexp
751
- url_matcher = UrlMatcher.new(urlOrPredicate)
850
+ url_matcher = UrlMatcher.new(urlOrPredicate, base_url: @browser_context.send(:base_url))
752
851
  -> (req){ url_matcher.match?(req.url) }
753
852
  when Proc
754
853
  urlOrPredicate
@@ -767,7 +866,7 @@ module Playwright
767
866
  predicate =
768
867
  case urlOrPredicate
769
868
  when String, Regexp
770
- url_matcher = UrlMatcher.new(urlOrPredicate)
869
+ url_matcher = UrlMatcher.new(urlOrPredicate, base_url: @browser_context.send(:base_url))
771
870
  -> (req){ url_matcher.match?(req.url) }
772
871
  when Proc
773
872
  urlOrPredicate
@@ -782,6 +881,10 @@ module Playwright
782
881
  expect_event(Events::Page::WebSocket, predicate: predicate, timeout: timeout, &block)
783
882
  end
784
883
 
884
+ def expect_worker(predicate: nil, timeout: nil, &block)
885
+ expect_event(Events::Page::Worker, predicate: predicate, timeout: timeout, &block)
886
+ end
887
+
785
888
  # called from Frame with send(:timeout_settings)
786
889
  private def timeout_settings
787
890
  @timeout_settings
@@ -792,6 +895,11 @@ module Playwright
792
895
  @bindings.key?(name)
793
896
  end
794
897
 
898
+ # called from Worker#on_close
899
+ private def remove_worker(worker)
900
+ @workers.delete(worker)
901
+ end
902
+
795
903
  # Expose guid for library developers.
796
904
  # Not intended to be used by users.
797
905
  def guid