playwright-ruby-client 0.8.0 → 1.14.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/documentation/docs/api/accessibility.md +52 -1
- data/documentation/docs/api/browser.md +8 -2
- data/documentation/docs/api/browser_context.md +28 -0
- data/documentation/docs/api/browser_type.md +1 -0
- data/documentation/docs/api/download.md +97 -0
- data/documentation/docs/api/element_handle.md +28 -3
- data/documentation/docs/api/experimental/android_device.md +1 -0
- data/documentation/docs/api/frame.md +78 -18
- data/documentation/docs/api/keyboard.md +11 -20
- data/documentation/docs/api/locator.md +650 -0
- data/documentation/docs/api/page.md +124 -20
- data/documentation/docs/api/touchscreen.md +8 -0
- data/documentation/docs/api/worker.md +37 -0
- data/documentation/docs/article/guides/inspector.md +31 -0
- data/documentation/docs/article/guides/playwright_on_alpine_linux.md +91 -0
- data/documentation/docs/article/guides/semi_automation.md +5 -1
- data/documentation/docs/include/api_coverage.md +72 -15
- data/lib/playwright.rb +0 -1
- data/lib/playwright/accessibility_impl.rb +50 -0
- data/lib/playwright/channel_owners/artifact.rb +4 -0
- data/lib/playwright/channel_owners/browser_context.rb +77 -3
- data/lib/playwright/channel_owners/frame.rb +101 -35
- data/lib/playwright/channel_owners/page.rb +157 -56
- data/lib/playwright/channel_owners/worker.rb +23 -0
- data/lib/playwright/{download.rb → download_impl.rb} +5 -1
- data/lib/playwright/javascript/expression.rb +5 -4
- data/lib/playwright/locator_impl.rb +314 -0
- data/lib/playwright/route_handler_entry.rb +3 -2
- data/lib/playwright/timeout_settings.rb +4 -4
- data/lib/playwright/touchscreen_impl.rb +7 -0
- data/lib/playwright/tracing_impl.rb +9 -8
- data/lib/playwright/url_matcher.rb +12 -2
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright_api/accessibility.rb +1 -1
- data/lib/playwright_api/android.rb +6 -6
- data/lib/playwright_api/android_device.rb +8 -7
- data/lib/playwright_api/browser.rb +16 -10
- data/lib/playwright_api/browser_context.rb +16 -11
- data/lib/playwright_api/browser_type.rb +8 -7
- data/lib/playwright_api/cdp_session.rb +6 -6
- data/lib/playwright_api/console_message.rb +6 -6
- data/lib/playwright_api/dialog.rb +6 -6
- data/lib/playwright_api/download.rb +70 -0
- data/lib/playwright_api/element_handle.rb +34 -20
- data/lib/playwright_api/frame.rb +94 -52
- data/lib/playwright_api/js_handle.rb +6 -6
- data/lib/playwright_api/locator.rb +509 -0
- data/lib/playwright_api/page.rb +101 -57
- data/lib/playwright_api/playwright.rb +6 -6
- data/lib/playwright_api/request.rb +6 -6
- data/lib/playwright_api/response.rb +6 -6
- data/lib/playwright_api/route.rb +6 -11
- data/lib/playwright_api/selectors.rb +6 -6
- data/lib/playwright_api/touchscreen.rb +1 -1
- data/lib/playwright_api/web_socket.rb +6 -6
- data/lib/playwright_api/worker.rb +16 -6
- metadata +14 -6
@@ -7,19 +7,8 @@ module Playwright
|
|
7
7
|
# method.
|
8
8
|
#
|
9
9
|
# ```python sync
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# def run(playwright):
|
13
|
-
# chromium = playwright.chromium
|
14
|
-
# browser = chromium.launch()
|
15
|
-
# page = browser.new_page()
|
16
|
-
# page.goto("https://example.com")
|
17
|
-
# href_element = page.query_selector("a")
|
18
|
-
# href_element.click()
|
19
|
-
# # ...
|
20
|
-
#
|
21
|
-
# with sync_playwright() as playwright:
|
22
|
-
# run(playwright)
|
10
|
+
# href_element = page.query_selector("a")
|
11
|
+
# href_element.click()
|
23
12
|
# ```
|
24
13
|
#
|
25
14
|
# ElementHandle prevents DOM element from garbage collection unless the handle is disposed with
|
@@ -27,6 +16,31 @@ module Playwright
|
|
27
16
|
#
|
28
17
|
# ElementHandle instances can be used as an argument in [`method: Page.evalOnSelector`] and [`method: Page.evaluate`]
|
29
18
|
# methods.
|
19
|
+
#
|
20
|
+
# > NOTE: In most cases, you would want to use the `Locator` object instead. You should only use `ElementHandle` if you
|
21
|
+
# want to retain a handle to a particular DOM Node that you intend to pass into [`method: Page.evaluate`] as an argument.
|
22
|
+
#
|
23
|
+
# The difference between the `Locator` and ElementHandle is that the ElementHandle points to a particular element, while
|
24
|
+
# `Locator` captures the logic of how to retrieve an element.
|
25
|
+
#
|
26
|
+
# In the example below, handle points to a particular DOM element on page. If that element changes text or is used by
|
27
|
+
# React to render an entirely different component, handle is still pointing to that very DOM element. This can lead to
|
28
|
+
# unexpected behaviors.
|
29
|
+
#
|
30
|
+
# ```python sync
|
31
|
+
# handle = page.query_selector("text=Submit")
|
32
|
+
# handle.hover()
|
33
|
+
# handle.click()
|
34
|
+
# ```
|
35
|
+
#
|
36
|
+
# With the locator, every time the `element` is used, up-to-date DOM element is located in the page using the selector. So
|
37
|
+
# in the snippet below, underlying DOM element is going to be located twice.
|
38
|
+
#
|
39
|
+
# ```python sync
|
40
|
+
# locator = page.locator("text=Submit")
|
41
|
+
# locator.hover()
|
42
|
+
# locator.click()
|
43
|
+
# ```
|
30
44
|
class ElementHandle < JSHandle
|
31
45
|
|
32
46
|
# This method returns the bounding box of the element, or `null` if the element is not visible. The bounding box is
|
@@ -254,7 +268,7 @@ module Playwright
|
|
254
268
|
wrap_impl(@impl.inner_text)
|
255
269
|
end
|
256
270
|
|
257
|
-
# Returns `input.value` for `<input>` or `<textarea>` element. Throws for non-input elements.
|
271
|
+
# Returns `input.value` for `<input>` or `<textarea>` or `<select>` element. Throws for non-input elements.
|
258
272
|
def input_value(timeout: nil)
|
259
273
|
wrap_impl(@impl.input_value(timeout: unwrap_impl(timeout)))
|
260
274
|
end
|
@@ -515,12 +529,6 @@ module Playwright
|
|
515
529
|
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
516
530
|
end
|
517
531
|
|
518
|
-
# -- inherited from EventEmitter --
|
519
|
-
# @nodoc
|
520
|
-
def off(event, callback)
|
521
|
-
event_emitter_proxy.off(event, callback)
|
522
|
-
end
|
523
|
-
|
524
532
|
# -- inherited from EventEmitter --
|
525
533
|
# @nodoc
|
526
534
|
def once(event, callback)
|
@@ -533,6 +541,12 @@ module Playwright
|
|
533
541
|
event_emitter_proxy.on(event, callback)
|
534
542
|
end
|
535
543
|
|
544
|
+
# -- inherited from EventEmitter --
|
545
|
+
# @nodoc
|
546
|
+
def off(event, callback)
|
547
|
+
event_emitter_proxy.off(event, callback)
|
548
|
+
end
|
549
|
+
|
536
550
|
private def event_emitter_proxy
|
537
551
|
@event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
|
538
552
|
end
|
data/lib/playwright_api/frame.rb
CHANGED
@@ -65,9 +65,10 @@ module Playwright
|
|
65
65
|
force: nil,
|
66
66
|
noWaitAfter: nil,
|
67
67
|
position: nil,
|
68
|
+
strict: nil,
|
68
69
|
timeout: nil,
|
69
70
|
trial: nil)
|
70
|
-
wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
71
|
+
wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
71
72
|
end
|
72
73
|
|
73
74
|
def child_frames
|
@@ -93,9 +94,10 @@ module Playwright
|
|
93
94
|
modifiers: nil,
|
94
95
|
noWaitAfter: nil,
|
95
96
|
position: nil,
|
97
|
+
strict: nil,
|
96
98
|
timeout: nil,
|
97
99
|
trial: nil)
|
98
|
-
wrap_impl(@impl.click(unwrap_impl(selector), button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
100
|
+
wrap_impl(@impl.click(unwrap_impl(selector), button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
99
101
|
end
|
100
102
|
|
101
103
|
# Gets the full HTML contents of the frame, including the doctype.
|
@@ -124,9 +126,10 @@ module Playwright
|
|
124
126
|
modifiers: nil,
|
125
127
|
noWaitAfter: nil,
|
126
128
|
position: nil,
|
129
|
+
strict: nil,
|
127
130
|
timeout: nil,
|
128
131
|
trial: nil)
|
129
|
-
wrap_impl(@impl.dblclick(unwrap_impl(selector), button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
132
|
+
wrap_impl(@impl.dblclick(unwrap_impl(selector), button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
130
133
|
end
|
131
134
|
|
132
135
|
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
@@ -156,8 +159,26 @@ module Playwright
|
|
156
159
|
# data_transfer = frame.evaluate_handle("new DataTransfer()")
|
157
160
|
# frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
158
161
|
# ```
|
159
|
-
def dispatch_event(
|
160
|
-
|
162
|
+
def dispatch_event(
|
163
|
+
selector,
|
164
|
+
type,
|
165
|
+
eventInit: nil,
|
166
|
+
strict: nil,
|
167
|
+
timeout: nil)
|
168
|
+
wrap_impl(@impl.dispatch_event(unwrap_impl(selector), unwrap_impl(type), eventInit: unwrap_impl(eventInit), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
169
|
+
end
|
170
|
+
|
171
|
+
def drag_and_drop(
|
172
|
+
source,
|
173
|
+
target,
|
174
|
+
force: nil,
|
175
|
+
noWaitAfter: nil,
|
176
|
+
sourcePosition: nil,
|
177
|
+
strict: nil,
|
178
|
+
targetPosition: nil,
|
179
|
+
timeout: nil,
|
180
|
+
trial: nil)
|
181
|
+
wrap_impl(@impl.drag_and_drop(unwrap_impl(source), unwrap_impl(target), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), sourcePosition: unwrap_impl(sourcePosition), strict: unwrap_impl(strict), targetPosition: unwrap_impl(targetPosition), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
161
182
|
end
|
162
183
|
|
163
184
|
# Returns the return value of `expression`.
|
@@ -176,8 +197,8 @@ module Playwright
|
|
176
197
|
# preload_href = frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
177
198
|
# html = frame.eval_on_selector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello")
|
178
199
|
# ```
|
179
|
-
def eval_on_selector(selector, expression, arg: nil)
|
180
|
-
wrap_impl(@impl.eval_on_selector(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
200
|
+
def eval_on_selector(selector, expression, arg: nil, strict: nil)
|
201
|
+
wrap_impl(@impl.eval_on_selector(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg), strict: unwrap_impl(strict)))
|
181
202
|
end
|
182
203
|
|
183
204
|
# Returns the return value of `expression`.
|
@@ -276,14 +297,15 @@ module Playwright
|
|
276
297
|
value,
|
277
298
|
force: nil,
|
278
299
|
noWaitAfter: nil,
|
300
|
+
strict: nil,
|
279
301
|
timeout: nil)
|
280
|
-
wrap_impl(@impl.fill(unwrap_impl(selector), unwrap_impl(value), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
302
|
+
wrap_impl(@impl.fill(unwrap_impl(selector), unwrap_impl(value), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
281
303
|
end
|
282
304
|
|
283
305
|
# This method fetches an element with `selector` and focuses it. If there's no element matching `selector`, the method
|
284
306
|
# waits until a matching element appears in the DOM.
|
285
|
-
def focus(selector, timeout: nil)
|
286
|
-
wrap_impl(@impl.focus(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
307
|
+
def focus(selector, strict: nil, timeout: nil)
|
308
|
+
wrap_impl(@impl.focus(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
287
309
|
end
|
288
310
|
|
289
311
|
# Returns the `frame` or `iframe` element handle which corresponds to this frame.
|
@@ -303,8 +325,8 @@ module Playwright
|
|
303
325
|
end
|
304
326
|
|
305
327
|
# Returns element attribute value.
|
306
|
-
def get_attribute(selector, name, timeout: nil)
|
307
|
-
wrap_impl(@impl.get_attribute(unwrap_impl(selector), unwrap_impl(name), timeout: unwrap_impl(timeout)))
|
328
|
+
def get_attribute(selector, name, strict: nil, timeout: nil)
|
329
|
+
wrap_impl(@impl.get_attribute(unwrap_impl(selector), unwrap_impl(name), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
308
330
|
end
|
309
331
|
|
310
332
|
# Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
|
@@ -344,29 +366,30 @@ module Playwright
|
|
344
366
|
force: nil,
|
345
367
|
modifiers: nil,
|
346
368
|
position: nil,
|
369
|
+
strict: nil,
|
347
370
|
timeout: nil,
|
348
371
|
trial: nil)
|
349
|
-
wrap_impl(@impl.hover(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
372
|
+
wrap_impl(@impl.hover(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
350
373
|
end
|
351
374
|
|
352
375
|
# Returns `element.innerHTML`.
|
353
|
-
def inner_html(selector, timeout: nil)
|
354
|
-
wrap_impl(@impl.inner_html(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
376
|
+
def inner_html(selector, strict: nil, timeout: nil)
|
377
|
+
wrap_impl(@impl.inner_html(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
355
378
|
end
|
356
379
|
|
357
380
|
# Returns `element.innerText`.
|
358
|
-
def inner_text(selector, timeout: nil)
|
359
|
-
wrap_impl(@impl.inner_text(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
381
|
+
def inner_text(selector, strict: nil, timeout: nil)
|
382
|
+
wrap_impl(@impl.inner_text(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
360
383
|
end
|
361
384
|
|
362
|
-
# Returns `input.value` for the selected `<input>` or `<textarea>` element. Throws for non-input elements.
|
363
|
-
def input_value(selector, timeout: nil)
|
364
|
-
wrap_impl(@impl.input_value(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
385
|
+
# Returns `input.value` for the selected `<input>` or `<textarea>` or `<select>` element. Throws for non-input elements.
|
386
|
+
def input_value(selector, strict: nil, timeout: nil)
|
387
|
+
wrap_impl(@impl.input_value(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
365
388
|
end
|
366
389
|
|
367
390
|
# Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
|
368
|
-
def checked?(selector, timeout: nil)
|
369
|
-
wrap_impl(@impl.checked?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
391
|
+
def checked?(selector, strict: nil, timeout: nil)
|
392
|
+
wrap_impl(@impl.checked?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
370
393
|
end
|
371
394
|
|
372
395
|
# Returns `true` if the frame has been detached, or `false` otherwise.
|
@@ -375,30 +398,39 @@ module Playwright
|
|
375
398
|
end
|
376
399
|
|
377
400
|
# Returns whether the element is disabled, the opposite of [enabled](./actionability.md#enabled).
|
378
|
-
def disabled?(selector, timeout: nil)
|
379
|
-
wrap_impl(@impl.disabled?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
401
|
+
def disabled?(selector, strict: nil, timeout: nil)
|
402
|
+
wrap_impl(@impl.disabled?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
380
403
|
end
|
381
404
|
|
382
405
|
# Returns whether the element is [editable](./actionability.md#editable).
|
383
|
-
def editable?(selector, timeout: nil)
|
384
|
-
wrap_impl(@impl.editable?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
406
|
+
def editable?(selector, strict: nil, timeout: nil)
|
407
|
+
wrap_impl(@impl.editable?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
385
408
|
end
|
386
409
|
|
387
410
|
# Returns whether the element is [enabled](./actionability.md#enabled).
|
388
|
-
def enabled?(selector, timeout: nil)
|
389
|
-
wrap_impl(@impl.enabled?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
411
|
+
def enabled?(selector, strict: nil, timeout: nil)
|
412
|
+
wrap_impl(@impl.enabled?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
390
413
|
end
|
391
414
|
|
392
415
|
# Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible). `selector` that does not
|
393
416
|
# match any elements is considered hidden.
|
394
|
-
def hidden?(selector, timeout: nil)
|
395
|
-
wrap_impl(@impl.hidden?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
417
|
+
def hidden?(selector, strict: nil, timeout: nil)
|
418
|
+
wrap_impl(@impl.hidden?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
396
419
|
end
|
397
420
|
|
398
421
|
# Returns whether the element is [visible](./actionability.md#visible). `selector` that does not match any elements is
|
399
422
|
# considered not visible.
|
400
|
-
def visible?(selector, timeout: nil)
|
401
|
-
wrap_impl(@impl.visible?(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
423
|
+
def visible?(selector, strict: nil, timeout: nil)
|
424
|
+
wrap_impl(@impl.visible?(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
425
|
+
end
|
426
|
+
|
427
|
+
# The method returns an element locator that can be used to perform actions in the frame. Locator is resolved to the
|
428
|
+
# element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
|
429
|
+
# different DOM elements. That would happen if the DOM structure between those actions has changed.
|
430
|
+
#
|
431
|
+
# Note that locator always implies visibility, so it will always be locating visible elements.
|
432
|
+
def locator(selector)
|
433
|
+
wrap_impl(@impl.locator(unwrap_impl(selector)))
|
402
434
|
end
|
403
435
|
|
404
436
|
# Returns frame's name attribute as specified in the tag.
|
@@ -441,16 +473,17 @@ module Playwright
|
|
441
473
|
key,
|
442
474
|
delay: nil,
|
443
475
|
noWaitAfter: nil,
|
476
|
+
strict: nil,
|
444
477
|
timeout: nil)
|
445
|
-
wrap_impl(@impl.press(unwrap_impl(selector), unwrap_impl(key), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
478
|
+
wrap_impl(@impl.press(unwrap_impl(selector), unwrap_impl(key), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
446
479
|
end
|
447
480
|
|
448
481
|
# Returns the ElementHandle pointing to the frame element.
|
449
482
|
#
|
450
483
|
# The method finds an element matching the specified selector within the frame. See
|
451
484
|
# [Working with selectors](./selectors.md) for more details. If no elements match the selector, returns `null`.
|
452
|
-
def query_selector(selector)
|
453
|
-
wrap_impl(@impl.query_selector(unwrap_impl(selector)))
|
485
|
+
def query_selector(selector, strict: nil)
|
486
|
+
wrap_impl(@impl.query_selector(unwrap_impl(selector), strict: unwrap_impl(strict)))
|
454
487
|
end
|
455
488
|
|
456
489
|
# Returns the ElementHandles pointing to the frame elements.
|
@@ -488,8 +521,9 @@ module Playwright
|
|
488
521
|
label: nil,
|
489
522
|
force: nil,
|
490
523
|
noWaitAfter: nil,
|
524
|
+
strict: nil,
|
491
525
|
timeout: nil)
|
492
|
-
wrap_impl(@impl.select_option(unwrap_impl(selector), element: unwrap_impl(element), index: unwrap_impl(index), value: unwrap_impl(value), label: unwrap_impl(label), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
526
|
+
wrap_impl(@impl.select_option(unwrap_impl(selector), element: unwrap_impl(element), index: unwrap_impl(index), value: unwrap_impl(value), label: unwrap_impl(label), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
493
527
|
end
|
494
528
|
|
495
529
|
def set_content(html, timeout: nil, waitUntil: nil)
|
@@ -502,8 +536,13 @@ module Playwright
|
|
502
536
|
#
|
503
537
|
# Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
|
504
538
|
# are resolved relative to the the current working directory. For empty array, clears the selected files.
|
505
|
-
def set_input_files(
|
506
|
-
|
539
|
+
def set_input_files(
|
540
|
+
selector,
|
541
|
+
files,
|
542
|
+
noWaitAfter: nil,
|
543
|
+
strict: nil,
|
544
|
+
timeout: nil)
|
545
|
+
wrap_impl(@impl.set_input_files(unwrap_impl(selector), unwrap_impl(files), noWaitAfter: unwrap_impl(noWaitAfter), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
507
546
|
end
|
508
547
|
|
509
548
|
# This method taps an element matching `selector` by performing the following steps:
|
@@ -524,14 +563,15 @@ module Playwright
|
|
524
563
|
modifiers: nil,
|
525
564
|
noWaitAfter: nil,
|
526
565
|
position: nil,
|
566
|
+
strict: nil,
|
527
567
|
timeout: nil,
|
528
568
|
trial: nil)
|
529
|
-
wrap_impl(@impl.tap_point(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
569
|
+
wrap_impl(@impl.tap_point(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
530
570
|
end
|
531
571
|
|
532
572
|
# Returns `element.textContent`.
|
533
|
-
def text_content(selector, timeout: nil)
|
534
|
-
wrap_impl(@impl.text_content(unwrap_impl(selector), timeout: unwrap_impl(timeout)))
|
573
|
+
def text_content(selector, strict: nil, timeout: nil)
|
574
|
+
wrap_impl(@impl.text_content(unwrap_impl(selector), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
535
575
|
end
|
536
576
|
|
537
577
|
# Returns the page title.
|
@@ -553,8 +593,9 @@ module Playwright
|
|
553
593
|
text,
|
554
594
|
delay: nil,
|
555
595
|
noWaitAfter: nil,
|
596
|
+
strict: nil,
|
556
597
|
timeout: nil)
|
557
|
-
wrap_impl(@impl.type(unwrap_impl(selector), unwrap_impl(text), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
598
|
+
wrap_impl(@impl.type(unwrap_impl(selector), unwrap_impl(text), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
558
599
|
end
|
559
600
|
|
560
601
|
# This method checks an element matching `selector` by performing the following steps:
|
@@ -575,9 +616,10 @@ module Playwright
|
|
575
616
|
force: nil,
|
576
617
|
noWaitAfter: nil,
|
577
618
|
position: nil,
|
619
|
+
strict: nil,
|
578
620
|
timeout: nil,
|
579
621
|
trial: nil)
|
580
|
-
wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
622
|
+
wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
581
623
|
end
|
582
624
|
|
583
625
|
# Returns frame's url.
|
@@ -671,8 +713,8 @@ module Playwright
|
|
671
713
|
# with sync_playwright() as playwright:
|
672
714
|
# run(playwright)
|
673
715
|
# ```
|
674
|
-
def wait_for_selector(selector, state: nil, timeout: nil)
|
675
|
-
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
716
|
+
def wait_for_selector(selector, state: nil, strict: nil, timeout: nil)
|
717
|
+
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), strict: unwrap_impl(strict), timeout: unwrap_impl(timeout)))
|
676
718
|
end
|
677
719
|
|
678
720
|
# Waits for the given `timeout` in milliseconds.
|
@@ -680,7 +722,7 @@ module Playwright
|
|
680
722
|
# Note that `frame.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going to
|
681
723
|
# be flaky. Use signals such as network events, selectors becoming visible and others instead.
|
682
724
|
def wait_for_timeout(timeout)
|
683
|
-
|
725
|
+
wrap_impl(@impl.wait_for_timeout(unwrap_impl(timeout)))
|
684
726
|
end
|
685
727
|
|
686
728
|
# Waits for the frame to navigate to the given URL.
|
@@ -698,12 +740,6 @@ module Playwright
|
|
698
740
|
wrap_impl(@impl.detached=(unwrap_impl(req)))
|
699
741
|
end
|
700
742
|
|
701
|
-
# -- inherited from EventEmitter --
|
702
|
-
# @nodoc
|
703
|
-
def off(event, callback)
|
704
|
-
event_emitter_proxy.off(event, callback)
|
705
|
-
end
|
706
|
-
|
707
743
|
# -- inherited from EventEmitter --
|
708
744
|
# @nodoc
|
709
745
|
def once(event, callback)
|
@@ -716,6 +752,12 @@ module Playwright
|
|
716
752
|
event_emitter_proxy.on(event, callback)
|
717
753
|
end
|
718
754
|
|
755
|
+
# -- inherited from EventEmitter --
|
756
|
+
# @nodoc
|
757
|
+
def off(event, callback)
|
758
|
+
event_emitter_proxy.off(event, callback)
|
759
|
+
end
|
760
|
+
|
719
761
|
private def event_emitter_proxy
|
720
762
|
@event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
|
721
763
|
end
|
@@ -88,12 +88,6 @@ module Playwright
|
|
88
88
|
wrap_impl(@impl.to_s)
|
89
89
|
end
|
90
90
|
|
91
|
-
# -- inherited from EventEmitter --
|
92
|
-
# @nodoc
|
93
|
-
def off(event, callback)
|
94
|
-
event_emitter_proxy.off(event, callback)
|
95
|
-
end
|
96
|
-
|
97
91
|
# -- inherited from EventEmitter --
|
98
92
|
# @nodoc
|
99
93
|
def once(event, callback)
|
@@ -106,6 +100,12 @@ module Playwright
|
|
106
100
|
event_emitter_proxy.on(event, callback)
|
107
101
|
end
|
108
102
|
|
103
|
+
# -- inherited from EventEmitter --
|
104
|
+
# @nodoc
|
105
|
+
def off(event, callback)
|
106
|
+
event_emitter_proxy.off(event, callback)
|
107
|
+
end
|
108
|
+
|
109
109
|
private def event_emitter_proxy
|
110
110
|
@event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
|
111
111
|
end
|
@@ -0,0 +1,509 @@
|
|
1
|
+
module Playwright
|
2
|
+
# Locator represents a view to the element(s) on the page. It captures the logic sufficient to retrieve the element at any
|
3
|
+
# given moment. Locator can be created with the [`method: Page.locator`] method.
|
4
|
+
#
|
5
|
+
# ```python sync
|
6
|
+
# locator = page.locator("text=Submit")
|
7
|
+
# locator.click()
|
8
|
+
# ```
|
9
|
+
#
|
10
|
+
# The difference between the Locator and `ElementHandle` is that the latter points to a particular element, while Locator
|
11
|
+
# captures the logic of how to retrieve that element.
|
12
|
+
#
|
13
|
+
# In the example below, handle points to a particular DOM element on page. If that element changes text or is used by
|
14
|
+
# React to render an entirely different component, handle is still pointing to that very DOM element. This can lead to
|
15
|
+
# unexpected behaviors.
|
16
|
+
#
|
17
|
+
# ```python sync
|
18
|
+
# handle = page.query_selector("text=Submit")
|
19
|
+
# handle.hover()
|
20
|
+
# handle.click()
|
21
|
+
# ```
|
22
|
+
#
|
23
|
+
# With the locator, every time the `element` is used, up-to-date DOM element is located in the page using the selector. So
|
24
|
+
# in the snippet below, underlying DOM element is going to be located twice.
|
25
|
+
#
|
26
|
+
# ```python sync
|
27
|
+
# locator = page.locator("text=Submit")
|
28
|
+
# locator.hover()
|
29
|
+
# locator.click()
|
30
|
+
# ```
|
31
|
+
class Locator < PlaywrightApi
|
32
|
+
|
33
|
+
# Returns an array of `node.innerText` values for all matching nodes.
|
34
|
+
def all_inner_texts
|
35
|
+
wrap_impl(@impl.all_inner_texts)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns an array of `node.textContent` values for all matching nodes.
|
39
|
+
def all_text_contents
|
40
|
+
wrap_impl(@impl.all_text_contents)
|
41
|
+
end
|
42
|
+
|
43
|
+
# This method returns the bounding box of the element, or `null` if the element is not visible. The bounding box is
|
44
|
+
# calculated relative to the main frame viewport - which is usually the same as the browser window.
|
45
|
+
#
|
46
|
+
# Scrolling affects the returned bonding box, similarly to
|
47
|
+
# [Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). That
|
48
|
+
# means `x` and/or `y` may be negative.
|
49
|
+
#
|
50
|
+
# Elements from child frames return the bounding box relative to the main frame, unlike the
|
51
|
+
# [Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).
|
52
|
+
#
|
53
|
+
# Assuming the page is static, it is safe to use bounding box coordinates to perform input. For example, the following
|
54
|
+
# snippet should click the center of the element.
|
55
|
+
#
|
56
|
+
# ```python sync
|
57
|
+
# box = element.bounding_box()
|
58
|
+
# page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
|
59
|
+
# ```
|
60
|
+
def bounding_box(timeout: nil)
|
61
|
+
wrap_impl(@impl.bounding_box(timeout: unwrap_impl(timeout)))
|
62
|
+
end
|
63
|
+
|
64
|
+
# This method checks the element by performing the following steps:
|
65
|
+
# 1. Ensure that element is a checkbox or a radio input. If not, this method throws. If the element is already checked,
|
66
|
+
# this method returns immediately.
|
67
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
68
|
+
# 1. Scroll the element into view if needed.
|
69
|
+
# 1. Use [`property: Page.mouse`] to click in the center of the element.
|
70
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
71
|
+
# 1. Ensure that the element is now checked. If not, this method throws.
|
72
|
+
#
|
73
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
74
|
+
#
|
75
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
76
|
+
# zero timeout disables this.
|
77
|
+
def check(
|
78
|
+
force: nil,
|
79
|
+
noWaitAfter: nil,
|
80
|
+
position: nil,
|
81
|
+
timeout: nil,
|
82
|
+
trial: nil)
|
83
|
+
wrap_impl(@impl.check(force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
84
|
+
end
|
85
|
+
|
86
|
+
# This method clicks the element by performing the following steps:
|
87
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
88
|
+
# 1. Scroll the element into view if needed.
|
89
|
+
# 1. Use [`property: Page.mouse`] to click in the center of the element, or the specified `position`.
|
90
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
91
|
+
#
|
92
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
93
|
+
#
|
94
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
95
|
+
# zero timeout disables this.
|
96
|
+
def click(
|
97
|
+
button: nil,
|
98
|
+
clickCount: nil,
|
99
|
+
delay: nil,
|
100
|
+
force: nil,
|
101
|
+
modifiers: nil,
|
102
|
+
noWaitAfter: nil,
|
103
|
+
position: nil,
|
104
|
+
timeout: nil,
|
105
|
+
trial: nil)
|
106
|
+
wrap_impl(@impl.click(button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the number of elements matching given selector.
|
110
|
+
def count
|
111
|
+
wrap_impl(@impl.count)
|
112
|
+
end
|
113
|
+
|
114
|
+
# This method double clicks the element by performing the following steps:
|
115
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
116
|
+
# 1. Scroll the element into view if needed.
|
117
|
+
# 1. Use [`property: Page.mouse`] to double click in the center of the element, or the specified `position`.
|
118
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set. Note that if the
|
119
|
+
# first click of the `dblclick()` triggers a navigation event, this method will throw.
|
120
|
+
#
|
121
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
122
|
+
#
|
123
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
124
|
+
# zero timeout disables this.
|
125
|
+
#
|
126
|
+
# > NOTE: `element.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
127
|
+
def dblclick(
|
128
|
+
button: nil,
|
129
|
+
delay: nil,
|
130
|
+
force: nil,
|
131
|
+
modifiers: nil,
|
132
|
+
noWaitAfter: nil,
|
133
|
+
position: nil,
|
134
|
+
timeout: nil,
|
135
|
+
trial: nil)
|
136
|
+
wrap_impl(@impl.dblclick(button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
137
|
+
end
|
138
|
+
|
139
|
+
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
140
|
+
# `click` is dispatched. This is equivalent to calling
|
141
|
+
# [element.click()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click).
|
142
|
+
#
|
143
|
+
# ```python sync
|
144
|
+
# element.dispatch_event("click")
|
145
|
+
# ```
|
146
|
+
#
|
147
|
+
# Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
148
|
+
# and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
149
|
+
#
|
150
|
+
# Since `eventInit` is event-specific, please refer to the events documentation for the lists of initial properties:
|
151
|
+
# - [DragEvent](https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/DragEvent)
|
152
|
+
# - [FocusEvent](https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/FocusEvent)
|
153
|
+
# - [KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent)
|
154
|
+
# - [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent)
|
155
|
+
# - [PointerEvent](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/PointerEvent)
|
156
|
+
# - [TouchEvent](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/TouchEvent)
|
157
|
+
# - [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event/Event)
|
158
|
+
#
|
159
|
+
# You can also specify `JSHandle` as the property value if you want live objects to be passed into the event:
|
160
|
+
#
|
161
|
+
# ```python sync
|
162
|
+
# # note you can only create data_transfer in chromium and firefox
|
163
|
+
# data_transfer = page.evaluate_handle("new DataTransfer()")
|
164
|
+
# element.dispatch_event("#source", "dragstart", {"dataTransfer": data_transfer})
|
165
|
+
# ```
|
166
|
+
def dispatch_event(type, eventInit: nil, timeout: nil)
|
167
|
+
wrap_impl(@impl.dispatch_event(unwrap_impl(type), eventInit: unwrap_impl(eventInit), timeout: unwrap_impl(timeout)))
|
168
|
+
end
|
169
|
+
|
170
|
+
# Resolves given locator to the first matching DOM element. If no elements matching the query are visible, waits for them
|
171
|
+
# up to a given timeout. If multiple elements match the selector, throws.
|
172
|
+
def element_handle(timeout: nil)
|
173
|
+
wrap_impl(@impl.element_handle(timeout: unwrap_impl(timeout)))
|
174
|
+
end
|
175
|
+
|
176
|
+
# Resolves given locator to all matching DOM elements.
|
177
|
+
def element_handles
|
178
|
+
wrap_impl(@impl.element_handles)
|
179
|
+
end
|
180
|
+
|
181
|
+
# Returns the return value of `expression`.
|
182
|
+
#
|
183
|
+
# This method passes this handle as the first argument to `expression`.
|
184
|
+
#
|
185
|
+
# If `expression` returns a [Promise], then `handle.evaluate` would wait for the promise to resolve and return its value.
|
186
|
+
#
|
187
|
+
# Examples:
|
188
|
+
#
|
189
|
+
# ```python sync
|
190
|
+
# tweets = page.locator(".tweet .retweets")
|
191
|
+
# assert tweets.evaluate("node => node.innerText") == "10 retweets"
|
192
|
+
# ```
|
193
|
+
def evaluate(expression, arg: nil, timeout: nil)
|
194
|
+
wrap_impl(@impl.evaluate(unwrap_impl(expression), arg: unwrap_impl(arg), timeout: unwrap_impl(timeout)))
|
195
|
+
end
|
196
|
+
|
197
|
+
# The method finds all elements matching the specified locator and passes an array of matched elements as a first argument
|
198
|
+
# to `expression`. Returns the result of `expression` invocation.
|
199
|
+
#
|
200
|
+
# If `expression` returns a [Promise], then [`Locator.evaluateAll`] would wait for the promise to resolve and return its
|
201
|
+
# value.
|
202
|
+
#
|
203
|
+
# Examples:
|
204
|
+
#
|
205
|
+
# ```python sync
|
206
|
+
# elements = page.locator("div")
|
207
|
+
# div_counts = elements("(divs, min) => divs.length >= min", 10)
|
208
|
+
# ```
|
209
|
+
def evaluate_all(expression, arg: nil)
|
210
|
+
wrap_impl(@impl.evaluate_all(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
211
|
+
end
|
212
|
+
|
213
|
+
# Returns the return value of `expression` as a `JSHandle`.
|
214
|
+
#
|
215
|
+
# This method passes this handle as the first argument to `expression`.
|
216
|
+
#
|
217
|
+
# The only difference between [`method: Locator.evaluate`] and [`method: Locator.evaluateHandle`] is that
|
218
|
+
# [`method: Locator.evaluateHandle`] returns `JSHandle`.
|
219
|
+
#
|
220
|
+
# If the function passed to the [`method: Locator.evaluateHandle`] returns a [Promise], then
|
221
|
+
# [`method: Locator.evaluateHandle`] would wait for the promise to resolve and return its value.
|
222
|
+
#
|
223
|
+
# See [`method: Page.evaluateHandle`] for more details.
|
224
|
+
def evaluate_handle(expression, arg: nil, timeout: nil)
|
225
|
+
wrap_impl(@impl.evaluate_handle(unwrap_impl(expression), arg: unwrap_impl(arg), timeout: unwrap_impl(timeout)))
|
226
|
+
end
|
227
|
+
|
228
|
+
# This method waits for [actionability](./actionability.md) checks, focuses the element, fills it and triggers an `input`
|
229
|
+
# event after filling. Note that you can pass an empty string to clear the input field.
|
230
|
+
#
|
231
|
+
# If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error.
|
232
|
+
# However, if the element is inside the `<label>` element that has an associated
|
233
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled
|
234
|
+
# instead.
|
235
|
+
#
|
236
|
+
# To send fine-grained keyboard events, use [`method: Locator.type`].
|
237
|
+
def fill(value, force: nil, noWaitAfter: nil, timeout: nil)
|
238
|
+
wrap_impl(@impl.fill(unwrap_impl(value), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
239
|
+
end
|
240
|
+
|
241
|
+
# Returns locator to the first matching element.
|
242
|
+
def first
|
243
|
+
wrap_impl(@impl.first)
|
244
|
+
end
|
245
|
+
|
246
|
+
# Calls [focus](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) on the element.
|
247
|
+
def focus(timeout: nil)
|
248
|
+
wrap_impl(@impl.focus(timeout: unwrap_impl(timeout)))
|
249
|
+
end
|
250
|
+
|
251
|
+
# Returns element attribute value.
|
252
|
+
def get_attribute(name, timeout: nil)
|
253
|
+
wrap_impl(@impl.get_attribute(unwrap_impl(name), timeout: unwrap_impl(timeout)))
|
254
|
+
end
|
255
|
+
|
256
|
+
# This method hovers over the element by performing the following steps:
|
257
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
258
|
+
# 1. Scroll the element into view if needed.
|
259
|
+
# 1. Use [`property: Page.mouse`] to hover over the center of the element, or the specified `position`.
|
260
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
261
|
+
#
|
262
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
263
|
+
#
|
264
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
265
|
+
# zero timeout disables this.
|
266
|
+
def hover(
|
267
|
+
force: nil,
|
268
|
+
modifiers: nil,
|
269
|
+
position: nil,
|
270
|
+
timeout: nil,
|
271
|
+
trial: nil)
|
272
|
+
wrap_impl(@impl.hover(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
273
|
+
end
|
274
|
+
|
275
|
+
# Returns the `element.innerHTML`.
|
276
|
+
def inner_html(timeout: nil)
|
277
|
+
wrap_impl(@impl.inner_html(timeout: unwrap_impl(timeout)))
|
278
|
+
end
|
279
|
+
|
280
|
+
# Returns the `element.innerText`.
|
281
|
+
def inner_text(timeout: nil)
|
282
|
+
wrap_impl(@impl.inner_text(timeout: unwrap_impl(timeout)))
|
283
|
+
end
|
284
|
+
|
285
|
+
# Returns `input.value` for `<input>` or `<textarea>` or `<select>` element. Throws for non-input elements.
|
286
|
+
def input_value(timeout: nil)
|
287
|
+
wrap_impl(@impl.input_value(timeout: unwrap_impl(timeout)))
|
288
|
+
end
|
289
|
+
|
290
|
+
# Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
|
291
|
+
def checked?(timeout: nil)
|
292
|
+
wrap_impl(@impl.checked?(timeout: unwrap_impl(timeout)))
|
293
|
+
end
|
294
|
+
|
295
|
+
# Returns whether the element is disabled, the opposite of [enabled](./actionability.md#enabled).
|
296
|
+
def disabled?(timeout: nil)
|
297
|
+
wrap_impl(@impl.disabled?(timeout: unwrap_impl(timeout)))
|
298
|
+
end
|
299
|
+
|
300
|
+
# Returns whether the element is [editable](./actionability.md#editable).
|
301
|
+
def editable?(timeout: nil)
|
302
|
+
wrap_impl(@impl.editable?(timeout: unwrap_impl(timeout)))
|
303
|
+
end
|
304
|
+
|
305
|
+
# Returns whether the element is [enabled](./actionability.md#enabled).
|
306
|
+
def enabled?(timeout: nil)
|
307
|
+
wrap_impl(@impl.enabled?(timeout: unwrap_impl(timeout)))
|
308
|
+
end
|
309
|
+
|
310
|
+
# Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible).
|
311
|
+
def hidden?(timeout: nil)
|
312
|
+
wrap_impl(@impl.hidden?(timeout: unwrap_impl(timeout)))
|
313
|
+
end
|
314
|
+
|
315
|
+
# Returns whether the element is [visible](./actionability.md#visible).
|
316
|
+
def visible?(timeout: nil)
|
317
|
+
wrap_impl(@impl.visible?(timeout: unwrap_impl(timeout)))
|
318
|
+
end
|
319
|
+
|
320
|
+
# Returns locator to the last matching element.
|
321
|
+
def last
|
322
|
+
wrap_impl(@impl.last)
|
323
|
+
end
|
324
|
+
|
325
|
+
# The method finds an element matching the specified selector in the `Locator`'s subtree. See
|
326
|
+
# [Working with selectors](./selectors.md) for more details.
|
327
|
+
def locator(selector)
|
328
|
+
wrap_impl(@impl.locator(unwrap_impl(selector)))
|
329
|
+
end
|
330
|
+
|
331
|
+
# Returns locator to the n-th matching element.
|
332
|
+
def nth(index)
|
333
|
+
wrap_impl(@impl.nth(unwrap_impl(index)))
|
334
|
+
end
|
335
|
+
|
336
|
+
# Focuses the element, and then uses [`method: Keyboard.down`] and [`method: Keyboard.up`].
|
337
|
+
#
|
338
|
+
# `key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
339
|
+
# value or a single character to generate the text for. A superset of the `key` values can be found
|
340
|
+
# [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:
|
341
|
+
#
|
342
|
+
# `F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`,
|
343
|
+
# `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.
|
344
|
+
#
|
345
|
+
# Following modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`.
|
346
|
+
#
|
347
|
+
# Holding down `Shift` will type the text that corresponds to the `key` in the upper case.
|
348
|
+
#
|
349
|
+
# If `key` is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective
|
350
|
+
# texts.
|
351
|
+
#
|
352
|
+
# Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
|
353
|
+
# modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
354
|
+
def press(key, delay: nil, noWaitAfter: nil, timeout: nil)
|
355
|
+
wrap_impl(@impl.press(unwrap_impl(key), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
356
|
+
end
|
357
|
+
|
358
|
+
# Returns the buffer with the captured screenshot.
|
359
|
+
#
|
360
|
+
# This method waits for the [actionability](./actionability.md) checks, then scrolls element into view before taking a
|
361
|
+
# screenshot. If the element is detached from DOM, the method throws an error.
|
362
|
+
def screenshot(
|
363
|
+
omitBackground: nil,
|
364
|
+
path: nil,
|
365
|
+
quality: nil,
|
366
|
+
timeout: nil,
|
367
|
+
type: nil)
|
368
|
+
wrap_impl(@impl.screenshot(omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
|
369
|
+
end
|
370
|
+
|
371
|
+
# This method waits for [actionability](./actionability.md) checks, then tries to scroll element into view, unless it is
|
372
|
+
# completely visible as defined by
|
373
|
+
# [IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)'s `ratio`.
|
374
|
+
def scroll_into_view_if_needed(timeout: nil)
|
375
|
+
wrap_impl(@impl.scroll_into_view_if_needed(timeout: unwrap_impl(timeout)))
|
376
|
+
end
|
377
|
+
|
378
|
+
# This method waits for [actionability](./actionability.md) checks, waits until all specified options are present in the
|
379
|
+
# `<select>` element and selects these options.
|
380
|
+
#
|
381
|
+
# If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
|
382
|
+
# `<label>` element that has an associated
|
383
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be used instead.
|
384
|
+
#
|
385
|
+
# Returns the array of option values that have been successfully selected.
|
386
|
+
#
|
387
|
+
# Triggers a `change` and `input` event once all the provided options have been selected.
|
388
|
+
#
|
389
|
+
# ```python sync
|
390
|
+
# # single selection matching the value
|
391
|
+
# element.select_option("blue")
|
392
|
+
# # single selection matching both the label
|
393
|
+
# element.select_option(label="blue")
|
394
|
+
# # multiple selection
|
395
|
+
# element.select_option(value=["red", "green", "blue"])
|
396
|
+
# ```
|
397
|
+
#
|
398
|
+
# ```python sync
|
399
|
+
# # single selection matching the value
|
400
|
+
# element.select_option("blue")
|
401
|
+
# # single selection matching both the value and the label
|
402
|
+
# element.select_option(label="blue")
|
403
|
+
# # multiple selection
|
404
|
+
# element.select_option("red", "green", "blue")
|
405
|
+
# # multiple selection for blue, red and second option
|
406
|
+
# element.select_option(value="blue", { index: 2 }, "red")
|
407
|
+
# ```
|
408
|
+
def select_option(
|
409
|
+
element: nil,
|
410
|
+
index: nil,
|
411
|
+
value: nil,
|
412
|
+
label: nil,
|
413
|
+
force: nil,
|
414
|
+
noWaitAfter: nil,
|
415
|
+
timeout: nil)
|
416
|
+
wrap_impl(@impl.select_option(element: unwrap_impl(element), index: unwrap_impl(index), value: unwrap_impl(value), label: unwrap_impl(label), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
417
|
+
end
|
418
|
+
|
419
|
+
# This method waits for [actionability](./actionability.md) checks, then focuses the element and selects all its text
|
420
|
+
# content.
|
421
|
+
def select_text(force: nil, timeout: nil)
|
422
|
+
wrap_impl(@impl.select_text(force: unwrap_impl(force), timeout: unwrap_impl(timeout)))
|
423
|
+
end
|
424
|
+
|
425
|
+
# This method expects `element` to point to an
|
426
|
+
# [input element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
|
427
|
+
#
|
428
|
+
# Sets the value of the file input to these file paths or files. If some of the `filePaths` are relative paths, then they
|
429
|
+
# are resolved relative to the the current working directory. For empty array, clears the selected files.
|
430
|
+
def set_input_files(files, noWaitAfter: nil, timeout: nil)
|
431
|
+
wrap_impl(@impl.set_input_files(unwrap_impl(files), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
432
|
+
end
|
433
|
+
alias_method :input_files=, :set_input_files
|
434
|
+
|
435
|
+
# This method taps the element by performing the following steps:
|
436
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
437
|
+
# 1. Scroll the element into view if needed.
|
438
|
+
# 1. Use [`property: Page.touchscreen`] to tap the center of the element, or the specified `position`.
|
439
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
440
|
+
#
|
441
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
442
|
+
#
|
443
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
444
|
+
# zero timeout disables this.
|
445
|
+
#
|
446
|
+
# > NOTE: `element.tap()` requires that the `hasTouch` option of the browser context be set to true.
|
447
|
+
def tap_point(
|
448
|
+
force: nil,
|
449
|
+
modifiers: nil,
|
450
|
+
noWaitAfter: nil,
|
451
|
+
position: nil,
|
452
|
+
timeout: nil,
|
453
|
+
trial: nil)
|
454
|
+
wrap_impl(@impl.tap_point(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
455
|
+
end
|
456
|
+
|
457
|
+
# Returns the `node.textContent`.
|
458
|
+
def text_content(timeout: nil)
|
459
|
+
wrap_impl(@impl.text_content(timeout: unwrap_impl(timeout)))
|
460
|
+
end
|
461
|
+
|
462
|
+
# Focuses the element, and then sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
463
|
+
#
|
464
|
+
# To press a special key, like `Control` or `ArrowDown`, use [`method: Locator.press`].
|
465
|
+
#
|
466
|
+
# ```python sync
|
467
|
+
# element.type("hello") # types instantly
|
468
|
+
# element.type("world", delay=100) # types slower, like a user
|
469
|
+
# ```
|
470
|
+
#
|
471
|
+
# An example of typing into a text field and then submitting the form:
|
472
|
+
#
|
473
|
+
# ```python sync
|
474
|
+
# element = page.locator("input")
|
475
|
+
# element.type("some text")
|
476
|
+
# element.press("Enter")
|
477
|
+
# ```
|
478
|
+
def type(text, delay: nil, noWaitAfter: nil, timeout: nil)
|
479
|
+
wrap_impl(@impl.type(unwrap_impl(text), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
480
|
+
end
|
481
|
+
|
482
|
+
# This method checks the element by performing the following steps:
|
483
|
+
# 1. Ensure that element is a checkbox or a radio input. If not, this method throws. If the element is already
|
484
|
+
# unchecked, this method returns immediately.
|
485
|
+
# 1. Wait for [actionability](./actionability.md) checks on the element, unless `force` option is set.
|
486
|
+
# 1. Scroll the element into view if needed.
|
487
|
+
# 1. Use [`property: Page.mouse`] to click in the center of the element.
|
488
|
+
# 1. Wait for initiated navigations to either succeed or fail, unless `noWaitAfter` option is set.
|
489
|
+
# 1. Ensure that the element is now unchecked. If not, this method throws.
|
490
|
+
#
|
491
|
+
# If the element is detached from the DOM at any moment during the action, this method throws.
|
492
|
+
#
|
493
|
+
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
494
|
+
# zero timeout disables this.
|
495
|
+
def uncheck(
|
496
|
+
force: nil,
|
497
|
+
noWaitAfter: nil,
|
498
|
+
position: nil,
|
499
|
+
timeout: nil,
|
500
|
+
trial: nil)
|
501
|
+
wrap_impl(@impl.uncheck(force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
502
|
+
end
|
503
|
+
|
504
|
+
# @nodoc
|
505
|
+
def to_s
|
506
|
+
wrap_impl(@impl.to_s)
|
507
|
+
end
|
508
|
+
end
|
509
|
+
end
|