playwright-ruby-client 0.7.0 → 0.9.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -0
  3. data/documentation/docs/api/browser.md +18 -2
  4. data/documentation/docs/api/browser_context.md +10 -0
  5. data/documentation/docs/api/browser_type.md +1 -0
  6. data/documentation/docs/api/cdp_session.md +41 -1
  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 +78 -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 +107 -19
  14. data/documentation/docs/api/response.md +16 -0
  15. data/documentation/docs/article/guides/inspector.md +31 -0
  16. data/documentation/docs/article/guides/playwright_on_alpine_linux.md +91 -0
  17. data/documentation/docs/article/guides/rails_integration.md +1 -1
  18. data/documentation/docs/article/guides/semi_automation.md +5 -1
  19. data/documentation/docs/include/api_coverage.md +70 -7
  20. data/lib/playwright.rb +36 -4
  21. data/lib/playwright/channel_owners/artifact.rb +4 -0
  22. data/lib/playwright/channel_owners/browser.rb +5 -0
  23. data/lib/playwright/channel_owners/browser_context.rb +37 -3
  24. data/lib/playwright/channel_owners/cdp_session.rb +19 -0
  25. data/lib/playwright/channel_owners/element_handle.rb +11 -4
  26. data/lib/playwright/channel_owners/frame.rb +103 -34
  27. data/lib/playwright/channel_owners/page.rb +140 -53
  28. data/lib/playwright/channel_owners/response.rb +9 -1
  29. data/lib/playwright/connection.rb +2 -4
  30. data/lib/playwright/{download.rb → download_impl.rb} +5 -1
  31. data/lib/playwright/javascript/expression.rb +5 -4
  32. data/lib/playwright/locator_impl.rb +314 -0
  33. data/lib/playwright/route_handler_entry.rb +3 -2
  34. data/lib/playwright/timeout_settings.rb +4 -4
  35. data/lib/playwright/transport.rb +0 -1
  36. data/lib/playwright/url_matcher.rb +12 -2
  37. data/lib/playwright/version.rb +2 -2
  38. data/lib/playwright/web_socket_client.rb +164 -0
  39. data/lib/playwright/web_socket_transport.rb +104 -0
  40. data/lib/playwright_api/android.rb +6 -6
  41. data/lib/playwright_api/android_device.rb +10 -9
  42. data/lib/playwright_api/browser.rb +17 -11
  43. data/lib/playwright_api/browser_context.rb +14 -9
  44. data/lib/playwright_api/browser_type.rb +8 -7
  45. data/lib/playwright_api/cdp_session.rb +30 -8
  46. data/lib/playwright_api/console_message.rb +6 -6
  47. data/lib/playwright_api/dialog.rb +6 -6
  48. data/lib/playwright_api/download.rb +70 -0
  49. data/lib/playwright_api/element_handle.rb +44 -24
  50. data/lib/playwright_api/frame.rb +100 -49
  51. data/lib/playwright_api/js_handle.rb +6 -6
  52. data/lib/playwright_api/locator.rb +509 -0
  53. data/lib/playwright_api/page.rb +110 -57
  54. data/lib/playwright_api/playwright.rb +6 -6
  55. data/lib/playwright_api/request.rb +6 -6
  56. data/lib/playwright_api/response.rb +15 -10
  57. data/lib/playwright_api/route.rb +6 -6
  58. data/lib/playwright_api/selectors.rb +6 -6
  59. data/lib/playwright_api/web_socket.rb +6 -6
  60. data/lib/playwright_api/worker.rb +6 -6
  61. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9342eb9d31cb69d5eee5734d2143505672336cb630599f5d92a3e07559b76421
4
- data.tar.gz: 66a5f38c686c7477037740cddf2d6572b63b21dd791f92a0c179fd292ee0b8e6
3
+ metadata.gz: 5c0e5286a6e8faaa590ce17ed083f4e6f93c54fb6899571c5edc2a99c4148b15
4
+ data.tar.gz: bccd47264ec992c5c901c94faf28ec346a606d75e4636ae80828e5d64a685bf0
5
5
  SHA512:
