playwright-ruby-client 0.5.10 → 0.6.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 +1 -1
- data/docs/api_coverage.md +9 -0
- data/lib/playwright/channel_owners/browser.rb +27 -2
- data/lib/playwright/channel_owners/browser_context.rb +52 -1
- data/lib/playwright/channel_owners/browser_type.rb +8 -1
- data/lib/playwright/channel_owners/element_handle.rb +15 -6
- data/lib/playwright/channel_owners/frame.rb +18 -6
- data/lib/playwright/channel_owners/page.rb +19 -44
- data/lib/playwright/download.rb +3 -2
- data/lib/playwright/events.rb +4 -0
- data/lib/playwright/tracing_impl.rb +31 -0
- data/lib/playwright/version.rb +2 -2
- data/lib/playwright_api/accessibility.rb +8 -7
- data/lib/playwright_api/android.rb +1 -1
- data/lib/playwright_api/browser.rb +43 -0
- data/lib/playwright_api/browser_context.rb +199 -3
- data/lib/playwright_api/browser_type.rb +45 -6
- data/lib/playwright_api/console_message.rb +2 -0
- data/lib/playwright_api/dialog.rb +23 -0
- data/lib/playwright_api/element_handle.rb +124 -20
- data/lib/playwright_api/file_chooser.rb +7 -0
- data/lib/playwright_api/frame.rb +193 -20
- data/lib/playwright_api/js_handle.rb +17 -0
- data/lib/playwright_api/keyboard.rb +48 -0
- data/lib/playwright_api/page.rb +503 -38
- data/lib/playwright_api/playwright.rb +22 -4
- data/lib/playwright_api/request.rb +28 -0
- data/lib/playwright_api/route.rb +22 -2
- data/lib/playwright_api/selectors.rb +25 -0
- data/lib/playwright_api/tracing.rb +99 -0
- data/lib/playwright_api/worker.rb +2 -2
- data/playwright.gemspec +1 -1
- metadata +6 -18
@@ -23,6 +23,10 @@ module Playwright
|
|
23
23
|
# # ...
|
24
24
|
# ```
|
25
25
|
#
|
26
|
+
# ```csharp
|
27
|
+
# var windowHandle = await page.EvaluateHandleAsync("() => window");
|
28
|
+
# ```
|
29
|
+
#
|
26
30
|
# JSHandle prevents the referenced JavaScript object being garbage collected unless the handle is exposed with
|
27
31
|
# [`method: JSHandle.dispose`]. JSHandles are auto-disposed when their origin frame gets navigated or the parent context
|
28
32
|
# gets destroyed.
|
@@ -69,6 +73,11 @@ module Playwright
|
|
69
73
|
# tweet_handle = page.query_selector(".tweet .retweets")
|
70
74
|
# assert tweet_handle.evaluate("node => node.innerText") == "10 retweets"
|
71
75
|
# ```
|
76
|
+
#
|
77
|
+
# ```csharp
|
78
|
+
# var tweetHandle = await page.QuerySelectorAsync(".tweet .retweets");
|
79
|
+
# Assert.Equals("10 retweets", await tweetHandle.EvaluateAsync("node => node.innerText"));
|
80
|
+
# ```
|
72
81
|
def evaluate(expression, arg: nil)
|
73
82
|
wrap_impl(@impl.evaluate(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
74
83
|
end
|
@@ -122,6 +131,14 @@ module Playwright
|
|
122
131
|
# document_handle = properties.get("document")
|
123
132
|
# handle.dispose()
|
124
133
|
# ```
|
134
|
+
#
|
135
|
+
# ```csharp
|
136
|
+
# var handle = await page.EvaluateHandleAsync("() => ({window, document}");
|
137
|
+
# var properties = await handle.GetPropertiesAsync();
|
138
|
+
# var windowHandle = properties["window"];
|
139
|
+
# var documentHandle = properties["document"];
|
140
|
+
# await handle.DisposeAsync();
|
141
|
+
# ```
|
125
142
|
def get_properties
|
126
143
|
wrap_impl(@impl.get_properties)
|
127
144
|
end
|
@@ -54,6 +54,20 @@ module Playwright
|
|
54
54
|
# # result text will end up saying "Hello!"
|
55
55
|
# ```
|
56
56
|
#
|
57
|
+
# ```csharp
|
58
|
+
# await page.Keyboard.TypeAsync("Hello World!");
|
59
|
+
# await page.Keyboard.PressAsync("ArrowLeft");
|
60
|
+
#
|
61
|
+
# await page.Keyboard.DownAsync("Shift");
|
62
|
+
# for (int i = 0; i < " World".Length; i++)
|
63
|
+
# await page.Keyboard.PressAsync("ArrowLeft");
|
64
|
+
#
|
65
|
+
# await page.Keyboard.UpAsync("Shift");
|
66
|
+
#
|
67
|
+
# await page.Keyboard.PressAsync("Backspace");
|
68
|
+
# // Result text will end up saying "Hello!"
|
69
|
+
# ```
|
70
|
+
#
|
57
71
|
# An example of pressing uppercase `A`
|
58
72
|
#
|
59
73
|
#
|
@@ -81,6 +95,12 @@ module Playwright
|
|
81
95
|
# page.keyboard.press("Shift+A")
|
82
96
|
# ```
|
83
97
|
#
|
98
|
+
# ```csharp
|
99
|
+
# await page.Keyboard.PressAsync("Shift+KeyA");
|
100
|
+
# // or
|
101
|
+
# await page.Keyboard.PressAsync("Shift+A");
|
102
|
+
# ```
|
103
|
+
#
|
84
104
|
# An example to trigger select-all with the keyboard
|
85
105
|
#
|
86
106
|
#
|
@@ -111,6 +131,13 @@ module Playwright
|
|
111
131
|
# # on mac_os
|
112
132
|
# page.keyboard.press("Meta+A")
|
113
133
|
# ```
|
134
|
+
#
|
135
|
+
# ```csharp
|
136
|
+
# // on Windows and Linux
|
137
|
+
# await page.Keyboard.PressAsync("Control+A");
|
138
|
+
# // on macOS
|
139
|
+
# await page.Keyboard.PressAsync("Meta+A");
|
140
|
+
# ```
|
114
141
|
class Keyboard < PlaywrightApi
|
115
142
|
|
116
143
|
# Dispatches a `keydown` event.
|
@@ -160,6 +187,10 @@ module Playwright
|
|
160
187
|
# page.keyboard.insert_text("嗨")
|
161
188
|
# ```
|
162
189
|
#
|
190
|
+
# ```csharp
|
191
|
+
# await page.Keyboard.PressAsync("嗨");
|
192
|
+
# ```
|
193
|
+
#
|
163
194
|
# > NOTE: Modifier keys DO NOT effect `keyboard.insertText`. Holding down `Shift` will not type the text in upper case.
|
164
195
|
def insert_text(text)
|
165
196
|
wrap_impl(@impl.insert_text(unwrap_impl(text)))
|
@@ -231,6 +262,17 @@ module Playwright
|
|
231
262
|
# browser.close()
|
232
263
|
# ```
|
233
264
|
#
|
265
|
+
# ```csharp
|
266
|
+
# await page.GotoAsync("https://keycode.info");
|
267
|
+
# await page.Keyboard.PressAsync("A");
|
268
|
+
# await page.ScreenshotAsync("A.png");
|
269
|
+
# await page.Keyboard.PressAsync("ArrowLeft");
|
270
|
+
# await page.ScreenshotAsync("ArrowLeft.png");
|
271
|
+
# await page.Keyboard.PressAsync("Shift+O");
|
272
|
+
# await page.ScreenshotAsync("O.png");
|
273
|
+
# await browser.CloseAsync();
|
274
|
+
# ```
|
275
|
+
#
|
234
276
|
# Shortcut for [`method: Keyboard.down`] and [`method: Keyboard.up`].
|
235
277
|
def press(key, delay: nil)
|
236
278
|
wrap_impl(@impl.press(unwrap_impl(key), delay: unwrap_impl(delay)))
|
@@ -263,7 +305,13 @@ module Playwright
|
|
263
305
|
# page.keyboard.type("World", delay=100) # types slower, like a user
|
264
306
|
# ```
|
265
307
|
#
|
308
|
+
# ```csharp
|
309
|
+
# await page.Keyboard.TypeAsync("Hello"); // types instantly
|
310
|
+
# await page.Keyboard.TypeAsync("World"); // types slower, like a user
|
311
|
+
# ```
|
312
|
+
#
|
266
313
|
# > NOTE: Modifier keys DO NOT effect `keyboard.type`. Holding down `Shift` will not type the text in upper case.
|
314
|
+
# > NOTE: For characters that are not on a US keyboard, only an `input` event will be sent.
|
267
315
|
def type(text, delay: nil)
|
268
316
|
wrap_impl(@impl.type(unwrap_impl(text), delay: unwrap_impl(delay)))
|
269
317
|
end
|
data/lib/playwright_api/page.rb
CHANGED
@@ -74,6 +74,23 @@ module Playwright
|
|
74
74
|
# run(playwright)
|
75
75
|
# ```
|
76
76
|
#
|
77
|
+
# ```csharp
|
78
|
+
# using Microsoft.Playwright;
|
79
|
+
# using System.Threading.Tasks;
|
80
|
+
#
|
81
|
+
# class PageExamples
|
82
|
+
# {
|
83
|
+
# public static async Task Run()
|
84
|
+
# {
|
85
|
+
# using var playwright = await Playwright.CreateAsync();
|
86
|
+
# await using var browser = await playwright.Webkit.LaunchAsync();
|
87
|
+
# var page = await browser.NewPageAsync();
|
88
|
+
# await page.GotoAsync("https://www.theverge.com");
|
89
|
+
# await page.ScreenshotAsync("theverge.png");
|
90
|
+
# }
|
91
|
+
# }
|
92
|
+
# ```
|
93
|
+
#
|
77
94
|
# The Page class emits various events (described below) which can be handled using any of Node's native
|
78
95
|
# [`EventEmitter`](https://nodejs.org/api/events.html#events_class_eventemitter) methods, such as `on`, `once` or
|
79
96
|
# `removeListener`.
|
@@ -93,6 +110,10 @@ module Playwright
|
|
93
110
|
# page.once("load", lambda: print("page loaded!"))
|
94
111
|
# ```
|
95
112
|
#
|
113
|
+
# ```csharp
|
114
|
+
# page.Load += (_, _) => Console.WriteLine("Page loaded!");
|
115
|
+
# ```
|
116
|
+
#
|
96
117
|
# To unsubscribe from events use the `removeListener` method:
|
97
118
|
#
|
98
119
|
#
|
@@ -121,6 +142,16 @@ module Playwright
|
|
121
142
|
# # sometime later...
|
122
143
|
# page.remove_listener("request", log_request)
|
123
144
|
# ```
|
145
|
+
#
|
146
|
+
# ```csharp
|
147
|
+
# void PageLoadHandler(object _, IPage p) {
|
148
|
+
# Console.WriteLine("Page loaded!");
|
149
|
+
# };
|
150
|
+
#
|
151
|
+
# page.Load += PageLoadHandler;
|
152
|
+
# // Do some work...
|
153
|
+
# page.Load -= PageLoadHandler;
|
154
|
+
# ```
|
124
155
|
class Page < PlaywrightApi
|
125
156
|
|
126
157
|
def accessibility # property
|
@@ -176,6 +207,10 @@ module Playwright
|
|
176
207
|
# page.add_init_script(path="./preload.js")
|
177
208
|
# ```
|
178
209
|
#
|
210
|
+
# ```csharp
|
211
|
+
# await page.AddInitScriptAsync(scriptPath: "./preload.js");
|
212
|
+
# ```
|
213
|
+
#
|
179
214
|
# > NOTE: The order of evaluation of multiple scripts installed via [`method: BrowserContext.addInitScript`] and
|
180
215
|
# [`method: Page.addInitScript`] is not defined.
|
181
216
|
def add_init_script(path: nil, script: nil)
|
@@ -223,8 +258,9 @@ module Playwright
|
|
223
258
|
force: nil,
|
224
259
|
noWaitAfter: nil,
|
225
260
|
position: nil,
|
226
|
-
timeout: nil
|
227
|
-
|
261
|
+
timeout: nil,
|
262
|
+
trial: nil)
|
263
|
+
wrap_impl(@impl.check(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
228
264
|
end
|
229
265
|
|
230
266
|
# This method clicks an element matching `selector` by performing the following steps:
|
@@ -248,8 +284,9 @@ module Playwright
|
|
248
284
|
modifiers: nil,
|
249
285
|
noWaitAfter: nil,
|
250
286
|
position: nil,
|
251
|
-
timeout: nil
|
252
|
-
|
287
|
+
timeout: nil,
|
288
|
+
trial: nil)
|
289
|
+
wrap_impl(@impl.click(unwrap_impl(selector), button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
253
290
|
end
|
254
291
|
|
255
292
|
# If `runBeforeUnload` is `false`, does not run any unload handlers and waits for the page to be closed. If
|
@@ -296,8 +333,9 @@ module Playwright
|
|
296
333
|
modifiers: nil,
|
297
334
|
noWaitAfter: nil,
|
298
335
|
position: nil,
|
299
|
-
timeout: nil
|
300
|
-
|
336
|
+
timeout: nil,
|
337
|
+
trial: nil)
|
338
|
+
wrap_impl(@impl.dblclick(unwrap_impl(selector), button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
301
339
|
end
|
302
340
|
|
303
341
|
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
@@ -321,6 +359,10 @@ module Playwright
|
|
321
359
|
# page.dispatch_event("button#submit", "click")
|
322
360
|
# ```
|
323
361
|
#
|
362
|
+
# ```csharp
|
363
|
+
# await page.DispatchEventAsync("button#submit", "click");
|
364
|
+
# ```
|
365
|
+
#
|
324
366
|
# Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
325
367
|
# and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
326
368
|
#
|
@@ -361,10 +403,18 @@ module Playwright
|
|
361
403
|
# data_transfer = page.evaluate_handle("new DataTransfer()")
|
362
404
|
# page.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
363
405
|
# ```
|
406
|
+
#
|
407
|
+
# ```csharp
|
408
|
+
# var dataTransfer = await page.EvaluateHandleAsync("() => new DataTransfer()");
|
409
|
+
# await page.DispatchEventAsync("#source", "dragstart", new { dataTransfer });
|
410
|
+
# ```
|
364
411
|
def dispatch_event(selector, type, eventInit: nil, timeout: nil)
|
365
412
|
wrap_impl(@impl.dispatch_event(unwrap_impl(selector), unwrap_impl(type), eventInit: unwrap_impl(eventInit), timeout: unwrap_impl(timeout)))
|
366
413
|
end
|
367
414
|
|
415
|
+
# This method changes the `CSS media type` through the `media` argument, and/or the `'prefers-colors-scheme'` media
|
416
|
+
# feature, using the `colorScheme` argument.
|
417
|
+
#
|
368
418
|
#
|
369
419
|
# ```js
|
370
420
|
# await page.evaluate(() => matchMedia('screen').matches);
|
@@ -442,6 +492,25 @@ module Playwright
|
|
442
492
|
# # → False
|
443
493
|
# ```
|
444
494
|
#
|
495
|
+
# ```csharp
|
496
|
+
# await page.EvaluateAsync("() => matchMedia('screen').matches");
|
497
|
+
# // → true
|
498
|
+
# await page.EvaluateAsync("() => matchMedia('print').matches");
|
499
|
+
# // → false
|
500
|
+
#
|
501
|
+
# await page.EmulateMediaAsync(Media.Print);
|
502
|
+
# await page.EvaluateAsync("() => matchMedia('screen').matches");
|
503
|
+
# // → false
|
504
|
+
# await page.EvaluateAsync("() => matchMedia('print').matches");
|
505
|
+
# // → true
|
506
|
+
#
|
507
|
+
# await page.EmulateMediaAsync(Media.Screen);
|
508
|
+
# await page.EvaluateAsync("() => matchMedia('screen').matches");
|
509
|
+
# // → true
|
510
|
+
# await page.EvaluateAsync("() => matchMedia('print').matches");
|
511
|
+
# // → false
|
512
|
+
# ```
|
513
|
+
#
|
445
514
|
#
|
446
515
|
# ```js
|
447
516
|
# await page.emulateMedia({ colorScheme: 'dark' });
|
@@ -481,6 +550,16 @@ module Playwright
|
|
481
550
|
# # → False
|
482
551
|
# page.evaluate("matchMedia('(prefers-color-scheme: no-preference)').matches")
|
483
552
|
# ```
|
553
|
+
#
|
554
|
+
# ```csharp
|
555
|
+
# await page.EmulateMediaAsync(colorScheme: ColorScheme.Dark);
|
556
|
+
# await page.EvaluateAsync("matchMedia('(prefers-color-scheme: dark)').matches");
|
557
|
+
# // → true
|
558
|
+
# await page.EvaluateAsync("matchMedia('(prefers-color-scheme: light)').matches");
|
559
|
+
# // → false
|
560
|
+
# await page.EvaluateAsync("matchMedia('(prefers-color-scheme: no-preference)').matches");
|
561
|
+
# // → false
|
562
|
+
# ```
|
484
563
|
def emulate_media(colorScheme: nil, media: nil)
|
485
564
|
wrap_impl(@impl.emulate_media(colorScheme: unwrap_impl(colorScheme), media: unwrap_impl(media)))
|
486
565
|
end
|
@@ -518,6 +597,12 @@ module Playwright
|
|
518
597
|
# html = page.eval_on_selector(".main-container", "(e, suffix) => e.outer_html + suffix", "hello")
|
519
598
|
# ```
|
520
599
|
#
|
600
|
+
# ```csharp
|
601
|
+
# var searchValue = await page.EvalOnSelectorAsync<string>("#search", "el => el.value");
|
602
|
+
# var preloadHref = await page.EvalOnSelectorAsync<string>("link[rel=preload]", "el => el.href");
|
603
|
+
# var html = await page.EvalOnSelectorAsync(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
|
604
|
+
# ```
|
605
|
+
#
|
521
606
|
# Shortcut for main frame's [`method: Frame.evalOnSelector`].
|
522
607
|
def eval_on_selector(selector, expression, arg: nil)
|
523
608
|
wrap_impl(@impl.eval_on_selector(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
@@ -547,6 +632,10 @@ module Playwright
|
|
547
632
|
# ```python sync
|
548
633
|
# div_counts = page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
549
634
|
# ```
|
635
|
+
#
|
636
|
+
# ```csharp
|
637
|
+
# var divsCount = await page.EvalOnSelectorAllAsync<bool>("div", "(divs, min) => divs.length >= min", 10);
|
638
|
+
# ```
|
550
639
|
def eval_on_selector_all(selector, expression, arg: nil)
|
551
640
|
wrap_impl(@impl.eval_on_selector_all(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
552
641
|
end
|
@@ -587,6 +676,11 @@ module Playwright
|
|
587
676
|
# print(result) # prints "56"
|
588
677
|
# ```
|
589
678
|
#
|
679
|
+
# ```csharp
|
680
|
+
# var result = await page.EvaluateAsync<int>("([x, y]) => Promise.resolve(x * y)", new[] { 7, 8 });
|
681
|
+
# Console.WriteLine(result);
|
682
|
+
# ```
|
683
|
+
#
|
590
684
|
# A string can also be passed in instead of a function:
|
591
685
|
#
|
592
686
|
#
|
@@ -612,6 +706,10 @@ module Playwright
|
|
612
706
|
# print(page.evaluate(f"1 + {x}")) # prints "11"
|
613
707
|
# ```
|
614
708
|
#
|
709
|
+
# ```csharp
|
710
|
+
# Console.WriteLine(await page.EvaluateAsync<int>("1 + 2")); // prints "3"
|
711
|
+
# ```
|
712
|
+
#
|
615
713
|
# `ElementHandle` instances can be passed as an argument to the [`method: Page.evaluate`]:
|
616
714
|
#
|
617
715
|
#
|
@@ -639,6 +737,12 @@ module Playwright
|
|
639
737
|
# body_handle.dispose()
|
640
738
|
# ```
|
641
739
|
#
|
740
|
+
# ```csharp
|
741
|
+
# var bodyHandle = await page.QuerySelectorAsync("body");
|
742
|
+
# var html = await page.EvaluateAsync<string>("([body, suffix]) => body.innerHTML + suffix", new object [] { bodyHandle, "hello" });
|
743
|
+
# await bodyHandle.DisposeAsync();
|
744
|
+
# ```
|
745
|
+
#
|
642
746
|
# Shortcut for main frame's [`method: Frame.evaluate`].
|
643
747
|
def evaluate(expression, arg: nil)
|
644
748
|
wrap_impl(@impl.evaluate(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
@@ -673,6 +777,11 @@ module Playwright
|
|
673
777
|
# a_window_handle # handle for the window object.
|
674
778
|
# ```
|
675
779
|
#
|
780
|
+
# ```csharp
|
781
|
+
# // Handle for the window object.
|
782
|
+
# var aWindowHandle = await page.EvaluateHandleAsync("() => Promise.resolve(window)");
|
783
|
+
# ```
|
784
|
+
#
|
676
785
|
# A string can also be passed in instead of a function:
|
677
786
|
#
|
678
787
|
#
|
@@ -692,6 +801,10 @@ module Playwright
|
|
692
801
|
# a_handle = page.evaluate_handle("document") # handle for the "document"
|
693
802
|
# ```
|
694
803
|
#
|
804
|
+
# ```csharp
|
805
|
+
# var docHandle = await page.EvalueHandleAsync("document"); // Handle for the `document`
|
806
|
+
# ```
|
807
|
+
#
|
695
808
|
# `JSHandle` instances can be passed as an argument to the [`method: Page.evaluateHandle`]:
|
696
809
|
#
|
697
810
|
#
|
@@ -722,6 +835,13 @@ module Playwright
|
|
722
835
|
# print(result_handle.json_value())
|
723
836
|
# result_handle.dispose()
|
724
837
|
# ```
|
838
|
+
#
|
839
|
+
# ```csharp
|
840
|
+
# var handle = await page.EvaluateHandleAsync("() => document.body");
|
841
|
+
# var resultHandle = await page.EvaluateHandleAsync("([body, suffix]) => body.innerHTML + suffix", new object[] { handle, "hello" });
|
842
|
+
# Console.WriteLine(await resultHandle.JsonValueAsync<string>());
|
843
|
+
# await resultHandle.DisposeAsync();
|
844
|
+
# ```
|
725
845
|
def evaluate_handle(expression, arg: nil)
|
726
846
|
wrap_impl(@impl.evaluate_handle(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
727
847
|
end
|
@@ -836,6 +956,32 @@ module Playwright
|
|
836
956
|
# run(playwright)
|
837
957
|
# ```
|
838
958
|
#
|
959
|
+
# ```csharp
|
960
|
+
# using Microsoft.Playwright;
|
961
|
+
# using System.Threading.Tasks;
|
962
|
+
#
|
963
|
+
# class PageExamples
|
964
|
+
# {
|
965
|
+
# public static async Task Main()
|
966
|
+
# {
|
967
|
+
# using var playwright = await Playwright.CreateAsync();
|
968
|
+
# await using var browser = await playwright.Webkit.LaunchAsync(headless: false);
|
969
|
+
# var page = await browser.NewPageAsync();
|
970
|
+
#
|
971
|
+
# await page.ExposeBindingAsync("pageUrl", (source) => source.Page.Url);
|
972
|
+
# await page.SetContentAsync("<script>\n" +
|
973
|
+
# " async function onClick() {\n" +
|
974
|
+
# " document.querySelector('div').textContent = await window.pageURL();\n" +
|
975
|
+
# " }\n" +
|
976
|
+
# "</script>\n" +
|
977
|
+
# "<button onclick=\"onClick()\">Click me</button>\n" +
|
978
|
+
# "<div></div>");
|
979
|
+
#
|
980
|
+
# await page.ClickAsync("button");
|
981
|
+
# }
|
982
|
+
# }
|
983
|
+
# ```
|
984
|
+
#
|
839
985
|
# An example of passing an element handle:
|
840
986
|
#
|
841
987
|
#
|
@@ -893,6 +1039,23 @@ module Playwright
|
|
893
1039
|
# <div>Or click me</div>
|
894
1040
|
# """)
|
895
1041
|
# ```
|
1042
|
+
#
|
1043
|
+
# ```csharp
|
1044
|
+
# var result = new TaskCompletionSource<string>();
|
1045
|
+
# await page.ExposeBindingAsync("clicked", async (BindingSource _, IJSHandle t) =>
|
1046
|
+
# {
|
1047
|
+
# return result.TrySetResult(await t.AsElement.TextContentAsync());
|
1048
|
+
# });
|
1049
|
+
#
|
1050
|
+
# await page.SetContentAsync("<script>\n" +
|
1051
|
+
# " document.addEventListener('click', event => window.clicked(event.target));\n" +
|
1052
|
+
# "</script>\n" +
|
1053
|
+
# "<div>Click me</div>\n" +
|
1054
|
+
# "<div>Or click me</div>\n");
|
1055
|
+
#
|
1056
|
+
# await page.ClickAsync("div");
|
1057
|
+
# Console.WriteLine(await result.Task);
|
1058
|
+
# ```
|
896
1059
|
def expose_binding(name, callback, handle: nil)
|
897
1060
|
wrap_impl(@impl.expose_binding(unwrap_impl(name), unwrap_impl(callback), handle: unwrap_impl(handle)))
|
898
1061
|
end
|
@@ -1030,19 +1193,58 @@ module Playwright
|
|
1030
1193
|
# with sync_playwright() as playwright:
|
1031
1194
|
# run(playwright)
|
1032
1195
|
# ```
|
1196
|
+
#
|
1197
|
+
# ```csharp
|
1198
|
+
# using Microsoft.Playwright;
|
1199
|
+
# using System;
|
1200
|
+
# using System.Security.Cryptography;
|
1201
|
+
# using System.Threading.Tasks;
|
1202
|
+
#
|
1203
|
+
# class PageExamples
|
1204
|
+
# {
|
1205
|
+
# public static async Task Main()
|
1206
|
+
# {
|
1207
|
+
# using var playwright = await Playwright.CreateAsync();
|
1208
|
+
# await using var browser = await playwright.Webkit.LaunchAsync(headless: false);
|
1209
|
+
# var page = await browser.NewPageAsync();
|
1210
|
+
#
|
1211
|
+
# // NOTE: md5 is inherently insecure, and we strongly discourage using
|
1212
|
+
# // this in production in any shape or form
|
1213
|
+
# await page.ExposeFunctionAsync("sha1", (string input) =>
|
1214
|
+
# {
|
1215
|
+
# return Convert.ToBase64String(
|
1216
|
+
# MD5.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(input)));
|
1217
|
+
# });
|
1218
|
+
#
|
1219
|
+
# await page.SetContentAsync("<script>\n" +
|
1220
|
+
# " async function onClick() {\n" +
|
1221
|
+
# " document.querySelector('div').textContent = await window.sha1('PLAYWRIGHT');\n" +
|
1222
|
+
# " }\n" +
|
1223
|
+
# "</script>\n" +
|
1224
|
+
# "<button onclick=\"onClick()\">Click me</button>\n" +
|
1225
|
+
# "<div></div>");
|
1226
|
+
#
|
1227
|
+
# await page.ClickAsync("button");
|
1228
|
+
# Console.WriteLine(await page.TextContentAsync("div"));
|
1229
|
+
# }
|
1230
|
+
# }
|
1231
|
+
# ```
|
1033
1232
|
def expose_function(name, callback)
|
1034
1233
|
wrap_impl(@impl.expose_function(unwrap_impl(name), unwrap_impl(callback)))
|
1035
1234
|
end
|
1036
1235
|
|
1037
1236
|
# This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
|
1038
|
-
# element, fills it and triggers an `input` event after filling.
|
1039
|
-
#
|
1040
|
-
#
|
1041
|
-
#
|
1237
|
+
# element, fills it and triggers an `input` event after filling. Note that you can pass an empty string to clear the input
|
1238
|
+
# field.
|
1239
|
+
#
|
1240
|
+
# If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error.
|
1241
|
+
# However, if the element is inside the `<label>` element that has an associated
|
1242
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled
|
1243
|
+
# instead.
|
1042
1244
|
#
|
1043
1245
|
# To send fine-grained keyboard events, use [`method: Page.type`].
|
1044
1246
|
#
|
1045
|
-
# Shortcut for main frame's [`method: Frame.fill`]
|
1247
|
+
# Shortcut for main frame's [`method: Frame.fill`].
|
1046
1248
|
def fill(selector, value, noWaitAfter: nil, timeout: nil)
|
1047
1249
|
wrap_impl(@impl.fill(unwrap_impl(selector), unwrap_impl(value), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
1048
1250
|
end
|
@@ -1070,6 +1272,10 @@ module Playwright
|
|
1070
1272
|
# frame = page.frame(name="frame-name")
|
1071
1273
|
# ```
|
1072
1274
|
#
|
1275
|
+
# ```csharp
|
1276
|
+
# var frame = page.Frame("frame-name");
|
1277
|
+
# ```
|
1278
|
+
#
|
1073
1279
|
#
|
1074
1280
|
# ```js
|
1075
1281
|
# const frame = page.frame({ url: /.*domain.*/ });
|
@@ -1082,6 +1288,10 @@ module Playwright
|
|
1082
1288
|
# ```py
|
1083
1289
|
# frame = page.frame(url=r".*domain.*")
|
1084
1290
|
# ```
|
1291
|
+
#
|
1292
|
+
# ```csharp
|
1293
|
+
# var frame = page.FrameByUrl(".*domain.*");
|
1294
|
+
# ```
|
1085
1295
|
def frame(name: nil, url: nil)
|
1086
1296
|
wrap_impl(@impl.frame(name: unwrap_impl(name), url: unwrap_impl(url)))
|
1087
1297
|
end
|
@@ -1153,8 +1363,9 @@ module Playwright
|
|
1153
1363
|
force: nil,
|
1154
1364
|
modifiers: nil,
|
1155
1365
|
position: nil,
|
1156
|
-
timeout: nil
|
1157
|
-
|
1366
|
+
timeout: nil,
|
1367
|
+
trial: nil)
|
1368
|
+
wrap_impl(@impl.hover(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
1158
1369
|
end
|
1159
1370
|
|
1160
1371
|
# Returns `element.innerHTML`.
|
@@ -1262,6 +1473,12 @@ module Playwright
|
|
1262
1473
|
# page.pdf(path="page.pdf")
|
1263
1474
|
# ```
|
1264
1475
|
#
|
1476
|
+
# ```csharp
|
1477
|
+
# // Generates a PDF with 'screen' media type
|
1478
|
+
# await page.EmulateMediaAsync(Media.Screen);
|
1479
|
+
# await page.PdfAsync("page.pdf");
|
1480
|
+
# ```
|
1481
|
+
#
|
1265
1482
|
# The `width`, `height`, and `margin` options accept values labeled with units. Unlabeled values are treated as pixels.
|
1266
1483
|
#
|
1267
1484
|
# A few examples:
|
@@ -1373,6 +1590,18 @@ module Playwright
|
|
1373
1590
|
# page.screenshot(path="o.png")
|
1374
1591
|
# browser.close()
|
1375
1592
|
# ```
|
1593
|
+
#
|
1594
|
+
# ```csharp
|
1595
|
+
# await using var browser = await playwright.Webkit.LaunchAsync(headless: false);
|
1596
|
+
# var page = await browser.NewPageAsync();
|
1597
|
+
# await page.GotoAsync("https://keycode.info");
|
1598
|
+
# await page.PressAsync("body", "A");
|
1599
|
+
# await page.ScreenshotAsync("A.png");
|
1600
|
+
# await page.PressAsync("body", "ArrowLeft");
|
1601
|
+
# await page.ScreenshotAsync("ArrowLeft.png");
|
1602
|
+
# await page.PressAsync("body", "Shift+O");
|
1603
|
+
# await page.ScreenshotAsync("O.png");
|
1604
|
+
# ```
|
1376
1605
|
def press(
|
1377
1606
|
selector,
|
1378
1607
|
key,
|
@@ -1383,7 +1612,7 @@ module Playwright
|
|
1383
1612
|
end
|
1384
1613
|
|
1385
1614
|
# The method finds an element matching the specified selector within the page. If no elements match the selector, the
|
1386
|
-
# return value resolves to `null`.
|
1615
|
+
# return value resolves to `null`. To wait for an element on the page, use [`method: Page.waitForSelector`].
|
1387
1616
|
#
|
1388
1617
|
# Shortcut for main frame's [`method: Frame.querySelector`].
|
1389
1618
|
def query_selector(selector)
|
@@ -1441,6 +1670,13 @@ module Playwright
|
|
1441
1670
|
# browser.close()
|
1442
1671
|
# ```
|
1443
1672
|
#
|
1673
|
+
# ```csharp
|
1674
|
+
# await using var browser = await playwright.Webkit.LaunchAsync();
|
1675
|
+
# var page = await browser.NewPageAsync();
|
1676
|
+
# await page.RouteAsync("**/*.{png,jpg,jpeg}", async r => await r.AbortAsync());
|
1677
|
+
# await page.GotoAsync("https://www.microsoft.com");
|
1678
|
+
# ```
|
1679
|
+
#
|
1444
1680
|
# or the same snippet using a regex pattern instead:
|
1445
1681
|
#
|
1446
1682
|
#
|
@@ -1472,6 +1708,63 @@ module Playwright
|
|
1472
1708
|
# browser.close()
|
1473
1709
|
# ```
|
1474
1710
|
#
|
1711
|
+
# ```csharp
|
1712
|
+
# await using var browser = await playwright.Webkit.LaunchAsync();
|
1713
|
+
# var page = await browser.NewPageAsync();
|
1714
|
+
# await page.RouteAsync(new Regex("(\\.png$)|(\\.jpg$)"), async r => await r.AbortAsync());
|
1715
|
+
# await page.GotoAsync("https://www.microsoft.com");
|
1716
|
+
# ```
|
1717
|
+
#
|
1718
|
+
# It is possible to examine the request to decide the route action. For example, mocking all requests that contain some
|
1719
|
+
# post data, and leaving all other requests as is:
|
1720
|
+
#
|
1721
|
+
#
|
1722
|
+
# ```js
|
1723
|
+
# await page.route('/api/**', route => {
|
1724
|
+
# if (route.request().postData().includes('my-string'))
|
1725
|
+
# route.fulfill({ body: 'mocked-data' });
|
1726
|
+
# else
|
1727
|
+
# route.continue();
|
1728
|
+
# });
|
1729
|
+
# ```
|
1730
|
+
#
|
1731
|
+
# ```java
|
1732
|
+
# page.route("/api/**", route -> {
|
1733
|
+
# if (route.request().postData().contains("my-string"))
|
1734
|
+
# route.fulfill(new Route.FulfillOptions().setBody("mocked-data"));
|
1735
|
+
# else
|
1736
|
+
# route.resume();
|
1737
|
+
# });
|
1738
|
+
# ```
|
1739
|
+
#
|
1740
|
+
# ```python async
|
1741
|
+
# def handle_route(route):
|
1742
|
+
# if ("my-string" in route.request.post_data)
|
1743
|
+
# route.fulfill(body="mocked-data")
|
1744
|
+
# else
|
1745
|
+
# route.continue_()
|
1746
|
+
# await page.route("/api/**", handle_route)
|
1747
|
+
# ```
|
1748
|
+
#
|
1749
|
+
# ```python sync
|
1750
|
+
# def handle_route(route):
|
1751
|
+
# if ("my-string" in route.request.post_data)
|
1752
|
+
# route.fulfill(body="mocked-data")
|
1753
|
+
# else
|
1754
|
+
# route.continue_()
|
1755
|
+
# page.route("/api/**", handle_route)
|
1756
|
+
# ```
|
1757
|
+
#
|
1758
|
+
# ```csharp
|
1759
|
+
# await page.RouteAsync("/api/**", async r =>
|
1760
|
+
# {
|
1761
|
+
# if (r.Request.PostData.Contains("my-string"))
|
1762
|
+
# await r.FulfillAsync(body: "mocked-data");
|
1763
|
+
# else
|
1764
|
+
# await r.ContinueAsync();
|
1765
|
+
# });
|
1766
|
+
# ```
|
1767
|
+
#
|
1475
1768
|
# Page routes take precedence over browser context routes (set up with [`method: BrowserContext.route`]) when request
|
1476
1769
|
# matches both handlers.
|
1477
1770
|
#
|
@@ -1494,12 +1787,16 @@ module Playwright
|
|
1494
1787
|
wrap_impl(@impl.screenshot(clip: unwrap_impl(clip), fullPage: unwrap_impl(fullPage), omitBackground: unwrap_impl(omitBackground), path: unwrap_impl(path), quality: unwrap_impl(quality), timeout: unwrap_impl(timeout), type: unwrap_impl(type)))
|
1495
1788
|
end
|
1496
1789
|
|
1497
|
-
#
|
1790
|
+
# This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, waits until
|
1791
|
+
# all specified options are present in the `<select>` element and selects these options.
|
1792
|
+
#
|
1793
|
+
# If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
|
1794
|
+
# `<label>` element that has an associated
|
1795
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be used instead.
|
1498
1796
|
#
|
1499
|
-
#
|
1500
|
-
# matching `selector`, the method throws an error.
|
1797
|
+
# Returns the array of option values that have been successfully selected.
|
1501
1798
|
#
|
1502
|
-
#
|
1799
|
+
# Triggers a `change` and `input` event once all the provided options have been selected.
|
1503
1800
|
#
|
1504
1801
|
#
|
1505
1802
|
# ```js
|
@@ -1541,7 +1838,16 @@ module Playwright
|
|
1541
1838
|
# page.select_option("select#colors", value=["red", "green", "blue"])
|
1542
1839
|
# ```
|
1543
1840
|
#
|
1544
|
-
#
|
1841
|
+
# ```csharp
|
1842
|
+
# // single selection matching the value
|
1843
|
+
# await page.SelectOptionAsync("select#colors", new[] { "blue" });
|
1844
|
+
# // single selection matching both the value and the label
|
1845
|
+
# await page.SelectOptionAsync("select#colors", new[] { new SelectOptionValue() { Label = "blue" } });
|
1846
|
+
# // multiple
|
1847
|
+
# await page.SelectOptionAsync("select#colors", new[] { "red", "green", "blue" });
|
1848
|
+
# ```
|
1849
|
+
#
|
1850
|
+
# Shortcut for main frame's [`method: Frame.selectOption`].
|
1545
1851
|
def select_option(
|
1546
1852
|
selector,
|
1547
1853
|
element: nil,
|
@@ -1632,6 +1938,12 @@ module Playwright
|
|
1632
1938
|
# page.set_viewport_size({"width": 640, "height": 480})
|
1633
1939
|
# page.goto("https://example.com")
|
1634
1940
|
# ```
|
1941
|
+
#
|
1942
|
+
# ```csharp
|
1943
|
+
# var page = await browser.NewPageAsync();
|
1944
|
+
# await page.SetViewportSizeAsync(640, 480);
|
1945
|
+
# await page.GotoAsync("https://www.microsoft.com");
|
1946
|
+
# ```
|
1635
1947
|
def set_viewport_size(viewportSize)
|
1636
1948
|
wrap_impl(@impl.set_viewport_size(unwrap_impl(viewportSize)))
|
1637
1949
|
end
|
@@ -1657,8 +1969,9 @@ module Playwright
|
|
1657
1969
|
modifiers: nil,
|
1658
1970
|
noWaitAfter: nil,
|
1659
1971
|
position: nil,
|
1660
|
-
timeout: nil
|
1661
|
-
|
1972
|
+
timeout: nil,
|
1973
|
+
trial: nil)
|
1974
|
+
wrap_impl(@impl.tap_point(unwrap_impl(selector), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
1662
1975
|
end
|
1663
1976
|
|
1664
1977
|
# Returns `element.textContent`.
|
@@ -1699,6 +2012,11 @@ module Playwright
|
|
1699
2012
|
# page.type("#mytextarea", "world", delay=100) # types slower, like a user
|
1700
2013
|
# ```
|
1701
2014
|
#
|
2015
|
+
# ```csharp
|
2016
|
+
# await page.TypeAsync("#mytextarea", "hello"); // types instantly
|
2017
|
+
# await page.TypeAsync("#mytextarea", "world"); // types slower, like a user
|
2018
|
+
# ```
|
2019
|
+
#
|
1702
2020
|
# Shortcut for main frame's [`method: Frame.type`].
|
1703
2021
|
def type(
|
1704
2022
|
selector,
|
@@ -1729,8 +2047,9 @@ module Playwright
|
|
1729
2047
|
force: nil,
|
1730
2048
|
noWaitAfter: nil,
|
1731
2049
|
position: nil,
|
1732
|
-
timeout: nil
|
1733
|
-
|
2050
|
+
timeout: nil,
|
2051
|
+
trial: nil)
|
2052
|
+
wrap_impl(@impl.uncheck(unwrap_impl(selector), force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
1734
2053
|
end
|
1735
2054
|
|
1736
2055
|
# Removes a route created with [`method: Page.route`]. When `handler` is not specified, removes all routes for the `url`.
|
@@ -1788,6 +2107,12 @@ module Playwright
|
|
1788
2107
|
# page.click("button")
|
1789
2108
|
# frame = event_info.value
|
1790
2109
|
# ```
|
2110
|
+
#
|
2111
|
+
# ```csharp
|
2112
|
+
# var waitTask = page.WaitForEventAsync(PageEvent.FrameNavigated);
|
2113
|
+
# await page.ClickAsync("button");
|
2114
|
+
# var frame = await waitTask;
|
2115
|
+
# ```
|
1791
2116
|
def expect_event(event, predicate: nil, timeout: nil, &block)
|
1792
2117
|
wrap_impl(@impl.expect_event(unwrap_impl(event), predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
1793
2118
|
end
|
@@ -1867,6 +2192,23 @@ module Playwright
|
|
1867
2192
|
# run(playwright)
|
1868
2193
|
# ```
|
1869
2194
|
#
|
2195
|
+
# ```csharp
|
2196
|
+
# using Microsoft.Playwright;
|
2197
|
+
# using System.Threading.Tasks;
|
2198
|
+
#
|
2199
|
+
# class FrameExamples
|
2200
|
+
# {
|
2201
|
+
# public static async Task WaitForFunction()
|
2202
|
+
# {
|
2203
|
+
# using var playwright = await Playwright.CreateAsync();
|
2204
|
+
# await using var browser = await playwright.Webkit.LaunchAsync();
|
2205
|
+
# var page = await browser.NewPageAsync();
|
2206
|
+
# await page.SetViewportSizeAsync(50, 50);
|
2207
|
+
# await page.MainFrame.WaitForFunctionAsync("window.innerWidth < 100");
|
2208
|
+
# }
|
2209
|
+
# }
|
2210
|
+
# ```
|
2211
|
+
#
|
1870
2212
|
# To pass an argument to the predicate of [`method: Page.waitForFunction`] function:
|
1871
2213
|
#
|
1872
2214
|
#
|
@@ -1890,6 +2232,11 @@ module Playwright
|
|
1890
2232
|
# page.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
1891
2233
|
# ```
|
1892
2234
|
#
|
2235
|
+
# ```csharp
|
2236
|
+
# var selector = ".foo";
|
2237
|
+
# await page.WaitForFunctionAsync("selector => !!document.querySelector(selector)", selector);
|
2238
|
+
# ```
|
2239
|
+
#
|
1893
2240
|
# Shortcut for main frame's [`method: Frame.waitForFunction`].
|
1894
2241
|
def wait_for_function(expression, arg: nil, polling: nil, timeout: nil)
|
1895
2242
|
wrap_impl(@impl.wait_for_function(unwrap_impl(expression), arg: unwrap_impl(arg), polling: unwrap_impl(polling), timeout: unwrap_impl(timeout)))
|
@@ -1921,6 +2268,11 @@ module Playwright
|
|
1921
2268
|
# page.wait_for_load_state() # the promise resolves after "load" event.
|
1922
2269
|
# ```
|
1923
2270
|
#
|
2271
|
+
# ```csharp
|
2272
|
+
# await page.ClickAsync("button"); // Click triggers navigation.
|
2273
|
+
# await page.WaitForLoadStateAsync(); // The promise resolves after 'load' event.
|
2274
|
+
# ```
|
2275
|
+
#
|
1924
2276
|
#
|
1925
2277
|
# ```js
|
1926
2278
|
# const [popup] = await Promise.all([
|
@@ -1957,6 +2309,14 @@ module Playwright
|
|
1957
2309
|
# print(popup.title()) # popup is ready to use.
|
1958
2310
|
# ```
|
1959
2311
|
#
|
2312
|
+
# ```csharp
|
2313
|
+
# var popupTask = page.WaitForPopupAsync();
|
2314
|
+
# await page.ClickAsync("button"); // click triggers the popup/
|
2315
|
+
# var popup = await popupTask;
|
2316
|
+
# await popup.WaitForLoadStateAsync(LoadState.DOMContentLoaded);
|
2317
|
+
# Console.WriteLine(await popup.TitleAsync()); // popup is ready to use.
|
2318
|
+
# ```
|
2319
|
+
#
|
1960
2320
|
# Shortcut for main frame's [`method: Frame.waitForLoadState`].
|
1961
2321
|
def wait_for_load_state(state: nil, timeout: nil)
|
1962
2322
|
wrap_impl(@impl.wait_for_load_state(state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
@@ -1997,6 +2357,12 @@ module Playwright
|
|
1997
2357
|
# # Resolves after navigation has finished
|
1998
2358
|
# ```
|
1999
2359
|
#
|
2360
|
+
# ```csharp
|
2361
|
+
# await Task.WhenAll(page.WaitForNavigationAsync(),
|
2362
|
+
# frame.ClickAsync("a.delayed-navigation")); // clicking the link will indirectly cause a navigation
|
2363
|
+
# // The method continues after navigation has finished
|
2364
|
+
# ```
|
2365
|
+
#
|
2000
2366
|
# > NOTE: Usage of the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) to change the URL is
|
2001
2367
|
# considered a navigation.
|
2002
2368
|
#
|
@@ -2012,20 +2378,41 @@ module Playwright
|
|
2012
2378
|
wrap_impl(@impl.expect_popup(predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
2013
2379
|
end
|
2014
2380
|
|
2015
|
-
# Waits for the matching request and returns it.
|
2381
|
+
# Waits for the matching request and returns it. See [waiting for event](./events.md#waiting-for-event) for more details
|
2382
|
+
# about events.
|
2016
2383
|
#
|
2017
2384
|
#
|
2018
2385
|
# ```js
|
2019
|
-
#
|
2020
|
-
#
|
2021
|
-
#
|
2386
|
+
# // Note that Promise.all prevents a race condition
|
2387
|
+
# // between clicking and waiting for the request.
|
2388
|
+
# const [request] = await Promise.all([
|
2389
|
+
# // Waits for the next request with the specified url
|
2390
|
+
# page.waitForRequest('https://example.com/resource'),
|
2391
|
+
# // Triggers the request
|
2392
|
+
# page.click('button.triggers-request'),
|
2393
|
+
# ]);
|
2394
|
+
#
|
2395
|
+
# // Alternative way with a predicate.
|
2396
|
+
# const [request] = await Promise.all([
|
2397
|
+
# // Waits for the next request matching some conditions
|
2398
|
+
# page.waitForRequest(request => request.url() === 'https://example.com' && request.method() === 'GET'),
|
2399
|
+
# // Triggers the request
|
2400
|
+
# page.click('button.triggers-request'),
|
2401
|
+
# ]);
|
2022
2402
|
# ```
|
2023
2403
|
#
|
2024
2404
|
# ```java
|
2025
|
-
#
|
2026
|
-
#
|
2027
|
-
#
|
2028
|
-
#
|
2405
|
+
# // Waits for the next response with the specified url
|
2406
|
+
# Request request = page.waitForRequest("https://example.com/resource", () -> {
|
2407
|
+
# // Triggers the request
|
2408
|
+
# page.click("button.triggers-request");
|
2409
|
+
# });
|
2410
|
+
#
|
2411
|
+
# // Waits for the next request matching some conditions
|
2412
|
+
# Request request = page.waitForRequest(request -> "https://example.com".equals(request.url()) && "GET".equals(request.method()), () -> {
|
2413
|
+
# // Triggers the request
|
2414
|
+
# page.click("button.triggers-request");
|
2415
|
+
# });
|
2029
2416
|
# ```
|
2030
2417
|
#
|
2031
2418
|
# ```python async
|
@@ -2033,6 +2420,7 @@ module Playwright
|
|
2033
2420
|
# await page.click('button')
|
2034
2421
|
# first_request = await first.value
|
2035
2422
|
#
|
2423
|
+
# # or with a lambda
|
2036
2424
|
# async with page.expect_request(lambda request: request.url == "http://example.com" and request.method == "get") as second:
|
2037
2425
|
# await page.click('img')
|
2038
2426
|
# second_request = await second.value
|
@@ -2043,11 +2431,22 @@ module Playwright
|
|
2043
2431
|
# page.click('button')
|
2044
2432
|
# first_request = first.value
|
2045
2433
|
#
|
2434
|
+
# # or with a lambda
|
2046
2435
|
# with page.expect_request(lambda request: request.url == "http://example.com" and request.method == "get") as second:
|
2047
2436
|
# page.click('img')
|
2048
2437
|
# second_request = second.value
|
2049
2438
|
# ```
|
2050
2439
|
#
|
2440
|
+
# ```csharp
|
2441
|
+
# // Waits for the next response with the specified url
|
2442
|
+
# await Task.WhenAll(page.WaitForRequestAsync("https://example.com/resource"),
|
2443
|
+
# page.ClickAsync("button.triggers-request"));
|
2444
|
+
#
|
2445
|
+
# // Waits for the next request matching some conditions
|
2446
|
+
# await Task.WhenAll(page.WaitForRequestAsync(r => "https://example.com".Equals(r.Url) && "GET" == r.Method),
|
2447
|
+
# page.ClickAsync("button.triggers-request"));
|
2448
|
+
# ```
|
2449
|
+
#
|
2051
2450
|
#
|
2052
2451
|
# ```js
|
2053
2452
|
# await page.waitForRequest(request => request.url().searchParams.get('foo') === 'bar' && request.url().searchParams.get('foo2') === 'bar2');
|
@@ -2056,19 +2455,40 @@ module Playwright
|
|
2056
2455
|
wrap_impl(@impl.expect_request(unwrap_impl(urlOrPredicate), timeout: unwrap_impl(timeout)))
|
2057
2456
|
end
|
2058
2457
|
|
2059
|
-
# Returns the matched response.
|
2458
|
+
# Returns the matched response. See [waiting for event](./events.md#waiting-for-event) for more details about events.
|
2060
2459
|
#
|
2061
2460
|
#
|
2062
2461
|
# ```js
|
2063
|
-
#
|
2064
|
-
#
|
2065
|
-
#
|
2462
|
+
# // Note that Promise.all prevents a race condition
|
2463
|
+
# // between clicking and waiting for the response.
|
2464
|
+
# const [response] = await Promise.all([
|
2465
|
+
# // Waits for the next response with the specified url
|
2466
|
+
# page.waitForResponse('https://example.com/resource'),
|
2467
|
+
# // Triggers the response
|
2468
|
+
# page.click('button.triggers-response'),
|
2469
|
+
# ]);
|
2470
|
+
#
|
2471
|
+
# // Alternative way with a predicate.
|
2472
|
+
# const [response] = await Promise.all([
|
2473
|
+
# // Waits for the next response matching some conditions
|
2474
|
+
# page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200),
|
2475
|
+
# // Triggers the response
|
2476
|
+
# page.click('button.triggers-response'),
|
2477
|
+
# ]);
|
2066
2478
|
# ```
|
2067
2479
|
#
|
2068
2480
|
# ```java
|
2069
|
-
#
|
2070
|
-
# Response
|
2071
|
-
#
|
2481
|
+
# // Waits for the next response with the specified url
|
2482
|
+
# Response response = page.waitForResponse("https://example.com/resource", () -> {
|
2483
|
+
# // Triggers the response
|
2484
|
+
# page.click("button.triggers-response");
|
2485
|
+
# });
|
2486
|
+
#
|
2487
|
+
# // Waits for the next response matching some conditions
|
2488
|
+
# Response response = page.waitForResponse(response -> "https://example.com".equals(response.url()) && response.status() == 200, () -> {
|
2489
|
+
# // Triggers the response
|
2490
|
+
# page.click("button.triggers-response");
|
2491
|
+
# });
|
2072
2492
|
# ```
|
2073
2493
|
#
|
2074
2494
|
# ```python async
|
@@ -2096,6 +2516,16 @@ module Playwright
|
|
2096
2516
|
# response = response_info.value
|
2097
2517
|
# return response.ok
|
2098
2518
|
# ```
|
2519
|
+
#
|
2520
|
+
# ```csharp
|
2521
|
+
# // Waits for the next response with the specified url
|
2522
|
+
# await Task.WhenAll(page.WaitForResponseAsync("https://example.com/resource"),
|
2523
|
+
# page.ClickAsync("button.triggers-response"));
|
2524
|
+
#
|
2525
|
+
# // Waits for the next response matching some conditions
|
2526
|
+
# await Task.WhenAll(page.WaitForResponseAsync(r => "https://example.com".Equals(r.Url) && r.Status == 200),
|
2527
|
+
# page.ClickAsync("button.triggers-response"));
|
2528
|
+
# ```
|
2099
2529
|
def expect_response(urlOrPredicate, timeout: nil)
|
2100
2530
|
wrap_impl(@impl.expect_response(unwrap_impl(urlOrPredicate), timeout: unwrap_impl(timeout)))
|
2101
2531
|
end
|
@@ -2181,6 +2611,31 @@ module Playwright
|
|
2181
2611
|
# with sync_playwright() as playwright:
|
2182
2612
|
# run(playwright)
|
2183
2613
|
# ```
|
2614
|
+
#
|
2615
|
+
# ```csharp
|
2616
|
+
# using Microsoft.Playwright;
|
2617
|
+
# using System;
|
2618
|
+
# using System.Threading.Tasks;
|
2619
|
+
#
|
2620
|
+
# class FrameExamples
|
2621
|
+
# {
|
2622
|
+
# public static async Task Images()
|
2623
|
+
# {
|
2624
|
+
# using var playwright = await Playwright.CreateAsync();
|
2625
|
+
# await using var browser = await playwright.Chromium.LaunchAsync();
|
2626
|
+
# var page = await browser.NewPageAsync();
|
2627
|
+
#
|
2628
|
+
# foreach (var currentUrl in new[] { "https://www.google.com", "https://bbc.com" })
|
2629
|
+
# {
|
2630
|
+
# await page.GotoAsync(currentUrl);
|
2631
|
+
# var element = await page.WaitForSelectorAsync("img");
|
2632
|
+
# Console.WriteLine($"Loaded image: {await element.GetAttributeAsync("src")}");
|
2633
|
+
# }
|
2634
|
+
#
|
2635
|
+
# await browser.CloseAsync();
|
2636
|
+
# }
|
2637
|
+
# }
|
2638
|
+
# ```
|
2184
2639
|
def wait_for_selector(selector, state: nil, timeout: nil)
|
2185
2640
|
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
2186
2641
|
end
|
@@ -2211,6 +2666,11 @@ module Playwright
|
|
2211
2666
|
# page.wait_for_timeout(1000)
|
2212
2667
|
# ```
|
2213
2668
|
#
|
2669
|
+
# ```csharp
|
2670
|
+
# // Wait for 1 second
|
2671
|
+
# await page.WaitForTimeoutAsync(1000);
|
2672
|
+
# ```
|
2673
|
+
#
|
2214
2674
|
# Shortcut for main frame's [`method: Frame.waitForTimeout`].
|
2215
2675
|
def wait_for_timeout(timeout)
|
2216
2676
|
raise NotImplementedError.new('wait_for_timeout is not implemented yet.')
|
@@ -2239,6 +2699,11 @@ module Playwright
|
|
2239
2699
|
# page.wait_for_url("**/target.html")
|
2240
2700
|
# ```
|
2241
2701
|
#
|
2702
|
+
# ```csharp
|
2703
|
+
# await page.ClickAsync("a.delayed-navigation"); // clicking the link will indirectly cause a navigation
|
2704
|
+
# await page.WaitForURLAsync("**/target.html");
|
2705
|
+
# ```
|
2706
|
+
#
|
2242
2707
|
# Shortcut for main frame's [`method: Frame.waitForURL`].
|
2243
2708
|
def wait_for_url(url, timeout: nil, waitUntil: nil)
|
2244
2709
|
wrap_impl(@impl.wait_for_url(unwrap_impl(url), timeout: unwrap_impl(timeout), waitUntil: unwrap_impl(waitUntil)))
|