playwright-ruby-client 1.37.1 → 1.39.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -7
- data/documentation/docs/api/browser.md +13 -9
- data/documentation/docs/api/browser_context.md +51 -32
- data/documentation/docs/api/browser_type.md +12 -7
- data/documentation/docs/api/dialog.md +18 -15
- data/documentation/docs/api/download.md +17 -7
- data/documentation/docs/api/element_handle.md +7 -19
- data/documentation/docs/api/frame.md +55 -30
- data/documentation/docs/api/keyboard.md +4 -0
- data/documentation/docs/api/locator.md +57 -16
- data/documentation/docs/api/page.md +102 -54
- data/documentation/docs/api/playwright.md +23 -20
- data/documentation/docs/api/request.md +17 -0
- data/documentation/docs/api/selectors.md +34 -29
- data/documentation/docs/include/api_coverage.md +1 -0
- data/lib/playwright/channel.rb +8 -0
- data/lib/playwright/channel_owner.rb +7 -2
- data/lib/playwright/channel_owners/browser_context.rb +16 -1
- data/lib/playwright/channel_owners/local_utils.rb +27 -0
- data/lib/playwright/channel_owners/page.rb +2 -0
- data/lib/playwright/channel_owners/playwright.rb +1 -24
- data/lib/playwright/channel_owners/request.rb +17 -1
- data/lib/playwright/channel_owners/route.rb +5 -1
- data/lib/playwright/connection.rb +1 -1
- data/lib/playwright/console_message_impl.rb +29 -0
- data/lib/playwright/errors.rb +13 -2
- data/lib/playwright/events.rb +1 -0
- data/lib/playwright/javascript/value_parser.rb +8 -0
- data/lib/playwright/javascript/value_serializer.rb +10 -4
- data/lib/playwright/locator_impl.rb +4 -0
- data/lib/playwright/utils.rb +4 -0
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright_api/browser.rb +2 -2
- data/lib/playwright_api/browser_context.rb +4 -4
- data/lib/playwright_api/browser_type.rb +2 -2
- data/lib/playwright_api/console_message.rb +0 -22
- data/lib/playwright_api/dialog.rb +2 -2
- data/lib/playwright_api/download.rb +12 -3
- data/lib/playwright_api/element_handle.rb +2 -15
- data/lib/playwright_api/frame.rb +8 -13
- data/lib/playwright_api/keyboard.rb +4 -0
- data/lib/playwright_api/locator.rb +52 -16
- data/lib/playwright_api/page.rb +24 -29
- data/lib/playwright_api/playwright.rb +4 -4
- data/lib/playwright_api/request.rb +17 -0
- data/lib/playwright_api/selectors.rb +2 -2
- data/lib/playwright_api/worker.rb +4 -4
- data/sig/playwright.rbs +1 -0
- metadata +4 -4
- data/lib/playwright/channel_owners/console_message.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0dedf5c9cce96afd64ad16c45baed1b2c1fe37bb9b2632a741d8b75640bf2ae
|
4
|
+
data.tar.gz: 5f056dc5acd7bd5860c3ccaee1d7e5460923e9eb2a985c41ec1e36c8d8c91b7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82629797b234ab08abe2c9258605d0d7826eeaf3f4f70274e3f1ced8a5b41560ee1832f7ae98522ce7dfe1a826bd5058c88e9aba7f6d507d16bfa20d20206cea
|
7
|
+
data.tar.gz: '0027783e79287ba14021438154229a4de61c041c983a9f6fa582d533524df395bfb9cfaedbabf9e3d6be015a2ebed9a1fa03674bd86965f693bbd12bae9c67ce'
|
data/README.md
CHANGED
@@ -51,18 +51,24 @@ Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwrigh
|
|
51
51
|
page = browser.new_page
|
52
52
|
page.goto('https://github.com/')
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
page.get_by_placeholder("Search or jump to...").click
|
55
|
+
page.locator('input[name="query-builder-test"]').click
|
56
|
+
|
57
|
+
expect(page.keyboard).to be_a(::Playwright::Keyboard)
|
58
|
+
|
57
59
|
page.keyboard.type("playwright")
|
58
60
|
page.expect_navigation {
|
59
61
|
page.keyboard.press("Enter")
|
60
62
|
}
|
61
63
|
|
62
|
-
list = page.
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
list = page.get_by_test_id('results-list').locator('.search-title')
|
65
|
+
|
66
|
+
# wait for item to appear
|
67
|
+
list.first.wait_for
|
68
|
+
|
69
|
+
# list them
|
70
|
+
list.locator('.search-title').all.each do |item|
|
71
|
+
title = item.text_content
|
66
72
|
puts("==> #{title}")
|
67
73
|
end
|
68
74
|
end
|
@@ -8,15 +8,19 @@ sidebar_position: 10
|
|
8
8
|
|
9
9
|
A Browser is created via [BrowserType#launch](./browser_type#launch). An example of using a [Browser](./browser) to create a [Page](./page):
|
10
10
|
|
11
|
-
```
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
```python sync title=example_5d31815545511b1d8ce5dfce5b153cb5ea46a1868cee95eb211d77f33026788b.py
|
12
|
+
from playwright.sync_api import sync_playwright, Playwright
|
13
|
+
|
14
|
+
def run(playwright: Playwright):
|
15
|
+
firefox = playwright.firefox
|
16
|
+
browser = firefox.launch()
|
17
|
+
page = browser.new_page()
|
18
|
+
page.goto("https://example.com")
|
19
|
+
browser.close()
|
20
|
+
|
21
|
+
with sync_playwright() as playwright:
|
22
|
+
run(playwright)
|
23
|
+
|
20
24
|
```
|
21
25
|
|
22
26
|
## browser_type
|
@@ -158,21 +158,29 @@ See [Page#expose_binding](./page#expose_binding) for page-only version.
|
|
158
158
|
|
159
159
|
An example of exposing page URL to all frames in all pages in the context:
|
160
160
|
|
161
|
-
```
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
<
|
172
|
-
|
173
|
-
|
161
|
+
```python sync title=example_a450852d36dda88564582371af8d87bb58b1a517aac4fa60b7a58a0e41c5ceff.py
|
162
|
+
from playwright.sync_api import sync_playwright, Playwright
|
163
|
+
|
164
|
+
def run(playwright: Playwright):
|
165
|
+
webkit = playwright.webkit
|
166
|
+
browser = webkit.launch(headless=false)
|
167
|
+
context = browser.new_context()
|
168
|
+
context.expose_binding("pageURL", lambda source: source["page"].url)
|
169
|
+
page = context.new_page()
|
170
|
+
page.set_content("""
|
171
|
+
<script>
|
172
|
+
async function onClick() {
|
173
|
+
document.querySelector('div').textContent = await window.pageURL();
|
174
|
+
}
|
175
|
+
</script>
|
176
|
+
<button onclick="onClick()">Click me</button>
|
177
|
+
<div></div>
|
178
|
+
""")
|
179
|
+
page.get_by_role("button").click()
|
180
|
+
|
181
|
+
with sync_playwright() as playwright:
|
182
|
+
run(playwright)
|
174
183
|
|
175
|
-
page.get_by_role("button").click
|
176
184
|
```
|
177
185
|
|
178
186
|
An example of passing an element handle:
|
@@ -217,25 +225,36 @@ See [Page#expose_function](./page#expose_function) for page-only version.
|
|
217
225
|
|
218
226
|
An example of adding a `sha256` function to all pages in the context:
|
219
227
|
|
220
|
-
```
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
228
|
+
```python sync title=example_714719de9c92e66678257180301c2512f8cd69185f53a5121b6c52194f61a871.py
|
229
|
+
import hashlib
|
230
|
+
from playwright.sync_api import sync_playwright
|
231
|
+
|
232
|
+
def sha256(text: str) -> str:
|
233
|
+
m = hashlib.sha256()
|
234
|
+
m.update(bytes(text, "utf8"))
|
235
|
+
return m.hexdigest()
|
236
|
+
|
237
|
+
|
238
|
+
def run(playwright: Playwright):
|
239
|
+
webkit = playwright.webkit
|
240
|
+
browser = webkit.launch(headless=False)
|
241
|
+
context = browser.new_context()
|
242
|
+
context.expose_function("sha256", sha256)
|
243
|
+
page = context.new_page()
|
244
|
+
page.set_content("""
|
245
|
+
<script>
|
246
|
+
async function onClick() {
|
247
|
+
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
|
248
|
+
}
|
249
|
+
</script>
|
250
|
+
<button onclick="onClick()">Click me</button>
|
251
|
+
<div></div>
|
252
|
+
""")
|
253
|
+
page.get_by_role("button").click()
|
254
|
+
|
255
|
+
with sync_playwright() as playwright:
|
256
|
+
run(playwright)
|
226
257
|
|
227
|
-
browser_context.expose_function("sha256", method(:sha256))
|
228
|
-
page = browser_context.new_page()
|
229
|
-
page.content = <<~HTML
|
230
|
-
<script>
|
231
|
-
async function onClick() {
|
232
|
-
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
|
233
|
-
}
|
234
|
-
</script>
|
235
|
-
<button onclick="onClick()">Click me</button>
|
236
|
-
<div></div>
|
237
|
-
HTML
|
238
|
-
page.get_by_role("button").click
|
239
258
|
```
|
240
259
|
|
241
260
|
## grant_permissions
|
@@ -8,15 +8,20 @@ sidebar_position: 10
|
|
8
8
|
BrowserType provides methods to launch a specific browser instance or connect to an existing one. The following is a
|
9
9
|
typical example of using Playwright to drive automation:
|
10
10
|
|
11
|
-
```
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
```python sync title=example_2f9fbff87f35af4b76a27f54efeca3201696bbfa94ce03fee5a3df2639cc27d3.py
|
12
|
+
from playwright.sync_api import sync_playwright, Playwright
|
13
|
+
|
14
|
+
def run(playwright: Playwright):
|
15
|
+
chromium = playwright.chromium
|
16
|
+
browser = chromium.launch()
|
17
|
+
page = browser.new_page()
|
18
|
+
page.goto("https://example.com")
|
19
|
+
# other actions...
|
20
|
+
browser.close()
|
16
21
|
|
17
|
-
|
22
|
+
with sync_playwright() as playwright:
|
23
|
+
run(playwright)
|
18
24
|
|
19
|
-
end
|
20
25
|
```
|
21
26
|
|
22
27
|
## connect_over_cdp
|
@@ -9,21 +9,24 @@ sidebar_position: 10
|
|
9
9
|
|
10
10
|
An example of using [Dialog](./dialog) class:
|
11
11
|
|
12
|
-
```
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dialog.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
page.
|
23
|
-
page.
|
24
|
-
|
25
|
-
|
26
|
-
|
12
|
+
```python sync title=example_a7dcc75b7aa5544237ac3a964e9196d0445308864d3ce820f8cb8396f687b04a.py
|
13
|
+
from playwright.sync_api import sync_playwright, Playwright
|
14
|
+
|
15
|
+
def handle_dialog(dialog):
|
16
|
+
print(dialog.message)
|
17
|
+
dialog.dismiss()
|
18
|
+
|
19
|
+
def run(playwright: Playwright):
|
20
|
+
chromium = playwright.chromium
|
21
|
+
browser = chromium.launch()
|
22
|
+
page = browser.new_page()
|
23
|
+
page.on("dialog", handle_dialog)
|
24
|
+
page.evaluate("alert('1')")
|
25
|
+
browser.close()
|
26
|
+
|
27
|
+
with sync_playwright() as playwright:
|
28
|
+
run(playwright)
|
29
|
+
|
27
30
|
```
|
28
31
|
|
29
32
|
**NOTE**: Dialogs are dismissed automatically, unless there is a [`event: Page.dialog`] listener.
|
@@ -10,15 +10,18 @@ sidebar_position: 10
|
|
10
10
|
All the downloaded files belonging to the browser context are deleted when the
|
11
11
|
browser context is closed.
|
12
12
|
|
13
|
-
Download event is emitted once the download starts. Download path becomes available once download completes
|
13
|
+
Download event is emitted once the download starts. Download path becomes available once download completes.
|
14
14
|
|
15
|
-
```
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
```python sync title=example_c247767083cf193df26a39a61a3a8bc19d63ed5c24db91b88c50b7d37975005d.py
|
16
|
+
# Start waiting for the download
|
17
|
+
with page.expect_download() as download_info:
|
18
|
+
# Perform the action that initiates download
|
19
|
+
page.get_by_text("Download file").click()
|
20
|
+
download = download_info.value
|
21
|
+
|
22
|
+
# Wait for the download process to complete and save the downloaded file somewhere
|
23
|
+
download.save_as("/path/to/save/at/" + download.suggested_filename)
|
19
24
|
|
20
|
-
# wait for download to complete
|
21
|
-
path = download.path
|
22
25
|
```
|
23
26
|
|
24
27
|
## cancel
|
@@ -81,6 +84,13 @@ def save_as(path)
|
|
81
84
|
Copy the download to a user-specified path. It is safe to call this method while the download
|
82
85
|
is still in progress. Will wait for the download to finish if necessary.
|
83
86
|
|
87
|
+
**Usage**
|
88
|
+
|
89
|
+
```python sync title=example_66ffd4ef7286957e4294d84b8f660ff852c87af27a56b3e4dd9f84562b5ece02.py
|
90
|
+
download.save_as("/path/to/save/at/" + download.suggested_filename)
|
91
|
+
|
92
|
+
```
|
93
|
+
|
84
94
|
## suggested_filename
|
85
95
|
|
86
96
|
```
|
@@ -259,7 +259,7 @@ This method waits for [actionability](https://playwright.dev/python/docs/actiona
|
|
259
259
|
|
260
260
|
If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error. However, if the element is inside the `<label>` element that has an associated [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled instead.
|
261
261
|
|
262
|
-
To send fine-grained keyboard events, use [
|
262
|
+
To send fine-grained keyboard events, use [Locator#press_sequentially](./locator#press_sequentially).
|
263
263
|
|
264
264
|
## focus
|
265
265
|
|
@@ -505,13 +505,14 @@ Triggers a `change` and `input` event once all the provided options have been se
|
|
505
505
|
|
506
506
|
**Usage**
|
507
507
|
|
508
|
-
```
|
509
|
-
#
|
510
|
-
|
508
|
+
```python sync title=example_e6bbc99e34c9f6ee73aa7d4265d34af456e6c67d185530f0a77f8064050a3ec4.py
|
509
|
+
# Single selection matching the value or label
|
510
|
+
handle.select_option("blue")
|
511
511
|
# single selection matching both the label
|
512
|
-
|
512
|
+
handle.select_option(label="blue")
|
513
513
|
# multiple selection
|
514
|
-
|
514
|
+
handle.select_option(value=["red", "green", "blue"])
|
515
|
+
|
515
516
|
```
|
516
517
|
|
517
518
|
## select_text
|
@@ -614,19 +615,6 @@ To press a special key, like `Control` or `ArrowDown`, use [ElementHandle#press]
|
|
614
615
|
|
615
616
|
**Usage**
|
616
617
|
|
617
|
-
```ruby
|
618
|
-
element_handle.type("hello") # types instantly
|
619
|
-
element_handle.type("world", delay: 100) # types slower, like a user
|
620
|
-
```
|
621
|
-
|
622
|
-
An example of typing into a text field and then submitting the form:
|
623
|
-
|
624
|
-
```ruby
|
625
|
-
element_handle = page.query_selector("input")
|
626
|
-
element_handle.type("some text")
|
627
|
-
element_handle.press("Enter")
|
628
|
-
```
|
629
|
-
|
630
618
|
## uncheck
|
631
619
|
|
632
620
|
```
|
@@ -15,16 +15,25 @@ At every point of time, page exposes its current frame tree via the [Page#main_f
|
|
15
15
|
|
16
16
|
An example of dumping frame tree:
|
17
17
|
|
18
|
-
```
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
```python sync title=example_2bc8a0187190738d8dc7b29c66ad5f9f2187fd1827455e9ceb1e9ace26aaf534.py
|
19
|
+
from playwright.sync_api import sync_playwright, Playwright
|
20
|
+
|
21
|
+
def run(playwright: Playwright):
|
22
|
+
firefox = playwright.firefox
|
23
|
+
browser = firefox.launch()
|
24
|
+
page = browser.new_page()
|
25
|
+
page.goto("https://www.theverge.com")
|
26
|
+
dump_frame_tree(page.main_frame, "")
|
27
|
+
browser.close()
|
28
|
+
|
29
|
+
def dump_frame_tree(frame, indent):
|
30
|
+
print(indent + frame.name + '@' + frame.url)
|
31
|
+
for child in frame.child_frames:
|
32
|
+
dump_frame_tree(child, indent + " ")
|
33
|
+
|
34
|
+
with sync_playwright() as playwright:
|
35
|
+
run(playwright)
|
25
36
|
|
26
|
-
page.goto("https://www.theverge.com")
|
27
|
-
dump_frame_tree(page.main_frame)
|
28
37
|
```
|
29
38
|
|
30
39
|
## add_script_tag
|
@@ -349,7 +358,7 @@ This method waits for an element matching `selector`, waits for [actionability](
|
|
349
358
|
|
350
359
|
If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error. However, if the element is inside the `<label>` element that has an associated [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled instead.
|
351
360
|
|
352
|
-
To send fine-grained keyboard events, use [
|
361
|
+
To send fine-grained keyboard events, use [Locator#press_sequentially](./locator#press_sequentially).
|
353
362
|
|
354
363
|
## focus
|
355
364
|
|
@@ -911,13 +920,14 @@ Triggers a `change` and `input` event once all the provided options have been se
|
|
911
920
|
|
912
921
|
**Usage**
|
913
922
|
|
914
|
-
```
|
915
|
-
#
|
916
|
-
frame.select_option("select#colors",
|
923
|
+
```python sync title=example_3f390f340c78c42dd0c88a09b2f56575b02b163786e8cdee33581217afced6b2.py
|
924
|
+
# Single selection matching the value or label
|
925
|
+
frame.select_option("select#colors", "blue")
|
917
926
|
# single selection matching both the label
|
918
|
-
frame.select_option("select#colors", label
|
927
|
+
frame.select_option("select#colors", label="blue")
|
919
928
|
# multiple selection
|
920
|
-
frame.select_option("select#colors", value
|
929
|
+
frame.select_option("select#colors", value=["red", "green", "blue"])
|
930
|
+
|
921
931
|
```
|
922
932
|
|
923
933
|
## set_checked
|
@@ -1041,11 +1051,6 @@ To press a special key, like `Control` or `ArrowDown`, use [Keyboard#press](./ke
|
|
1041
1051
|
|
1042
1052
|
**Usage**
|
1043
1053
|
|
1044
|
-
```ruby
|
1045
|
-
frame.type("#mytextarea", "hello") # types instantly
|
1046
|
-
frame.type("#mytextarea", "world", delay: 100) # types slower, like a user
|
1047
|
-
```
|
1048
|
-
|
1049
1054
|
## uncheck
|
1050
1055
|
|
1051
1056
|
```
|
@@ -1094,9 +1099,20 @@ Returns when the `expression` returns a truthy value, returns that value.
|
|
1094
1099
|
|
1095
1100
|
The [Frame#wait_for_function](./frame#wait_for_function) can be used to observe viewport size change:
|
1096
1101
|
|
1097
|
-
```
|
1098
|
-
|
1099
|
-
|
1102
|
+
```python sync title=example_e6a8c279eb09e58e3522cb6237f5d62165b164cad0c1916720af299ffcb8dc8a.py
|
1103
|
+
from playwright.sync_api import sync_playwright, Playwright
|
1104
|
+
|
1105
|
+
def run(playwright: Playwright):
|
1106
|
+
webkit = playwright.webkit
|
1107
|
+
browser = webkit.launch()
|
1108
|
+
page = browser.new_page()
|
1109
|
+
page.evaluate("window.x = 0; setTimeout(() => { window.x = 100 }, 1000);")
|
1110
|
+
page.main_frame.wait_for_function("() => window.x > 0")
|
1111
|
+
browser.close()
|
1112
|
+
|
1113
|
+
with sync_playwright() as playwright:
|
1114
|
+
run(playwright)
|
1115
|
+
|
1100
1116
|
```
|
1101
1117
|
|
1102
1118
|
To pass an argument to the predicate of `frame.waitForFunction` function:
|
@@ -1172,13 +1188,22 @@ function will throw.
|
|
1172
1188
|
|
1173
1189
|
This method works across navigations:
|
1174
1190
|
|
1175
|
-
```
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1191
|
+
```python sync title=example_6e2a71807566cf008382d4c163ff6e71e34d7f10ef6706ad7fcaa9b70c256a66.py
|
1192
|
+
from playwright.sync_api import sync_playwright, Playwright
|
1193
|
+
|
1194
|
+
def run(playwright: Playwright):
|
1195
|
+
chromium = playwright.chromium
|
1196
|
+
browser = chromium.launch()
|
1197
|
+
page = browser.new_page()
|
1198
|
+
for current_url in ["https://google.com", "https://bbc.com"]:
|
1199
|
+
page.goto(current_url, wait_until="domcontentloaded")
|
1200
|
+
element = page.main_frame.wait_for_selector("img")
|
1201
|
+
print("Loaded image: " + str(element.get_attribute("src")))
|
1202
|
+
browser.close()
|
1203
|
+
|
1204
|
+
with sync_playwright() as playwright:
|
1205
|
+
run(playwright)
|
1206
|
+
|
1182
1207
|
```
|
1183
1208
|
|
1184
1209
|
## wait_for_timeout
|
@@ -97,6 +97,8 @@ def press(key, delay: nil)
|
|
97
97
|
```
|
98
98
|
|
99
99
|
|
100
|
+
**NOTE**: In most cases, you should use [Locator#press](./locator#press) instead.
|
101
|
+
|
100
102
|
`key` can specify the intended
|
101
103
|
[keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to
|
102
104
|
generate the text for. A superset of the `key` values can be found
|
@@ -136,6 +138,8 @@ def type(text, delay: nil)
|
|
136
138
|
```
|
137
139
|
|
138
140
|
|
141
|
+
**NOTE**: In most cases, you should use [Locator#fill](./locator#fill) instead. You only need to press keys one by one if there is special keyboard handling on the page - in this case use [Locator#press_sequentially](./locator#press_sequentially).
|
142
|
+
|
139
143
|
Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
140
144
|
|
141
145
|
To press a special key, like `Control` or `ArrowDown`, use [Keyboard#press](./keyboard#press).
|
@@ -42,6 +42,8 @@ def all_inner_texts
|
|
42
42
|
|
43
43
|
Returns an array of `node.innerText` values for all matching nodes.
|
44
44
|
|
45
|
+
**NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] with `useInnerText` option to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
46
|
+
|
45
47
|
**Usage**
|
46
48
|
|
47
49
|
```ruby
|
@@ -57,6 +59,8 @@ def all_text_contents
|
|
57
59
|
|
58
60
|
Returns an array of `node.textContent` values for all matching nodes.
|
59
61
|
|
62
|
+
**NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
63
|
+
|
60
64
|
**Usage**
|
61
65
|
|
62
66
|
```ruby
|
@@ -232,6 +236,8 @@ def count
|
|
232
236
|
|
233
237
|
Returns the number of elements matching the locator.
|
234
238
|
|
239
|
+
**NOTE**: If you need to assert the number of elements on the page, prefer [`method: LocatorAssertions.toHaveCount`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
240
|
+
|
235
241
|
**Usage**
|
236
242
|
|
237
243
|
```ruby
|
@@ -458,7 +464,7 @@ This method waits for [actionability](https://playwright.dev/python/docs/actiona
|
|
458
464
|
|
459
465
|
If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error. However, if the element is inside the `<label>` element that has an associated [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled instead.
|
460
466
|
|
461
|
-
To send fine-grained keyboard events, use [Locator#
|
467
|
+
To send fine-grained keyboard events, use [Locator#press_sequentially](./locator#press_sequentially).
|
462
468
|
|
463
469
|
## filter
|
464
470
|
|
@@ -526,6 +532,8 @@ alias: `[]`
|
|
526
532
|
|
527
533
|
Returns the matching element's attribute value.
|
528
534
|
|
535
|
+
**NOTE**: If you need to assert an element's attribute, prefer [`method: LocatorAssertions.toHaveAttribute`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
536
|
+
|
529
537
|
## get_by_alt_text
|
530
538
|
|
531
539
|
```
|
@@ -808,6 +816,8 @@ def inner_text(timeout: nil)
|
|
808
816
|
|
809
817
|
Returns the [`element.innerText`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText).
|
810
818
|
|
819
|
+
**NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] with `useInnerText` option to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
820
|
+
|
811
821
|
## input_value
|
812
822
|
|
813
823
|
```
|
@@ -817,6 +827,8 @@ def input_value(timeout: nil)
|
|
817
827
|
|
818
828
|
Returns the value for the matching `<input>` or `<textarea>` or `<select>` element.
|
819
829
|
|
830
|
+
**NOTE**: If you need to assert input value, prefer [`method: LocatorAssertions.toHaveValue`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
831
|
+
|
820
832
|
**Usage**
|
821
833
|
|
822
834
|
```ruby
|
@@ -836,6 +848,8 @@ def checked?(timeout: nil)
|
|
836
848
|
|
837
849
|
Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
|
838
850
|
|
851
|
+
**NOTE**: If you need to assert that checkbox is checked, prefer [`method: LocatorAssertions.toBeChecked`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
852
|
+
|
839
853
|
**Usage**
|
840
854
|
|
841
855
|
```ruby
|
@@ -851,6 +865,8 @@ def disabled?(timeout: nil)
|
|
851
865
|
|
852
866
|
Returns whether the element is disabled, the opposite of [enabled](https://playwright.dev/python/docs/actionability#enabled).
|
853
867
|
|
868
|
+
**NOTE**: If you need to assert that an element is disabled, prefer [`method: LocatorAssertions.toBeDisabled`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
869
|
+
|
854
870
|
**Usage**
|
855
871
|
|
856
872
|
```ruby
|
@@ -866,6 +882,8 @@ def editable?(timeout: nil)
|
|
866
882
|
|
867
883
|
Returns whether the element is [editable](https://playwright.dev/python/docs/actionability#editable).
|
868
884
|
|
885
|
+
**NOTE**: If you need to assert that an element is editable, prefer [`method: LocatorAssertions.toBeEditable`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
886
|
+
|
869
887
|
**Usage**
|
870
888
|
|
871
889
|
```ruby
|
@@ -881,6 +899,8 @@ def enabled?(timeout: nil)
|
|
881
899
|
|
882
900
|
Returns whether the element is [enabled](https://playwright.dev/python/docs/actionability#enabled).
|
883
901
|
|
902
|
+
**NOTE**: If you need to assert that an element is enabled, prefer [`method: LocatorAssertions.toBeEnabled`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
903
|
+
|
884
904
|
**Usage**
|
885
905
|
|
886
906
|
```ruby
|
@@ -896,6 +916,8 @@ def hidden?(timeout: nil)
|
|
896
916
|
|
897
917
|
Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/python/docs/actionability#visible).
|
898
918
|
|
919
|
+
**NOTE**: If you need to assert that element is hidden, prefer [`method: LocatorAssertions.toBeHidden`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
920
|
+
|
899
921
|
**Usage**
|
900
922
|
|
901
923
|
```ruby
|
@@ -911,6 +933,8 @@ def visible?(timeout: nil)
|
|
911
933
|
|
912
934
|
Returns whether the element is [visible](https://playwright.dev/python/docs/actionability#visible).
|
913
935
|
|
936
|
+
**NOTE**: If you need to assert that element is visible, prefer [`method: LocatorAssertions.toBeVisible`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
937
|
+
|
914
938
|
**Usage**
|
915
939
|
|
916
940
|
```ruby
|
@@ -1032,6 +1056,36 @@ respective texts.
|
|
1032
1056
|
Shortcuts such as `key: "Control+o"` or `key: "Control+Shift+T"` are supported as well. When specified with the
|
1033
1057
|
modifier, modifier is pressed and being held while the subsequent key is being pressed.
|
1034
1058
|
|
1059
|
+
## press_sequentially
|
1060
|
+
|
1061
|
+
```
|
1062
|
+
def press_sequentially(text, delay: nil, noWaitAfter: nil, timeout: nil)
|
1063
|
+
```
|
1064
|
+
|
1065
|
+
|
1066
|
+
**NOTE**: In most cases, you should use [Locator#fill](./locator#fill) instead. You only need to press keys one by one if there is special keyboard handling on the page.
|
1067
|
+
|
1068
|
+
Focuses the element, and then sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
1069
|
+
|
1070
|
+
To press a special key, like `Control` or `ArrowDown`, use [Locator#press](./locator#press).
|
1071
|
+
|
1072
|
+
**Usage**
|
1073
|
+
|
1074
|
+
```python sync title=example_1b7781d5527574a18d4b9812e3461203d2acc9ba7e09cbfd0ffbc4154e3f5971.py
|
1075
|
+
locator.press_sequentially("hello") # types instantly
|
1076
|
+
locator.press_sequentially("world", delay=100) # types slower, like a user
|
1077
|
+
|
1078
|
+
```
|
1079
|
+
|
1080
|
+
An example of typing into a text field and then submitting the form:
|
1081
|
+
|
1082
|
+
```python sync title=example_cc0a6b9aa95b97e5c17c4b114da10a29c7f6f793e99aee1ea2703636af6e24f9.py
|
1083
|
+
locator = page.get_by_label("Password")
|
1084
|
+
locator.press_sequentially("my password")
|
1085
|
+
locator.press("Enter")
|
1086
|
+
|
1087
|
+
```
|
1088
|
+
|
1035
1089
|
## screenshot
|
1036
1090
|
|
1037
1091
|
```
|
@@ -1247,6 +1301,8 @@ def text_content(timeout: nil)
|
|
1247
1301
|
|
1248
1302
|
Returns the [`node.textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent).
|
1249
1303
|
|
1304
|
+
**NOTE**: If you need to assert text on the page, prefer [`method: LocatorAssertions.toHaveText`] to avoid flakiness. See [assertions guide](https://playwright.dev/python/docs/test-assertions) for more details.
|
1305
|
+
|
1250
1306
|
## type
|
1251
1307
|
|
1252
1308
|
```
|
@@ -1254,27 +1310,12 @@ def type(text, delay: nil, noWaitAfter: nil, timeout: nil)
|
|
1254
1310
|
```
|
1255
1311
|
|
1256
1312
|
|
1257
|
-
**NOTE**: In most cases, you should use [Locator#fill](./locator#fill) instead. You only need to type characters if there is special keyboard handling on the page.
|
1258
|
-
|
1259
1313
|
Focuses the element, and then sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.
|
1260
1314
|
|
1261
1315
|
To press a special key, like `Control` or `ArrowDown`, use [Locator#press](./locator#press).
|
1262
1316
|
|
1263
1317
|
**Usage**
|
1264
1318
|
|
1265
|
-
```ruby
|
1266
|
-
element.type("hello") # types instantly
|
1267
|
-
element.type("world", delay: 100) # types slower, like a user
|
1268
|
-
```
|
1269
|
-
|
1270
|
-
An example of typing into a text field and then submitting the form:
|
1271
|
-
|
1272
|
-
```ruby
|
1273
|
-
element = page.get_by_label("Password")
|
1274
|
-
element.type("my password")
|
1275
|
-
element.press("Enter")
|
1276
|
-
```
|
1277
|
-
|
1278
1319
|
## uncheck
|
1279
1320
|
|
1280
1321
|
```
|