6
- metadata.gz: 9adc1be3cbef06c38bcb1080e26c8b816311dc81573b6d089f55fd286e9e29d9a29831f1655a2d8189d1c20ed6bea0fd108a98ed347d4c1c1281753d64cddd2b
7
- data.tar.gz: f65e5ff953e8b1f6ef54a031cda1a53819bdb0c62caa44b5dc34a2011bc1d72d867a838de98bc7e2cbc8b0d34899cf19b6b89c4d008aa7a98f60871e91b3021e
6
+ metadata.gz: c34792ec1bb838c99b5a540833c7e02c718147738d2b6129eb9ba63f53e6d6d1460e5abc62f9e94fecec2bc9dd07321c9badc1c4e4173ae0548151ebcbc38e12
7
+ data.tar.gz: 12b99906a534b8ec3a5eef041824ec4d0357fe70e3a1c696dc4f11a95c1b54edbe8c7a5d67694c7b9dc846bd34fa6e18fbb3d84f241aa345a1d89c8af4ac4a39
data/README.md CHANGED
@@ -159,6 +159,32 @@ end
159
159
 
160
160
  ```
161
161
 
162
+ ### Communicate with Playwright server
163
+
164
+ If your environment doesn't accept installing browser or creating browser process, consider separating Ruby client and Playwright server.
165
+
166
+ ![structure](https://user-images.githubusercontent.com/11763113/124934448-ad4d0700-e03f-11eb-942e-b9f3282bb703.png)
167
+
168
+ For launching Playwright server, just execute:
169
+
170
+ ```
171
+ npx playwright install && npx playwright run-server 8080
172
+ ```
173
+
174
+ and we can connect to the server with the code like this:
175
+
176
+ ```ruby
177
+ Playwright.connect_to_playwright_server('ws://127.0.0.1:8080') do |playwright|
178
+ playwright.chromium.launch do |browser|
179
+ page = browser.new_page
180
+ page.goto('https://github.com/YusukeIwaki')
181
+ page.screenshot(path: './YusukeIwaki.png')
182
+ end
183
+ end
184
+ ```
185
+
186
+ When `Playwright.connect_to_playwright_server` is used, playwright_cli_executable_path is not required.
187
+
162
188
  ## License
163
189
 
164
190
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -61,11 +61,22 @@ def connected?
61
61
 
62
62
  Indicates that the browser is connected.
63
63
 
64
+ ## new_browser_cdp_session
65
+
66
+ ```
67
+ def new_browser_cdp_session
68
+ ```
69
+
70
+ > NOTE: CDP Sessions are only supported on Chromium-based browsers.
71
+
72
+ Returns the newly created browser session.
73
+
64
74
  ## new_context
65
75
 
66
76
  ```
