playwright-ruby-client 0.0.5 → 0.0.6
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/lib/playwright.rb +2 -0
- data/lib/playwright/channel_owners/element_handle.rb +75 -0
- data/lib/playwright/channel_owners/frame.rb +117 -0
- data/lib/playwright/channel_owners/page.rb +68 -11
- data/lib/playwright/channel_owners/request.rb +90 -0
- data/lib/playwright/input_type.rb +19 -0
- data/lib/playwright/input_types/keyboard.rb +32 -0
- data/lib/playwright/input_types/mouse.rb +4 -0
- data/lib/playwright/input_types/touchscreen.rb +4 -0
- data/lib/playwright/javascript/expression.rb +22 -0
- data/lib/playwright/javascript/function.rb +22 -0
- data/lib/playwright/playwright_api.rb +31 -23
- data/lib/playwright/timeout_settings.rb +1 -1
- data/lib/playwright/url_matcher.rb +19 -0
- data/lib/playwright/version.rb +1 -1
- data/lib/playwright_api/accessibility.rb +46 -6
- data/lib/playwright_api/binding_call.rb +6 -6
- data/lib/playwright_api/browser.rb +76 -16
- data/lib/playwright_api/browser_context.rb +284 -30
- data/lib/playwright_api/browser_type.rb +54 -9
- data/lib/playwright_api/cdp_session.rb +23 -1
- data/lib/playwright_api/chromium_browser_context.rb +16 -6
- data/lib/playwright_api/console_message.rb +10 -10
- data/lib/playwright_api/dialog.rb +42 -0
- data/lib/playwright_api/download.rb +19 -4
- data/lib/playwright_api/element_handle.rb +174 -21
- data/lib/playwright_api/file_chooser.rb +8 -0
- data/lib/playwright_api/frame.rb +355 -68
- data/lib/playwright_api/js_handle.rb +45 -9
- data/lib/playwright_api/keyboard.rb +98 -8
- data/lib/playwright_api/mouse.rb +22 -0
- data/lib/playwright_api/page.rb +779 -127
- data/lib/playwright_api/playwright.rb +98 -19
- data/lib/playwright_api/request.rb +70 -23
- data/lib/playwright_api/response.rb +6 -6
- data/lib/playwright_api/route.rb +48 -0
- data/lib/playwright_api/selectors.rb +14 -6
- data/lib/playwright_api/video.rb +8 -0
- data/lib/playwright_api/web_socket.rb +3 -5
- data/lib/playwright_api/worker.rb +12 -0
- metadata +7 -2
@@ -7,6 +7,14 @@ module Playwright
|
|
7
7
|
# await fileChooser.setFiles('/tmp/myfile.pdf');
|
8
8
|
# });
|
9
9
|
# ```
|
10
|
+
#
|
11
|
+
# ```python async
|
12
|
+
# page.on("filechooser", lambda file_chooser: file_chooser.set_files("/tmp/myfile.pdf"))
|
13
|
+
# ```
|
14
|
+
#
|
15
|
+
# ```python sync
|
16
|
+
# page.on("filechooser", lambda file_chooser: file_chooser.set_files("/tmp/myfile.pdf"))
|
17
|
+
# ```
|
10
18
|
class FileChooser < PlaywrightApi
|
11
19
|
|
12
20
|
# Returns input element associated with this file chooser.
|
data/lib/playwright_api/frame.rb
CHANGED
@@ -31,13 +31,47 @@ module Playwright
|
|
31
31
|
# })();
|
32
32
|
# ```
|
33
33
|
#
|
34
|
-
#
|
34
|
+
# ```python async
|
35
|
+
# import asyncio
|
36
|
+
# from playwright.async_api import async_playwright
|
35
37
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# async def run(playwright):
|
39
|
+
# firefox = playwright.firefox
|
40
|
+
# browser = await firefox.launch()
|
41
|
+
# page = await browser.new_page()
|
42
|
+
# await page.goto("https://www.theverge.com")
|
43
|
+
# dump_frame_tree(page.main_frame, "")
|
44
|
+
# await browser.close()
|
45
|
+
#
|
46
|
+
# def dump_frame_tree(frame, indent):
|
47
|
+
# print(indent + frame.name + '@' + frame.url)
|
48
|
+
# for child in frame.child_frames:
|
49
|
+
# dump_frame_tree(child, indent + " ")
|
50
|
+
#
|
51
|
+
# async def main():
|
52
|
+
# async with async_playwright() as playwright:
|
53
|
+
# await run(playwright)
|
54
|
+
# asyncio.run(main())
|
55
|
+
# ```
|
56
|
+
#
|
57
|
+
# ```python sync
|
58
|
+
# from playwright.sync_api import sync_playwright
|
59
|
+
#
|
60
|
+
# def run(playwright):
|
61
|
+
# firefox = playwright.firefox
|
62
|
+
# browser = firefox.launch()
|
63
|
+
# page = browser.new_page()
|
64
|
+
# page.goto("https://www.theverge.com")
|
65
|
+
# dump_frame_tree(page.main_frame, "")
|
66
|
+
# browser.close()
|
67
|
+
#
|
68
|
+
# def dump_frame_tree(frame, indent):
|
69
|
+
# print(indent + frame.name + '@' + frame.url)
|
70
|
+
# for child in frame.child_frames:
|
71
|
+
# dump_frame_tree(child, indent + " ")
|
72
|
+
#
|
73
|
+
# with sync_playwright() as playwright:
|
74
|
+
# run(playwright)
|
41
75
|
# ```
|
42
76
|
class Frame < PlaywrightApi
|
43
77
|
|
@@ -47,7 +81,7 @@ module Playwright
|
|
47
81
|
# [Working with selectors](./selectors.md#working-with-selectors) for more details. If no elements match the selector,
|
48
82
|
# returns `null`.
|
49
83
|
def query_selector(selector)
|
50
|
-
|
84
|
+
wrap_impl(@impl.query_selector(selector))
|
51
85
|
end
|
52
86
|
|
53
87
|
# Returns the ElementHandles pointing to the frame elements.
|
@@ -56,7 +90,7 @@ module Playwright
|
|
56
90
|
# [Working with selectors](./selectors.md#working-with-selectors) for more details. If no elements match the selector,
|
57
91
|
# returns empty array.
|
58
92
|
def query_selector_all(selector)
|
59
|
-
|
93
|
+
wrap_impl(@impl.query_selector_all(selector))
|
60
94
|
end
|
61
95
|
|
62
96
|
# Returns the return value of `pageFunction`
|
@@ -75,8 +109,20 @@ module Playwright
|
|
75
109
|
# const preloadHref = await frame.$eval('link[rel=preload]', el => el.href);
|
76
110
|
# const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
|
77
111
|
# ```
|
112
|
+
#
|
113
|
+
# ```python async
|
114
|
+
# search_value = await frame.eval_on_selector("#search", "el => el.value")
|
115
|
+
# preload_href = await frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
116
|
+
# html = await frame.eval_on_selector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello")
|
117
|
+
# ```
|
118
|
+
#
|
119
|
+
# ```python sync
|
120
|
+
# search_value = frame.eval_on_selector("#search", "el => el.value")
|
121
|
+
# preload_href = frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
122
|
+
# html = frame.eval_on_selector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello")
|
123
|
+
# ```
|
78
124
|
def eval_on_selector(selector, pageFunction, arg: nil)
|
79
|
-
|
125
|
+
wrap_impl(@impl.eval_on_selector(selector, pageFunction, arg: arg))
|
80
126
|
end
|
81
127
|
|
82
128
|
# Returns the return value of `pageFunction`
|
@@ -93,8 +139,16 @@ module Playwright
|
|
93
139
|
# ```js
|
94
140
|
# const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);
|
95
141
|
# ```
|
142
|
+
#
|
143
|
+
# ```python async
|
144
|
+
# divs_counts = await frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
145
|
+
# ```
|
146
|
+
#
|
147
|
+
# ```python sync
|
148
|
+
# divs_counts = frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
149
|
+
# ```
|
96
150
|
def eval_on_selector_all(selector, pageFunction, arg: nil)
|
97
|
-
|
151
|
+
wrap_impl(@impl.eval_on_selector_all(selector, pageFunction, arg: arg))
|
98
152
|
end
|
99
153
|
|
100
154
|
# Returns the added tag when the script's onload fires or when the script content was injected into frame.
|
@@ -130,7 +184,7 @@ module Playwright
|
|
130
184
|
end
|
131
185
|
|
132
186
|
def child_frames
|
133
|
-
|
187
|
+
wrap_impl(@impl.child_frames)
|
134
188
|
end
|
135
189
|
|
136
190
|
# This method clicks an element matching `selector` by performing the following steps:
|
@@ -153,12 +207,12 @@ module Playwright
|
|
153
207
|
noWaitAfter: nil,
|
154
208
|
position: nil,
|
155
209
|
timeout: nil)
|
156
|
-
|
210
|
+
wrap_impl(@impl.click(selector, button: button, clickCount: clickCount, delay: delay, force: force, modifiers: modifiers, noWaitAfter: noWaitAfter, position: position, timeout: timeout))
|
157
211
|
end
|
158
212
|
|
159
213
|
# Gets the full HTML contents of the frame, including the doctype.
|
160
214
|
def content
|
161
|
-
|
215
|
+
wrap_impl(@impl.content)
|
162
216
|
end
|
163
217
|
|
164
218
|
# This method double clicks an element matching `selector` by performing the following steps:
|
@@ -173,7 +227,7 @@ module Playwright
|
|
173
227
|
# When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
|
174
228
|
# Passing zero timeout disables this.
|
175
229
|
#
|
176
|
-
# >
|
230
|
+
# > NOTE: `frame.dblclick()` dispatches two `click` events and a single `dblclick` event.
|
177
231
|
def dblclick(
|
178
232
|
selector,
|
179
233
|
button: nil,
|
@@ -195,6 +249,14 @@ module Playwright
|
|
195
249
|
# await frame.dispatchEvent('button#submit', 'click');
|
196
250
|
# ```
|
197
251
|
#
|
252
|
+
# ```python async
|
253
|
+
# await frame.dispatch_event("button#submit", "click")
|
254
|
+
# ```
|
255
|
+
#
|
256
|
+
# ```python sync
|
257
|
+
# frame.dispatch_event("button#submit", "click")
|
258
|
+
# ```
|
259
|
+
#
|
198
260
|
# Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
199
261
|
# and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
200
262
|
#
|
@@ -215,18 +277,30 @@ module Playwright
|
|
215
277
|
# const dataTransfer = await frame.evaluateHandle(() => new DataTransfer());
|
216
278
|
# await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });
|
217
279
|
# ```
|
280
|
+
#
|
281
|
+
# ```python async
|
282
|
+
# # note you can only create data_transfer in chromium and firefox
|
283
|
+
# data_transfer = await frame.evaluate_handle("new DataTransfer()")
|
284
|
+
# await frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
285
|
+
# ```
|
286
|
+
#
|
287
|
+
# ```python sync
|
288
|
+
# # note you can only create data_transfer in chromium and firefox
|
289
|
+
# data_transfer = frame.evaluate_handle("new DataTransfer()")
|
290
|
+
# frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
291
|
+
# ```
|
218
292
|
def dispatch_event(selector, type, eventInit: nil, timeout: nil)
|
219
293
|
raise NotImplementedError.new('dispatch_event is not implemented yet.')
|
220
294
|
end
|
221
295
|
|
222
296
|
# Returns the return value of `pageFunction`
|
223
297
|
#
|
224
|
-
# If the function passed to the `
|
225
|
-
# resolve and return its value.
|
298
|
+
# If the function passed to the [`method: Frame.evaluate`] returns a [Promise], then [`method: Frame.evaluate`] would wait
|
299
|
+
# for the promise to resolve and return its value.
|
226
300
|
#
|
227
|
-
# If the function passed to the `
|
228
|
-
# `undefined`. DevTools Protocol also supports transferring some additional values
|
229
|
-
# `-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
301
|
+
# If the function passed to the [`method: Frame.evaluate`] returns a non-[Serializable] value,
|
302
|
+
# then[ method: `Frame.evaluate`] returns `undefined`. DevTools Protocol also supports transferring some additional values
|
303
|
+
# that are not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`, and bigint literals.
|
230
304
|
#
|
231
305
|
#
|
232
306
|
# ```js
|
@@ -236,6 +310,16 @@ module Playwright
|
|
236
310
|
# console.log(result); // prints "56"
|
237
311
|
# ```
|
238
312
|
#
|
313
|
+
# ```python async
|
314
|
+
# result = await frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
315
|
+
# print(result) # prints "56"
|
316
|
+
# ```
|
317
|
+
#
|
318
|
+
# ```python sync
|
319
|
+
# result = frame.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
|
320
|
+
# print(result) # prints "56"
|
321
|
+
# ```
|
322
|
+
#
|
239
323
|
# A string can also be passed in instead of a function.
|
240
324
|
#
|
241
325
|
#
|
@@ -243,7 +327,19 @@ module Playwright
|
|
243
327
|
# console.log(await frame.evaluate('1 + 2')); // prints "3"
|
244
328
|
# ```
|
245
329
|
#
|
246
|
-
#
|
330
|
+
# ```python async
|
331
|
+
# print(await frame.evaluate("1 + 2")) # prints "3"
|
332
|
+
# x = 10
|
333
|
+
# print(await frame.evaluate(f"1 + {x}")) # prints "11"
|
334
|
+
# ```
|
335
|
+
#
|
336
|
+
# ```python sync
|
337
|
+
# print(frame.evaluate("1 + 2")) # prints "3"
|
338
|
+
# x = 10
|
339
|
+
# print(frame.evaluate(f"1 + {x}")) # prints "11"
|
340
|
+
# ```
|
341
|
+
#
|
342
|
+
# `ElementHandle` instances can be passed as an argument to the [`method: Frame.evaluate`]:
|
247
343
|
#
|
248
344
|
#
|
249
345
|
# ```js
|
@@ -251,17 +347,29 @@ module Playwright
|
|
251
347
|
# const html = await frame.evaluate(([body, suffix]) => body.innerHTML + suffix, [bodyHandle, 'hello']);
|
252
348
|
# await bodyHandle.dispose();
|
253
349
|
# ```
|
350
|
+
#
|
351
|
+
# ```python async
|
352
|
+
# body_handle = await frame.query_selector("body")
|
353
|
+
# html = await frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
354
|
+
# await body_handle.dispose()
|
355
|
+
# ```
|
356
|
+
#
|
357
|
+
# ```python sync
|
358
|
+
# body_handle = frame.query_selector("body")
|
359
|
+
# html = frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
360
|
+
# body_handle.dispose()
|
361
|
+
# ```
|
254
362
|
def evaluate(pageFunction, arg: nil)
|
255
|
-
|
363
|
+
wrap_impl(@impl.evaluate(pageFunction, arg: arg))
|
256
364
|
end
|
257
365
|
|
258
366
|
# Returns the return value of `pageFunction` as in-page object (JSHandle).
|
259
367
|
#
|
260
|
-
# The only difference between `
|
261
|
-
# object (JSHandle).
|
368
|
+
# The only difference between [`method: Frame.evaluate`] and [`method: Frame.evaluateHandle`] is
|
369
|
+
# that[ method: Fframe.evaluateHandle`] returns in-page object (JSHandle).
|
262
370
|
#
|
263
|
-
# If the function, passed to the `
|
264
|
-
# the promise to resolve and return its value.
|
371
|
+
# If the function, passed to the [`method: Frame.evaluateHandle`], returns a [Promise],
|
372
|
+
# then[ method: Fframe.evaluateHandle`] would wait for the promise to resolve and return its value.
|
265
373
|
#
|
266
374
|
#
|
267
375
|
# ```js
|
@@ -269,6 +377,17 @@ module Playwright
|
|
269
377
|
# aWindowHandle; // Handle for the window object.
|
270
378
|
# ```
|
271
379
|
#
|
380
|
+
# ```python async
|
381
|
+
# # FIXME
|
382
|
+
# a_window_handle = await frame.evaluate_handle("Promise.resolve(window)")
|
383
|
+
# a_window_handle # handle for the window object.
|
384
|
+
# ```
|
385
|
+
#
|
386
|
+
# ```python sync
|
387
|
+
# a_window_handle = frame.evaluate_handle("Promise.resolve(window)")
|
388
|
+
# a_window_handle # handle for the window object.
|
389
|
+
# ```
|
390
|
+
#
|
272
391
|
# A string can also be passed in instead of a function.
|
273
392
|
#
|
274
393
|
#
|
@@ -276,7 +395,15 @@ module Playwright
|
|
276
395
|
# const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.
|
277
396
|
# ```
|
278
397
|
#
|
279
|
-
#
|
398
|
+
# ```python async
|
399
|
+
# a_handle = await page.evaluate_handle("document") # handle for the "document"
|
400
|
+
# ```
|
401
|
+
#
|
402
|
+
# ```python sync
|
403
|
+
# a_handle = page.evaluate_handle("document") # handle for the "document"
|
404
|
+
# ```
|
405
|
+
#
|
406
|
+
# `JSHandle` instances can be passed as an argument to the [`method: Frame.evaluateHandle`]:
|
280
407
|
#
|
281
408
|
#
|
282
409
|
# ```js
|
@@ -285,8 +412,22 @@ module Playwright
|
|
285
412
|
# console.log(await resultHandle.jsonValue());
|
286
413
|
# await resultHandle.dispose();
|
287
414
|
# ```
|
415
|
+
#
|
416
|
+
# ```python async
|
417
|
+
# a_handle = await page.evaluate_handle("document.body")
|
418
|
+
# result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
|
419
|
+
# print(await result_handle.json_value())
|
420
|
+
# await result_handle.dispose()
|
421
|
+
# ```
|
422
|
+
#
|
423
|
+
# ```python sync
|
424
|
+
# a_handle = page.evaluate_handle("document.body")
|
425
|
+
# result_handle = page.evaluate_handle("body => body.innerHTML", a_handle)
|
426
|
+
# print(result_handle.json_value())
|
427
|
+
# result_handle.dispose()
|
428
|
+
# ```
|
288
429
|
def evaluate_handle(pageFunction, arg: nil)
|
289
|
-
|
430
|
+
wrap_impl(@impl.evaluate_handle(pageFunction, arg: arg))
|
290
431
|
end
|
291
432
|
|
292
433
|
# This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
|
@@ -302,7 +443,7 @@ module Playwright
|
|
302
443
|
# This method fetches an element with `selector` and focuses it. If there's no element matching `selector`, the method
|
303
444
|
# waits until a matching element appears in the DOM.
|
304
445
|
def focus(selector, timeout: nil)
|
305
|
-
|
446
|
+
wrap_impl(@impl.focus(selector, timeout: timeout))
|
306
447
|
end
|
307
448
|
|
308
449
|
# Returns the `frame` or `iframe` element handle which corresponds to this frame.
|
@@ -318,6 +459,18 @@ module Playwright
|
|
318
459
|
# const contentFrame = await frameElement.contentFrame();
|
319
460
|
# console.log(frame === contentFrame); // -> true
|
320
461
|
# ```
|
462
|
+
#
|
463
|
+
# ```python async
|
464
|
+
# frame_element = await frame.frame_element()
|
465
|
+
# content_frame = await frame_element.content_frame()
|
466
|
+
# assert frame == content_frame
|
467
|
+
# ```
|
468
|
+
#
|
469
|
+
# ```python sync
|
470
|
+
# frame_element = frame.frame_element()
|
471
|
+
# content_frame = frame_element.content_frame()
|
472
|
+
# assert frame == content_frame
|
473
|
+
# ```
|
321
474
|
def frame_element
|
322
475
|
raise NotImplementedError.new('frame_element is not implemented yet.')
|
323
476
|
end
|
@@ -341,12 +494,12 @@ module Playwright
|
|
341
494
|
# "Not Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
|
342
495
|
# [`method: Response.status`].
|
343
496
|
#
|
344
|
-
# >
|
345
|
-
#
|
346
|
-
# >
|
497
|
+
# > NOTE: `frame.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
|
498
|
+
# `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
|
499
|
+
# > NOTE: Headless mode doesn't support navigation to a PDF document. See the
|
347
500
|
# [upstream issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
|
348
501
|
def goto(url, referer: nil, timeout: nil, waitUntil: nil)
|
349
|
-
|
502
|
+
wrap_impl(@impl.goto(url, referer: referer, timeout: timeout, waitUntil: waitUntil))
|
350
503
|
end
|
351
504
|
|
352
505
|
# This method hovers over an element matching `selector` by performing the following steps:
|
@@ -417,20 +570,19 @@ module Playwright
|
|
417
570
|
#
|
418
571
|
# If the name is empty, returns the id attribute instead.
|
419
572
|
#
|
420
|
-
# >
|
421
|
-
# later.
|
573
|
+
# > NOTE: This value is calculated once when the frame is created, and will not update if the attribute is changed later.
|
422
574
|
def name
|
423
|
-
|
575
|
+
wrap_impl(@impl.name)
|
424
576
|
end
|
425
577
|
|
426
578
|
# Returns the page containing this frame.
|
427
579
|
def page
|
428
|
-
|
580
|
+
wrap_impl(@impl.page)
|
429
581
|
end
|
430
582
|
|
431
583
|
# Parent frame, if any. Detached frames and main frames return `null`.
|
432
584
|
def parent_frame
|
433
|
-
|
585
|
+
wrap_impl(@impl.parent_frame)
|
434
586
|
end
|
435
587
|
|
436
588
|
# `key` can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
|
@@ -455,7 +607,7 @@ module Playwright
|
|
455
607
|
delay: nil,
|
456
608
|
noWaitAfter: nil,
|
457
609
|
timeout: nil)
|
458
|
-
|
610
|
+
wrap_impl(@impl.press(selector, key, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout))
|
459
611
|
end
|
460
612
|
|
461
613
|
# Returns the array of option values that have been successfully selected.
|
@@ -463,6 +615,8 @@ module Playwright
|
|
463
615
|
# Triggers a `change` and `input` event once all the provided options have been selected. If there's no `<select>` element
|
464
616
|
# matching `selector`, the method throws an error.
|
465
617
|
#
|
618
|
+
# Will wait until all specified options are present in the `<select>` element.
|
619
|
+
#
|
466
620
|
#
|
467
621
|
# ```js
|
468
622
|
# // single selection matching the value
|
@@ -474,12 +628,30 @@ module Playwright
|
|
474
628
|
# // multiple selection
|
475
629
|
# frame.selectOption('select#colors', 'red', 'green', 'blue');
|
476
630
|
# ```
|
631
|
+
#
|
632
|
+
# ```python async
|
633
|
+
# # single selection matching the value
|
634
|
+
# await frame.select_option("select#colors", "blue")
|
635
|
+
# # single selection matching the label
|
636
|
+
# await frame.select_option("select#colors", label="blue")
|
637
|
+
# # multiple selection
|
638
|
+
# await frame.select_option("select#colors", value=["red", "green", "blue"])
|
639
|
+
# ```
|
640
|
+
#
|
641
|
+
# ```python sync
|
642
|
+
# # single selection matching the value
|
643
|
+
# frame.select_option("select#colors", "blue")
|
644
|
+
# # single selection matching both the label
|
645
|
+
# frame.select_option("select#colors", label="blue")
|
646
|
+
# # multiple selection
|
647
|
+
# frame.select_option("select#colors", value=["red", "green", "blue"])
|
648
|
+
# ```
|
477
649
|
def select_option(selector, values, noWaitAfter: nil, timeout: nil)
|
478
650
|
raise NotImplementedError.new('select_option is not implemented yet.')
|
479
651
|
end
|
480
652
|
|
481
653
|
def set_content(html, timeout: nil, waitUntil: nil)
|
482
|
-
|
654
|
+
wrap_impl(@impl.set_content(html, timeout: timeout, waitUntil: waitUntil))
|
483
655
|
end
|
484
656
|
alias_method :content=, :set_content
|
485
657
|
|
@@ -503,7 +675,7 @@ module Playwright
|
|
503
675
|
# When all steps combined have not finished during the specified `timeout`, this method rejects with a `TimeoutError`.
|
504
676
|
# Passing zero timeout disables this.
|
505
677
|
#
|
506
|
-
# >
|
678
|
+
# > NOTE: `frame.tap()` requires that the `hasTouch` option of the browser context be set to true.
|
507
679
|
def tap_point(
|
508
680
|
selector,
|
509
681
|
force: nil,
|
@@ -521,7 +693,7 @@ module Playwright
|
|
521
693
|
|
522
694
|
# Returns the page title.
|
523
695
|
def title
|
524
|
-
|
696
|
+
wrap_impl(@impl.title)
|
525
697
|
end
|
526
698
|
|
527
699
|
# Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text. `frame.type` can be used to
|
@@ -534,13 +706,23 @@ module Playwright
|
|
534
706
|
# await frame.type('#mytextarea', 'Hello'); // Types instantly
|
535
707
|
# await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
536
708
|
# ```
|
709
|
+
#
|
710
|
+
# ```python async
|
711
|
+
# await frame.type("#mytextarea", "hello") # types instantly
|
712
|
+
# await frame.type("#mytextarea", "world", delay=100) # types slower, like a user
|
713
|
+
# ```
|
714
|
+
#
|
715
|
+
# ```python sync
|
716
|
+
# frame.type("#mytextarea", "hello") # types instantly
|
717
|
+
# frame.type("#mytextarea", "world", delay=100) # types slower, like a user
|
718
|
+
# ```
|
537
719
|
def type_text(
|
538
720
|
selector,
|
539
721
|
text,
|
540
722
|
delay: nil,
|
541
723
|
noWaitAfter: nil,
|
542
724
|
timeout: nil)
|
543
|
-
|
725
|
+
wrap_impl(@impl.type_text(selector, text, delay: delay, noWaitAfter: noWaitAfter, timeout: timeout))
|
544
726
|
end
|
545
727
|
|
546
728
|
# This method checks an element matching `selector` by performing the following steps:
|
@@ -562,7 +744,7 @@ module Playwright
|
|
562
744
|
|
563
745
|
# Returns frame's url.
|
564
746
|
def url
|
565
|
-
|
747
|
+
wrap_impl(@impl.url)
|
566
748
|
end
|
567
749
|
|
568
750
|
# Returns when the `pageFunction` returns a truthy value, returns that value.
|
@@ -583,6 +765,39 @@ module Playwright
|
|
583
765
|
# })();
|
584
766
|
# ```
|
585
767
|
#
|
768
|
+
# ```python async
|
769
|
+
# import asyncio
|
770
|
+
# from playwright.async_api import async_playwright
|
771
|
+
#
|
772
|
+
# async def run(playwright):
|
773
|
+
# webkit = playwright.webkit
|
774
|
+
# browser = await webkit.launch()
|
775
|
+
# page = await browser.new_page()
|
776
|
+
# await page.evaluate("window.x = 0; setTimeout(() => { window.x = 100 }, 1000);", force_expr=True)
|
777
|
+
# await page.main_frame.wait_for_function("() => window.x > 0")
|
778
|
+
# await browser.close()
|
779
|
+
#
|
780
|
+
# async def main():
|
781
|
+
# async with async_playwright() as playwright:
|
782
|
+
# await run(playwright)
|
783
|
+
# asyncio.run(main())
|
784
|
+
# ```
|
785
|
+
#
|
786
|
+
# ```python sync
|
787
|
+
# from playwright.sync_api import sync_playwright
|
788
|
+
#
|
789
|
+
# def run(playwright):
|
790
|
+
# webkit = playwright.webkit
|
791
|
+
# browser = webkit.launch()
|
792
|
+
# page = browser.new_page()
|
793
|
+
# page.evaluate("window.x = 0; setTimeout(() => { window.x = 100 }, 1000);", force_expr=True)
|
794
|
+
# page.main_frame.wait_for_function("() => window.x > 0")
|
795
|
+
# browser.close()
|
796
|
+
#
|
797
|
+
# with sync_playwright() as playwright:
|
798
|
+
# run(playwright)
|
799
|
+
# ```
|
800
|
+
#
|
586
801
|
# To pass an argument to the predicate of `frame.waitForFunction` function:
|
587
802
|
#
|
588
803
|
#
|
@@ -590,6 +805,16 @@ module Playwright
|
|
590
805
|
# const selector = '.foo';
|
591
806
|
# await frame.waitForFunction(selector => !!document.querySelector(selector), selector);
|
592
807
|
# ```
|
808
|
+
#
|
809
|
+
# ```python async
|
810
|
+
# selector = ".foo"
|
811
|
+
# await frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
812
|
+
# ```
|
813
|
+
#
|
814
|
+
# ```python sync
|
815
|
+
# selector = ".foo"
|
816
|
+
# frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
817
|
+
# ```
|
593
818
|
def wait_for_function(pageFunction, arg: nil, polling: nil, timeout: nil)
|
594
819
|
raise NotImplementedError.new('wait_for_function is not implemented yet.')
|
595
820
|
end
|
@@ -604,13 +829,23 @@ module Playwright
|
|
604
829
|
# await frame.click('button'); // Click triggers navigation.
|
605
830
|
# await frame.waitForLoadState(); // Waits for 'load' state by default.
|
606
831
|
# ```
|
832
|
+
#
|
833
|
+
# ```python async
|
834
|
+
# await frame.click("button") # click triggers navigation.
|
835
|
+
# await frame.wait_for_load_state() # the promise resolves after "load" event.
|
836
|
+
# ```
|
837
|
+
#
|
838
|
+
# ```python sync
|
839
|
+
# frame.click("button") # click triggers navigation.
|
840
|
+
# frame.wait_for_load_state() # the promise resolves after "load" event.
|
841
|
+
# ```
|
607
842
|
def wait_for_load_state(state: nil, timeout: nil)
|
608
|
-
|
843
|
+
wrap_impl(@impl.wait_for_load_state(state: state, timeout: timeout))
|
609
844
|
end
|
610
845
|
|
611
|
-
#
|
612
|
-
# last redirect. In case of navigation to a different anchor or navigation due to
|
613
|
-
# resolve with `null`.
|
846
|
+
# Waits for the frame navigation and returns the main resource response. In case of multiple redirects, the navigation
|
847
|
+
# will resolve with the response of the last redirect. In case of navigation to a different anchor or navigation due to
|
848
|
+
# History API usage, the navigation will resolve with `null`.
|
614
849
|
#
|
615
850
|
# This method waits for the frame to navigate to a new URL. It is useful for when you run code which will indirectly cause
|
616
851
|
# the frame to navigate. Consider this example:
|
@@ -618,15 +853,27 @@ module Playwright
|
|
618
853
|
#
|
619
854
|
# ```js
|
620
855
|
# const [response] = await Promise.all([
|
621
|
-
# frame.waitForNavigation(), //
|
622
|
-
# frame.click('a.
|
856
|
+
# frame.waitForNavigation(), // The promise resolves after navigation has finished
|
857
|
+
# frame.click('a.delayed-navigation'), // Clicking the link will indirectly cause a navigation
|
623
858
|
# ]);
|
624
859
|
# ```
|
625
860
|
#
|
626
|
-
#
|
861
|
+
# ```python async
|
862
|
+
# async with frame.expect_navigation():
|
863
|
+
# await frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
864
|
+
# # Resolves after navigation has finished
|
865
|
+
# ```
|
866
|
+
#
|
867
|
+
# ```python sync
|
868
|
+
# with frame.expect_navigation():
|
869
|
+
# frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
870
|
+
# # Resolves after navigation has finished
|
871
|
+
# ```
|
872
|
+
#
|
873
|
+
# > NOTE: Usage of the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) to change the URL is
|
627
874
|
# considered a navigation.
|
628
|
-
def
|
629
|
-
raise NotImplementedError.new('
|
875
|
+
def expect_navigation(timeout: nil, url: nil, waitUntil: nil)
|
876
|
+
raise NotImplementedError.new('expect_navigation is not implemented yet.')
|
630
877
|
end
|
631
878
|
|
632
879
|
# Returns when element specified by selector satisfies `state` option. Returns `null` if waiting for `hidden` or
|
@@ -640,21 +887,56 @@ module Playwright
|
|
640
887
|
#
|
641
888
|
#
|
642
889
|
# ```js
|
643
|
-
# const {
|
890
|
+
# const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
|
644
891
|
#
|
645
892
|
# (async () => {
|
646
|
-
# const browser = await
|
893
|
+
# const browser = await chromium.launch();
|
647
894
|
# const page = await browser.newPage();
|
648
|
-
# let currentURL
|
649
|
-
# page.mainFrame()
|
650
|
-
# .waitForSelector('img')
|
651
|
-
# .then(() => console.log('First URL with image: ' + currentURL));
|
652
|
-
# for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) {
|
895
|
+
# for (let currentURL of ['https://google.com', 'https://bbc.com']) {
|
653
896
|
# await page.goto(currentURL);
|
897
|
+
# const element = await page.mainFrame().waitForSelector('img');
|
898
|
+
# console.log('Loaded image: ' + await element.getAttribute('src'));
|
654
899
|
# }
|
655
900
|
# await browser.close();
|
656
901
|
# })();
|
657
902
|
# ```
|
903
|
+
#
|
904
|
+
# ```python async
|
905
|
+
# import asyncio
|
906
|
+
# from playwright.async_api import async_playwright
|
907
|
+
#
|
908
|
+
# async def run(playwright):
|
909
|
+
# chromium = playwright.chromium
|
910
|
+
# browser = await chromium.launch()
|
911
|
+
# page = await browser.new_page()
|
912
|
+
# for current_url in ["https://google.com", "https://bbc.com"]:
|
913
|
+
# await page.goto(current_url, wait_until="domcontentloaded")
|
914
|
+
# element = await page.main_frame.wait_for_selector("img")
|
915
|
+
# print("Loaded image: " + str(await element.get_attribute("src")))
|
916
|
+
# await browser.close()
|
917
|
+
#
|
918
|
+
# async def main():
|
919
|
+
# async with async_playwright() as playwright:
|
920
|
+
# await run(playwright)
|
921
|
+
# asyncio.run(main())
|
922
|
+
# ```
|
923
|
+
#
|
924
|
+
# ```python sync
|
925
|
+
# from playwright.sync_api import sync_playwright
|
926
|
+
#
|
927
|
+
# def run(playwright):
|
928
|
+
# chromium = playwright.chromium
|
929
|
+
# browser = chromium.launch()
|
930
|
+
# page = browser.new_page()
|
931
|
+
# for current_url in ["https://google.com", "https://bbc.com"]:
|
932
|
+
# page.goto(current_url, wait_until="domcontentloaded")
|
933
|
+
# element = page.main_frame.wait_for_selector("img")
|
934
|
+
# print("Loaded image: " + str(element.get_attribute("src")))
|
935
|
+
# browser.close()
|
936
|
+
#
|
937
|
+
# with sync_playwright() as playwright:
|
938
|
+
# run(playwright)
|
939
|
+
# ```
|
658
940
|
def wait_for_selector(selector, state: nil, timeout: nil)
|
659
941
|
raise NotImplementedError.new('wait_for_selector is not implemented yet.')
|
660
942
|
end
|
@@ -668,31 +950,36 @@ module Playwright
|
|
668
950
|
end
|
669
951
|
|
670
952
|
# @nodoc
|
671
|
-
def
|
672
|
-
|
953
|
+
def wait_for_navigation(timeout: nil, url: nil, waitUntil: nil, &block)
|
954
|
+
wrap_impl(@impl.wait_for_navigation(timeout: timeout, url: url, waitUntil: waitUntil, &wrap_block_call(block)))
|
673
955
|
end
|
674
956
|
|
675
957
|
# @nodoc
|
676
958
|
def after_initialize
|
677
|
-
|
959
|
+
wrap_impl(@impl.after_initialize)
|
960
|
+
end
|
961
|
+
|
962
|
+
# @nodoc
|
963
|
+
def detached=(req)
|
964
|
+
wrap_impl(@impl.detached=(req))
|
678
965
|
end
|
679
966
|
|
680
967
|
# -- inherited from EventEmitter --
|
681
968
|
# @nodoc
|
682
|
-
def
|
683
|
-
|
969
|
+
def on(event, callback)
|
970
|
+
wrap_impl(@impl.on(event, callback))
|
684
971
|
end
|
685
972
|
|
686
973
|
# -- inherited from EventEmitter --
|
687
974
|
# @nodoc
|
688
|
-
def
|
689
|
-
|
975
|
+
def off(event, callback)
|
976
|
+
wrap_impl(@impl.off(event, callback))
|
690
977
|
end
|
691
978
|
|
692
979
|
# -- inherited from EventEmitter --
|
693
980
|
# @nodoc
|
694
|
-
def
|
695
|
-
|
981
|
+
def once(event, callback)
|
982
|
+
wrap_impl(@impl.once(event, callback))
|
696
983
|
end
|
697
984
|
end
|
698
985
|
end
|