playwright-ruby-client 1.37.1 → 1.39.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.
- 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
|
```
|