67
77
  def new_context(
68
78
  acceptDownloads: nil,
79
+ baseURL: nil,
69
80
  bypassCSP: nil,
70
81
  colorScheme: nil,
71
82
  deviceScaleFactor: nil,
@@ -114,6 +125,7 @@ end
114
125
  ```
115
126
  def new_page(
116
127
  acceptDownloads: nil,
128
+ baseURL: nil,
117
129
  bypassCSP: nil,
118
130
  colorScheme: nil,
119
131
  deviceScaleFactor: nil,
@@ -154,7 +166,9 @@ testing frameworks should explicitly create [Browser#new_context](./browser#new_
154
166
  def start_tracing(page: nil, categories: nil, path: nil, screenshots: nil)
155
167
  ```
156
168
 
157
- > NOTE: Tracing is only supported on Chromium-based browsers.
169
+ > NOTE: This API controls [Chromium Tracing](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
170
+ which is a low-level chromium-specific debugging tool. API to control [Playwright Tracing](https://playwright.dev/python/docs/trace-viewer) could be
171
+ found [here](./tracing).
158
172
 
159
173
  You can use [Browser#start_tracing](./browser#start_tracing) and [Browser#stop_tracing](./browser#stop_tracing) to create a trace file that can be
160
174
  opened in Chrome DevTools performance panel.
@@ -175,7 +189,9 @@ end
175
189
  def stop_tracing
176
190
  ```
177
191
 
178
- > NOTE: Tracing is only supported on Chromium-based browsers.
192
+ > NOTE: This API controls [Chromium Tracing](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
193
+ which is a low-level chromium-specific debugging tool. API to control [Playwright Tracing](https://playwright.dev/python/docs/trace-viewer) could be
194
+ found [here](./tracing).
179
195
 
180
196
  Returns the buffer with trace data.
181
197
 
@@ -226,6 +226,16 @@ def grant_permissions(permissions, origin: nil)
226
226
  Grants specified permissions to the browser context. Only grants corresponding permissions to the given origin if
227
227
  specified.
228
228
 
229
+ ## new_cdp_session
230
+
231
+ ```
232
+ def new_cdp_session(page)
233
+ ```
234
+
235
+ > NOTE: CDP sessions are only supported on Chromium-based browsers.
236
+
237
+ Returns the newly created session.
238
+
229
239
  ## new_page
230
240
 
231
241
  ```
@@ -103,6 +103,7 @@ def launch_persistent_context(
103
103
  userDataDir,
104
104
  acceptDownloads: nil,
105
105
  args: nil,
106
+ baseURL: nil,
106
107
  bypassCSP: nil,
107
108
  channel: nil,
108
109
  chromiumSandbox: nil,
@@ -4,4 +4,44 @@ sidebar_position: 10
4
4
 
5
5
  # CDPSession
6
6
 
7
- Not Implemented
7
+ - extends: [EventEmitter]
8
+
9
+ The [CDPSession](./cdp_session) instances are used to talk raw Chrome Devtools Protocol:
10
+ - protocol methods can be called with `session.send_message` method.
11
+ - protocol events can be subscribed to with `session.on` method.
12
+
13
+ Useful links:
14
+ - Documentation on DevTools Protocol can be found here:
15
+ [DevTools Protocol Viewer](https://chromedevtools.github.io/devtools-protocol/).
16
+ - Getting Started with DevTools Protocol:
17
+ https://github.com/aslushnikov/getting-started-with-cdp/blob/master/README.md
18
+
19
+ ```ruby
20
+ client = page.context.new_cdp_session(page)
21
+ client.send_message('Animation.enable')
22
+ client.on('Animation.animationCreated', -> (_) { puts 'Animation Created' })
23
+ response = client.send_message('Animation.getPlaybackRate')
24
+ puts "Playback rate is #{response['playbackRate']}"
25
+ client.send_message(
26
+ 'Animation.setPlaybackRate',
27
+ params: { playbackRate: response['playbackRate'] / 2.0 },
28
+ )
29
+ ```
30
+
31
+
32
+ ## detach
33
+
34
+ ```
35
+ def detach
36
+ ```
37
+
38
+ Detaches the CDPSession from the target. Once detached, the CDPSession object won't emit any events and can't be used to
39
+ send messages.
40
+
41
+ ## send_message
42
+
43
+ ```
44
+ def send_message(method, params: nil)
45
+ ```
46
+
47
+
@@ -0,0 +1,97 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Download
6
+
7
+ [Download](./download) objects are dispatched by page via the [`event: Page.download`] event.
8
+
9
+ All the downloaded files belonging to the browser context are deleted when the browser context is closed.
10
+
11
+ Download event is emitted once the download starts. Download path becomes available once download completes:
12
+
13
+ ```ruby
14
+ download = page.expect_download do
15
+ page.click('a')
16
+ end
17
+
18
+ # wait for download to complete
19
+ path = download.path
20
+ ```
21
+
22
+ > NOTE: Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
23
+ downloaded content. If `acceptDownloads` is not set, download events are emitted, but the actual download is not
24
+ performed and user has no access to the downloaded files.
25
+
26
+ ## cancel
27
+
28
+ ```
29
+ def cancel
30
+ ```
31
+
32
+ Cancels a download. Will not fail if the download is already finished or canceled. Upon successful cancellations,
33
+ `download.failure()` would resolve to `'canceled'`.
34
+
35
+ ## delete
36
+
37
+ ```
38
+ def delete
39
+ ```
40
+
41
+ Deletes the downloaded file. Will wait for the download to finish if necessary.
42
+
43
+ ## failure
44
+
45
+ ```
46
+ def failure
47
+ ```
48
+
49
+ Returns download error if any. Will wait for the download to finish if necessary.
50
+
51
+ ## page
52
+
53
+ ```
54
+ def page
55
+ ```
56
+
57
+ Get the page that the download belongs to.
58
+
59
+ ## path
60
+
61
+ ```
62
+ def path
63
+ ```
64
+
65
+ Returns path to the downloaded file in case of successful download. The method will wait for the download to finish if
66
+ necessary. The method throws when connected remotely.
67
+
68
+ Note that the download's file name is a random GUID, use [Download#suggested_filename](./download#suggested_filename) to get suggested file
69
+ name.
70
+
71
+ ## save_as
72
+
73
+ ```
74
+ def save_as(path)
75
+ ```
76
+
77
+ Copy the download to a user-specified path. It is safe to call this method while the download is still in progress. Will
78
+ wait for the download to finish if necessary.
79
+
80
+ ## suggested_filename
81
+
82
+ ```
83
+ def suggested_filename
84
+ ```
85
+
86
+ Returns suggested filename for this download. It is typically computed by the browser from the
87
+ [`Content-Disposition`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) response header
88
+ or the `download` attribute. See the spec on [whatwg](https://html.spec.whatwg.org/#downloading-resources). Different
89
+ browsers can use different logic for computing it.
90
+
91
+ ## url
92
+
93
+ ```
94
+ def url
95
+ ```
96
+
97
+ Returns downloaded url.
@@ -10,10 +10,8 @@ ElementHandle represents an in-page DOM element. ElementHandles can be created w
10
10
  method.
11
11
 
12
12
  ```ruby
13
- page.goto("https://example.com")
14
13
  href_element = page.query_selector("a")
15
14
  href_element.click
16
- # ...
17
15
  ```
18
16
 
19
17
  ElementHandle prevents DOM element from garbage collection unless the handle is disposed with
@@ -22,6 +20,33 @@ ElementHandle prevents DOM element from garbage collection unless the handle is
22
20
  ElementHandle instances can be used as an argument in [Page#eval_on_selector](./page#eval_on_selector) and [Page#evaluate](./page#evaluate)
23
21
  methods.
24
22
 
23
+ > NOTE: In most cases, you would want to use the [Locator](./locator) object instead. You should only use [ElementHandle](./element_handle) if you
24
+ want to retain a handle to a particular DOM Node that you intend to pass into [Page#evaluate](./page#evaluate) as an argument.
25
+
26
+ The difference between the [Locator](./locator) and ElementHandle is that the ElementHandle points to a particular element, while
27
+ [Locator](./locator) captures the logic of how to retrieve an element.
28
+
29
+ In the example below, handle points to a particular DOM element on page. If that element changes text or is used by
30
+ React to render an entirely different component, handle is still pointing to that very DOM element. This can lead to
31
+ unexpected behaviors.
32
+
33
+ ```ruby
34
+ handle = page.query_selector("text=Submit")
35
+ handle.hover
36
+ handle.click
37
+ ```
38
+
39
+ With the locator, every time the `element` is used, up-to-date DOM element is located in the page using the selector. So
40
+ in the snippet below, underlying DOM element is going to be located twice.
41
+
42
+ ```ruby
43
+ locator = page.locator("text=Submit")
44
+ locator.hover
45
+ locator.click
46
+ ```
47
+
48
+
49
+
25
50
  ## bounding_box
26
51
 
27
52
  ```
@@ -232,7 +257,7 @@ feed_handle.eval_on_selector_all(".tweet", "nodes => nodes.map(n => n.innerText)
232
257
  ## fill
233
258
 
234
259
  ```
235
- def fill(value, noWaitAfter: nil, timeout: nil)
260
+ def fill(value, force: nil, noWaitAfter: nil, timeout: nil)
236
261
  ```
237
262
 
238
263
  This method waits for [actionability](https://playwright.dev/python/docs/actionability) checks, focuses the element, fills it and triggers an `input`
@@ -300,6 +325,14 @@ def inner_text
300
325
 
301
326
  Returns the `element.innerText`.
302
327
 
328
+ ## input_value
329
+
330
+ ```
331
+ def input_value(timeout: nil)
332
+ ```
333
+
334
+ Returns `input.value` for `<input>` or `<textarea>` element. Throws for non-input elements.
335
+
303
336
  ## checked?
304
337
 
305
338
  ```
@@ -436,6 +469,7 @@ def select_option(
436
469
  index: nil,
437
470
  value: nil,
438
471
  label: nil,
472
+ force: nil,
439
473
  noWaitAfter: nil,
440
474
  timeout: nil)
441
475
  ```
@@ -470,7 +504,7 @@ element_handle.select_option(value: "blue", index: 2, label: "red")
470
504
  ## select_text
471
505
 
472
506
  ```
473
- def select_text(timeout: nil)
507
+ def select_text(force: nil, timeout: nil)
474
508
  ```
475
509
 
476
510
  This method waits for [actionability](https://playwright.dev/python/docs/actionability) checks, then focuses the element and selects all its text
@@ -28,6 +28,7 @@ Returns information about a widget defined by `selector`.
28
28
  ```
29
29
  def launch_browser(
30
30
  acceptDownloads: nil,
31
+ baseURL: nil,
31
32
  bypassCSP: nil,
32
33
  colorScheme: nil,
33
34
  command: nil,
@@ -68,6 +68,7 @@ def check(
68
68
  force: nil,
69
69
  noWaitAfter: nil,
70
70
  position: nil,
71
+ strict: nil,
71
72
  timeout: nil,
72
73
  trial: nil)
73
74
  ```
@@ -106,6 +107,7 @@ def click(
106
107
  modifiers: nil,
107
108
  noWaitAfter: nil,
108
109
  position: nil,
110
+ strict: nil,
109
111
  timeout: nil,
110
112
  trial: nil)
111
113
  ```
@@ -140,6 +142,7 @@ def dblclick(
140
142
  modifiers: nil,
141
143
  noWaitAfter: nil,
142
144
  position: nil,
145
+ strict: nil,
143
146
  timeout: nil,
144
147
  trial: nil)
145
148
  ```
@@ -161,7 +164,12 @@ zero timeout disables this.
161
164
  ## dispatch_event
162
165
 
163
166
  ```
164
- def dispatch_event(selector, type, eventInit: nil, timeout: nil)
167
+ def dispatch_event(
168
+ selector,
169
+ type,
170
+ eventInit: nil,
171
+ strict: nil,
172
+ timeout: nil)
165
173
  ```
166
174
 
167
175
  The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
@@ -196,10 +204,25 @@ frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
196
204
 
197
205
 
198
206
 
207
+ ## drag_and_drop
208
+
209
+ ```
210
+ def drag_and_drop(
211
+ source,
212
+ target,
213
+ force: nil,
214
+ noWaitAfter: nil,
215
+ strict: nil,
216
+ timeout: nil,
217
+ trial: nil)
218
+ ```
219
+
220
+
221
+
199
222
  ## eval_on_selector
200
223
 
201
224
  ```
202
- def eval_on_selector(selector, expression, arg: nil)
225
+ def eval_on_selector(selector, expression, arg: nil, strict: nil)
203
226
  ```
204
227
 
205
228
  Returns the return value of `expression`.
@@ -326,7 +349,13 @@ result_handle.dispose
326
349
  ## fill
327
350
 
328
351
  ```
329
- def fill(selector, value, noWaitAfter: nil, timeout: nil)
352
+ def fill(
353
+ selector,
354
+ value,
355
+ force: nil,
356
+ noWaitAfter: nil,
357
+ strict: nil,
358
+ timeout: nil)
330
359
  ```
331
360
 
332
361
  This method waits for an element matching `selector`, waits for [actionability](https://playwright.dev/python/docs/actionability) checks, focuses the
@@ -343,7 +372,7 @@ To send fine-grained keyboard events, use [Frame#type](./frame#type).
343
372
  ## focus
344
373
 
345
374
  ```
346
- def focus(selector, timeout: nil)
375
+ def focus(selector, strict: nil, timeout: nil)
347
376
  ```
348
377
 
349
378
  This method fetches an element with `selector` and focuses it. If there's no element matching `selector`, the method
@@ -374,7 +403,7 @@ assert frame == content_frame
374
403
  ## get_attribute
375
404
 
376
405
  ```
377
- def get_attribute(selector, name, timeout: nil)
406
+ def get_attribute(selector, name, strict: nil, timeout: nil)
378
407
  ```
379
408
 
380
409
  Returns element attribute value.
@@ -412,6 +441,7 @@ def hover(
412
441
  force: nil,
413
442
  modifiers: nil,
414
443
  position: nil,
444
+ strict: nil,
415
445
  timeout: nil,
416
446
  trial: nil)
417
447
  ```
@@ -430,7 +460,7 @@ zero timeout disables this.
430
460
  ## inner_html
431
461
 
432
462
  ```
433
- def inner_html(selector, timeout: nil)
463
+ def inner_html(selector, strict: nil, timeout: nil)
434
464
  ```
435
465
 
436
466
  Returns `element.innerHTML`.
@@ -438,15 +468,23 @@ Returns `element.innerHTML`.
438
468
  ## inner_text
439
469
 
440
470
  ```
441
- def inner_text(selector, timeout: nil)
471
+ def inner_text(selector, strict: nil, timeout: nil)
442
472
  ```
443
473
 
444
474
  Returns `element.innerText`.
445
475
 
476
+ ## input_value
477
+
478
+ ```
479
+ def input_value(selector, strict: nil, timeout: nil)
480
+ ```
481
+
482
+ Returns `input.value` for the selected `<input>` or `<textarea>` element. Throws for non-input elements.
483
+
446
484
  ## checked?
447
485
 
448
486
  ```
449
- def checked?(selector, timeout: nil)
487
+ def checked?(selector, strict: nil, timeout: nil)
450
488
  ```
451
489
 
452
490
  Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
@@ -462,7 +500,7 @@ Returns `true` if the frame has been detached, or `false` otherwise.
462
500
  ## disabled?
463
501
 
464
502
  ```
465
- def disabled?(selector, timeout: nil)
503
+ def disabled?(selector, strict: nil, timeout: nil)
466
504
  ```
467
505
 
468
506
  Returns whether the element is disabled, the opposite of [enabled](https://playwright.dev/python/docs/actionability).
@@ -470,7 +508,7 @@ Returns whether the element is disabled, the opposite of [enabled](https://playw
470
508
  ## editable?
471
509
 
472
510
  ```
473
- def editable?(selector, timeout: nil)
511
+ def editable?(selector, strict: nil, timeout: nil)
474
512
  ```
475
513
 
476
514
  Returns whether the element is [editable](https://playwright.dev/python/docs/actionability).
@@ -478,7 +516,7 @@ Returns whether the element is [editable](https://playwright.dev/python/docs/act
478
516
  ## enabled?
479
517
 
480
518
  ```
481
- def enabled?(selector, timeout: nil)
519
+ def enabled?(selector, strict: nil, timeout: nil)
482
520
  ```
483
521
 
484
522
  Returns whether the element is [enabled](https://playwright.dev/python/docs/actionability).
@@ -486,7 +524,7 @@ Returns whether the element is [enabled](https://playwright.dev/python/docs/acti
486
524
  ## hidden?
487
525
 
488
526
  ```
489
- def hidden?(selector, timeout: nil)
527
+ def hidden?(selector, strict: nil, timeout: nil)
490
528
  ```
491
529
 
492
530
  Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/python/docs/actionability). `selector` that does not
@@ -495,12 +533,24 @@ match any elements is considered hidden.
495
533
  ## visible?
496
534
 
497
535
  ```
498
- def visible?(selector, timeout: nil)
536
+ def visible?(selector, strict: nil, timeout: nil)
499
537
  ```
500
538
 
501
539
  Returns whether the element is [visible](https://playwright.dev/python/docs/actionability). `selector` that does not match any elements is
502
540
  considered not visible.
503
541
 
542
+ ## locator
543
+
544
+ ```
545
+ def locator(selector)
546
+ ```
547
+
548
+ The method returns an element locator that can be used to perform actions in the frame. Locator is resolved to the
549
+ element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
550
+ different DOM elements. That would happen if the DOM structure between those actions has changed.
551
+
552
+ Note that locator always implies visibility, so it will always be locating visible elements.
553
+
504
554
  ## name
505
555
 
506
556
  ```
@@ -537,6 +587,7 @@ def press(
537
587
  key,
538
588
  delay: nil,
539
589
  noWaitAfter: nil,
590
+ strict: nil,
540
591
  timeout: nil)
541
592
  ```
542
593
 
@@ -560,7 +611,7 @@ modifier, modifier is pressed and being held while the subsequent key is being p
560
611
  ## query_selector
561
612
 
562
613
  ```
563
- def query_selector(selector)
614
+ def query_selector(selector, strict: nil)
564
615
  ```
565
616
 
566
617
  Returns the ElementHandle pointing to the frame element.
@@ -588,7 +639,9 @@ def select_option(
588
639
  index: nil,
589
640
  value: nil,
590
641
  label: nil,
642
+ force: nil,
591
643
  noWaitAfter: nil,
644
+ strict: nil,
592
645
  timeout: nil)
593
646
  ```
594
647
 
@@ -627,7 +680,12 @@ alias: `content=`
627
680
  ## set_input_files
628
681
 
629
682
  ```
630
- def set_input_files(selector, files, noWaitAfter: nil, timeout: nil)
683
+ def set_input_files(
684
+ selector,
685
+ files,
686
+ noWaitAfter: nil,
687
+ strict: nil,
688
+ timeout: nil)
631
689
  ```
632
690
 
633
691
  This method expects `selector` to point to an
@@ -645,6 +703,7 @@ def tap_point(
645
703
  modifiers: nil,
646
704
  noWaitAfter: nil,
647
705
  position: nil,
706
+ strict: nil,
648
707
  timeout: nil,
649
708
  trial: nil)
650
709
  ```
@@ -665,7 +724,7 @@ zero timeout disables this.
665
724
  ## text_content
666
725
 
667
726
  ```
668
- def text_content(selector, timeout: nil)
727
+ def text_content(selector, strict: nil, timeout: nil)
669
728
  ```
670
729
 
671
730
  Returns `element.textContent`.
@@ -686,6 +745,7 @@ def type(
686
745
  text,
687
746
  delay: nil,
688
747
  noWaitAfter: nil,
748
+ strict: nil,
689
749
  timeout: nil)
690
750
  ```
691
751
 
@@ -710,6 +770,7 @@ def uncheck(
710
770
  force: nil,
711
771
  noWaitAfter: nil,
712
772
  position: nil,
773
+ strict: nil,
713
774
  timeout: nil,
714
775
  trial: nil)
715
776
  ```
@@ -817,7 +878,7 @@ considered a navigation.
817
878
  ## wait_for_selector
818
879
 
819
880
  ```
820
- def wait_for_selector(selector, state: nil, timeout: nil)
881
+ def wait_for_selector(selector, state: nil, strict: nil, timeout: nil)
821
882
  ```
822
883
 
823
884
  Returns when element specified by selector satisfies `state` option. Returns `null` if waiting for `hidden` or