playwright-ruby-client 0.5.10 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +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
@@ -64,8 +64,46 @@ module Playwright
|
|
64
64
|
# with sync_playwright() as playwright:
|
65
65
|
# run(playwright)
|
66
66
|
# ```
|
67
|
+
#
|
68
|
+
# ```csharp
|
69
|
+
# using Microsoft.Playwright;
|
70
|
+
# using System.Threading.Tasks;
|
71
|
+
#
|
72
|
+
# class BrowserTypeExamples
|
73
|
+
# {
|
74
|
+
# public static async Task Run()
|
75
|
+
# {
|
76
|
+
# using var playwright = await Playwright.CreateAsync();
|
77
|
+
# var chromium = playwright.Chromium;
|
78
|
+
# var browser = await chromium.LaunchAsync();
|
79
|
+
# var page = await browser.NewPageAsync();
|
80
|
+
# await page.GoToAsync("https://www.bing.com");
|
81
|
+
# // other actions
|
82
|
+
# await browser.CloseAsync();
|
83
|
+
# }
|
84
|
+
# }
|
85
|
+
# ```
|
67
86
|
class BrowserType < PlaywrightApi
|
68
87
|
|
88
|
+
# This methods attaches Playwright to an existing browser instance.
|
89
|
+
def connect(wsEndpoint, headers: nil, slowMo: nil, timeout: nil)
|
90
|
+
raise NotImplementedError.new('connect is not implemented yet.')
|
91
|
+
end
|
92
|
+
|
93
|
+
# This methods attaches Playwright to an existing browser instance using the Chrome DevTools Protocol.
|
94
|
+
#
|
95
|
+
# The default browser context is accessible via [`method: Browser.contexts`].
|
96
|
+
#
|
97
|
+
# > NOTE: Connecting over the Chrome DevTools Protocol is only supported for Chromium-based browsers.
|
98
|
+
def connect_over_cdp(
|
99
|
+
endpointURL,
|
100
|
+
headers: nil,
|
101
|
+
slowMo: nil,
|
102
|
+
timeout: nil,
|
103
|
+
&block)
|
104
|
+
wrap_impl(@impl.connect_over_cdp(unwrap_impl(endpointURL), headers: unwrap_impl(headers), slowMo: unwrap_impl(slowMo), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
105
|
+
end
|
106
|
+
|
69
107
|
# A path where Playwright expects to find a bundled browser executable.
|
70
108
|
def executable_path
|
71
109
|
wrap_impl(@impl.executable_path)
|
@@ -100,6 +138,10 @@ module Playwright
|
|
100
138
|
# )
|
101
139
|
# ```
|
102
140
|
#
|
141
|
+
# ```csharp
|
142
|
+
# var browser = await playwright.Chromium.LaunchAsync(ignoreDefaultArgs: new[] { "--mute-audio" })
|
143
|
+
# ```
|
144
|
+
#
|
103
145
|
# > **Chromium-only** Playwright can also be used to control the Google Chrome or Microsoft Edge browsers, but it works
|
104
146
|
# best with the version of Chromium it is bundled with. There is no guarantee it will work with any other version. Use
|
105
147
|
# `executablePath` option with extreme caution.
|
@@ -131,8 +173,9 @@ module Playwright
|
|
131
173
|
proxy: nil,
|
132
174
|
slowMo: nil,
|
133
175
|
timeout: nil,
|
176
|
+
traceDir: nil,
|
134
177
|
&block)
|
135
|
-
wrap_impl(@impl.launch(args: unwrap_impl(args), channel: unwrap_impl(channel), chromiumSandbox: unwrap_impl(chromiumSandbox), devtools: unwrap_impl(devtools), downloadsPath: unwrap_impl(downloadsPath), env: unwrap_impl(env), executablePath: unwrap_impl(executablePath), firefoxUserPrefs: unwrap_impl(firefoxUserPrefs), handleSIGHUP: unwrap_impl(handleSIGHUP), handleSIGINT: unwrap_impl(handleSIGINT), handleSIGTERM: unwrap_impl(handleSIGTERM), headless: unwrap_impl(headless), ignoreDefaultArgs: unwrap_impl(ignoreDefaultArgs), proxy: unwrap_impl(proxy), slowMo: unwrap_impl(slowMo), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
178
|
+
wrap_impl(@impl.launch(args: unwrap_impl(args), channel: unwrap_impl(channel), chromiumSandbox: unwrap_impl(chromiumSandbox), devtools: unwrap_impl(devtools), downloadsPath: unwrap_impl(downloadsPath), env: unwrap_impl(env), executablePath: unwrap_impl(executablePath), firefoxUserPrefs: unwrap_impl(firefoxUserPrefs), handleSIGHUP: unwrap_impl(handleSIGHUP), handleSIGINT: unwrap_impl(handleSIGINT), handleSIGTERM: unwrap_impl(handleSIGTERM), headless: unwrap_impl(headless), ignoreDefaultArgs: unwrap_impl(ignoreDefaultArgs), proxy: unwrap_impl(proxy), slowMo: unwrap_impl(slowMo), timeout: unwrap_impl(timeout), traceDir: unwrap_impl(traceDir), &wrap_block_call(block)))
|
136
179
|
end
|
137
180
|
|
138
181
|
# Returns the persistent browser context instance.
|
@@ -177,6 +220,7 @@ module Playwright
|
|
177
220
|
slowMo: nil,
|
178
221
|
timeout: nil,
|
179
222
|
timezoneId: nil,
|
223
|
+
traceDir: nil,
|
180
224
|
userAgent: nil,
|
181
225
|
viewport: nil)
|
182
226
|
raise NotImplementedError.new('launch_persistent_context is not implemented yet.')
|
@@ -187,11 +231,6 @@ module Playwright
|
|
187
231
|
wrap_impl(@impl.name)
|
188
232
|
end
|
189
233
|
|
190
|
-
# @nodoc
|
191
|
-
def connect_over_cdp(endpointURL, slowMo: nil, timeout: nil, &block)
|
192
|
-
wrap_impl(@impl.connect_over_cdp(unwrap_impl(endpointURL), slowMo: unwrap_impl(slowMo), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
|
193
|
-
end
|
194
|
-
|
195
234
|
# -- inherited from EventEmitter --
|
196
235
|
# @nodoc
|
197
236
|
def off(event, callback)
|
@@ -2,6 +2,7 @@ module Playwright
|
|
2
2
|
# `ConsoleMessage` objects are dispatched by page via the [`event: Page.console`] event.
|
3
3
|
class ConsoleMessage < PlaywrightApi
|
4
4
|
|
5
|
+
# List of arguments passed to a `console` function call. See also [`event: Page.console`].
|
5
6
|
def args
|
6
7
|
wrap_impl(@impl.args)
|
7
8
|
end
|
@@ -10,6 +11,7 @@ module Playwright
|
|
10
11
|
wrap_impl(@impl.location)
|
11
12
|
end
|
12
13
|
|
14
|
+
# The text of the console message.
|
13
15
|
def text
|
14
16
|
wrap_impl(@impl.text)
|
15
17
|
end
|
@@ -80,6 +80,29 @@ module Playwright
|
|
80
80
|
# run(playwright)
|
81
81
|
# ```
|
82
82
|
#
|
83
|
+
# ```csharp
|
84
|
+
# using Microsoft.Playwright;
|
85
|
+
# using System.Threading.Tasks;
|
86
|
+
#
|
87
|
+
# class DialogExample
|
88
|
+
# {
|
89
|
+
# public static async Task Run()
|
90
|
+
# {
|
91
|
+
# using var playwright = await Playwright.CreateAsync();
|
92
|
+
# await using var browser = await playwright.Chromium.LaunchAsync();
|
93
|
+
# var page = await browser.NewPageAsync();
|
94
|
+
#
|
95
|
+
# page.Dialog += async (_, dialog) =>
|
96
|
+
# {
|
97
|
+
# System.Console.WriteLine(dialog.Message);
|
98
|
+
# await dialog.DismissAsync();
|
99
|
+
# };
|
100
|
+
#
|
101
|
+
# await page.EvaluateAsync("alert('1');");
|
102
|
+
# }
|
103
|
+
# }
|
104
|
+
# ```
|
105
|
+
#
|
83
106
|
# > NOTE: Dialogs are dismissed automatically, unless there is a [`event: Page.dialog`] listener. When listener is
|
84
107
|
# present, it **must** either [`method: Dialog.accept`] or [`method: Dialog.dismiss`] the dialog - otherwise the page will
|
85
108
|
# [freeze](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#never_blocking) waiting for the dialog, and
|
@@ -73,6 +73,24 @@ module Playwright
|
|
73
73
|
# run(playwright)
|
74
74
|
# ```
|
75
75
|
#
|
76
|
+
# ```csharp
|
77
|
+
# using Microsoft.Playwright;
|
78
|
+
# using System.Threading.Tasks;
|
79
|
+
#
|
80
|
+
# class HandleExamples
|
81
|
+
# {
|
82
|
+
# public static async Task Run()
|
83
|
+
# {
|
84
|
+
# using var playwright = await Playwright.CreateAsync();
|
85
|
+
# var browser = await playwright.Chromium.LaunchAsync(headless: false);
|
86
|
+
# var page = await browser.NewPageAsync();
|
87
|
+
# await page.GotoAsync("https://www.bing.com");
|
88
|
+
# var handle = await page.QuerySelectorAsync("a");
|
89
|
+
# await handle.ClickAsync();
|
90
|
+
# }
|
91
|
+
# }
|
92
|
+
# ```
|
93
|
+
#
|
76
94
|
# ElementHandle prevents DOM element from garbage collection unless the handle is disposed with
|
77
95
|
# [`method: JSHandle.dispose`]. ElementHandles are auto-disposed when their origin frame gets navigated.
|
78
96
|
#
|
@@ -113,6 +131,11 @@ module Playwright
|
|
113
131
|
# box = element_handle.bounding_box()
|
114
132
|
# page.mouse.click(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
|
115
133
|
# ```
|
134
|
+
#
|
135
|
+
# ```csharp
|
136
|
+
# var box = await elementHandle.BoundingBoxAsync();
|
137
|
+
# await page.Mouse.ClickAsync(box.X + box.Width / 2, box.Y + box.Height / 2);
|
138
|
+
# ```
|
116
139
|
def bounding_box
|
117
140
|
wrap_impl(@impl.bounding_box)
|
118
141
|
end
|
@@ -130,8 +153,13 @@ module Playwright
|
|
130
153
|
#
|
131
154
|
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
132
155
|
# zero timeout disables this.
|
133
|
-
def check(
|
134
|
-
|
156
|
+
def check(
|
157
|
+
force: nil,
|
158
|
+
noWaitAfter: nil,
|
159
|
+
position: nil,
|
160
|
+
timeout: nil,
|
161
|
+
trial: nil)
|
162
|
+
wrap_impl(@impl.check(force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
135
163
|
end
|
136
164
|
|
137
165
|
# This method clicks the element by performing the following steps:
|
@@ -152,8 +180,9 @@ module Playwright
|
|
152
180
|
modifiers: nil,
|
153
181
|
noWaitAfter: nil,
|
154
182
|
position: nil,
|
155
|
-
timeout: nil
|
156
|
-
|
183
|
+
timeout: nil,
|
184
|
+
trial: nil)
|
185
|
+
wrap_impl(@impl.click(button: unwrap_impl(button), clickCount: unwrap_impl(clickCount), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
157
186
|
end
|
158
187
|
|
159
188
|
# Returns the content frame for element handles referencing iframe nodes, or `null` otherwise
|
@@ -181,8 +210,9 @@ module Playwright
|
|
181
210
|
modifiers: nil,
|
182
211
|
noWaitAfter: nil,
|
183
212
|
position: nil,
|
184
|
-
timeout: nil
|
185
|
-
|
213
|
+
timeout: nil,
|
214
|
+
trial: nil)
|
215
|
+
wrap_impl(@impl.dblclick(button: unwrap_impl(button), delay: unwrap_impl(delay), force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
186
216
|
end
|
187
217
|
|
188
218
|
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
@@ -206,6 +236,10 @@ module Playwright
|
|
206
236
|
# element_handle.dispatch_event("click")
|
207
237
|
# ```
|
208
238
|
#
|
239
|
+
# ```csharp
|
240
|
+
# await elementHandle.DispatchEventAsync("click");
|
241
|
+
# ```
|
242
|
+
#
|
209
243
|
# Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
210
244
|
# and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
211
245
|
#
|
@@ -246,6 +280,14 @@ module Playwright
|
|
246
280
|
# data_transfer = page.evaluate_handle("new DataTransfer()")
|
247
281
|
# element_handle.dispatch_event("#source", "dragstart", {"dataTransfer": data_transfer})
|
248
282
|
# ```
|
283
|
+
#
|
284
|
+
# ```csharp
|
285
|
+
# var handle = await page.EvaluateHandleAsync("() => new DataTransfer()");
|
286
|
+
# await handle.AsElement.DispatchEventAsync("dragstart", new Dictionary<string, object>
|
287
|
+
# {
|
288
|
+
# { "dataTransfer", dataTransfer }
|
289
|
+
# });
|
290
|
+
# ```
|
249
291
|
def dispatch_event(type, eventInit: nil)
|
250
292
|
wrap_impl(@impl.dispatch_event(unwrap_impl(type), eventInit: unwrap_impl(eventInit)))
|
251
293
|
end
|
@@ -285,6 +327,12 @@ module Playwright
|
|
285
327
|
# assert tweet_handle.eval_on_selector(".like", "node => node.innerText") == "100"
|
286
328
|
# assert tweet_handle.eval_on_selector(".retweets", "node => node.innerText") = "10"
|
287
329
|
# ```
|
330
|
+
#
|
331
|
+
# ```csharp
|
332
|
+
# var tweetHandle = await page.QuerySelectorAsync(".tweet");
|
333
|
+
# Assert.Equals("100", await tweetHandle.EvalOnSelectorAsync(".like", "node => node.innerText"));
|
334
|
+
# Assert.Equals("10", await tweetHandle.EvalOnSelectorAsync(".retweets", "node => node.innerText"));
|
335
|
+
# ```
|
288
336
|
def eval_on_selector(selector, expression, arg: nil)
|
289
337
|
wrap_impl(@impl.eval_on_selector(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
290
338
|
end
|
@@ -326,15 +374,24 @@ module Playwright
|
|
326
374
|
# feed_handle = page.query_selector(".feed")
|
327
375
|
# assert feed_handle.eval_on_selector_all(".tweet", "nodes => nodes.map(n => n.innerText)") == ["hello!", "hi!"]
|
328
376
|
# ```
|
377
|
+
#
|
378
|
+
# ```csharp
|
379
|
+
# var feedHandle = await page.QuerySelectorAsync(".feed");
|
380
|
+
# Assert.Equals(new [] { "Hello!", "Hi!" }, await feedHandle.EvalOnSelectorAllAsync<string[]>(".tweet", "nodes => nodes.map(n => n.innerText)"));
|
381
|
+
# ```
|
329
382
|
def eval_on_selector_all(selector, expression, arg: nil)
|
330
383
|
wrap_impl(@impl.eval_on_selector_all(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
331
384
|
end
|
332
385
|
|
333
386
|
# This method waits for [actionability](./actionability.md) checks, focuses the element, fills it and triggers an `input`
|
334
|
-
# event after filling.
|
335
|
-
#
|
336
|
-
#
|
337
|
-
#
|
387
|
+
# event after filling. Note that you can pass an empty string to clear the input field.
|
388
|
+
#
|
389
|
+
# If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error.
|
390
|
+
# However, if the element is inside the `<label>` element that has an associated
|
391
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled
|
392
|
+
# instead.
|
393
|
+
#
|
394
|
+
# To send fine-grained keyboard events, use [`method: ElementHandle.type`].
|
338
395
|
def fill(value, noWaitAfter: nil, timeout: nil)
|
339
396
|
wrap_impl(@impl.fill(unwrap_impl(value), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
340
397
|
end
|
@@ -360,8 +417,13 @@ module Playwright
|
|
360
417
|
#
|
361
418
|
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
362
419
|
# zero timeout disables this.
|
363
|
-
def hover(
|
364
|
-
|
420
|
+
def hover(
|
421
|
+
force: nil,
|
422
|
+
modifiers: nil,
|
423
|
+
position: nil,
|
424
|
+
timeout: nil,
|
425
|
+
trial: nil)
|
426
|
+
wrap_impl(@impl.hover(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
365
427
|
end
|
366
428
|
|
367
429
|
# Returns the `element.innerHTML`.
|
@@ -466,12 +528,16 @@ module Playwright
|
|
466
528
|
wrap_impl(@impl.scroll_into_view_if_needed(timeout: unwrap_impl(timeout)))
|
467
529
|
end
|
468
530
|
|
469
|
-
#
|
531
|
+
# This method waits for [actionability](./actionability.md) checks, waits until all specified options are present in the
|
532
|
+
# `<select>` element and selects these options.
|
533
|
+
#
|
534
|
+
# If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
|
535
|
+
# `<label>` element that has an associated
|
536
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be used instead.
|
470
537
|
#
|
471
|
-
#
|
472
|
-
# element, the method throws an error.
|
538
|
+
# Returns the array of option values that have been successfully selected.
|
473
539
|
#
|
474
|
-
#
|
540
|
+
# Triggers a `change` and `input` event once all the provided options have been selected.
|
475
541
|
#
|
476
542
|
#
|
477
543
|
# ```js
|
@@ -522,6 +588,20 @@ module Playwright
|
|
522
588
|
# # multiple selection for blue, red and second option
|
523
589
|
# handle.select_option(value="blue", { index: 2 }, "red")
|
524
590
|
# ```
|
591
|
+
#
|
592
|
+
# ```csharp
|
593
|
+
# // single selection matching the value
|
594
|
+
# await handle.SelectOptionAsync(new[] { "blue" });
|
595
|
+
# // single selection matching the label
|
596
|
+
# await handle.SelectOptionAsync(new[] { new SelectOptionValue() { Label = "blue" } });
|
597
|
+
# // multiple selection
|
598
|
+
# await handle.SelectOptionAsync(new[] { "red", "green", "blue" });
|
599
|
+
# // multiple selection for blue, red and second option
|
600
|
+
# await handle.SelectOptionAsync(new[] {
|
601
|
+
# new SelectOptionValue() { Label = "blue" },
|
602
|
+
# new SelectOptionValue() { Index = 2 },
|
603
|
+
# new SelectOptionValue() { Value = "red" }});
|
604
|
+
# ```
|
525
605
|
def select_option(
|
526
606
|
element: nil,
|
527
607
|
index: nil,
|
@@ -565,8 +645,9 @@ module Playwright
|
|
565
645
|
modifiers: nil,
|
566
646
|
noWaitAfter: nil,
|
567
647
|
position: nil,
|
568
|
-
timeout: nil
|
569
|
-
|
648
|
+
timeout: nil,
|
649
|
+
trial: nil)
|
650
|
+
wrap_impl(@impl.tap_point(force: unwrap_impl(force), modifiers: unwrap_impl(modifiers), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
570
651
|
end
|
571
652
|
|
572
653
|
# Returns the `node.textContent`.
|
@@ -599,6 +680,11 @@ module Playwright
|
|
599
680
|
# element_handle.type("world", delay=100) # types slower, like a user
|
600
681
|
# ```
|
601
682
|
#
|
683
|
+
# ```csharp
|
684
|
+
# await elementHandle.TypeAsync("Hello"); // Types instantly
|
685
|
+
# await elementHandle.TypeAsync("World", delay: 100); // Types slower, like a user
|
686
|
+
# ```
|
687
|
+
#
|
602
688
|
# An example of typing into a text field and then submitting the form:
|
603
689
|
#
|
604
690
|
#
|
@@ -625,6 +711,12 @@ module Playwright
|
|
625
711
|
# element_handle.type("some text")
|
626
712
|
# element_handle.press("Enter")
|
627
713
|
# ```
|
714
|
+
#
|
715
|
+
# ```csharp
|
716
|
+
# var elementHandle = await page.QuerySelectorAsync("input");
|
717
|
+
# await elementHandle.TypeAsync("some text");
|
718
|
+
# await elementHandle.PressAsync("Enter");
|
719
|
+
# ```
|
628
720
|
def type(text, delay: nil, noWaitAfter: nil, timeout: nil)
|
629
721
|
wrap_impl(@impl.type(unwrap_impl(text), delay: unwrap_impl(delay), noWaitAfter: unwrap_impl(noWaitAfter), timeout: unwrap_impl(timeout)))
|
630
722
|
end
|
@@ -642,8 +734,13 @@ module Playwright
|
|
642
734
|
#
|
643
735
|
# When all steps combined have not finished during the specified `timeout`, this method throws a `TimeoutError`. Passing
|
644
736
|
# zero timeout disables this.
|
645
|
-
def uncheck(
|
646
|
-
|
737
|
+
def uncheck(
|
738
|
+
force: nil,
|
739
|
+
noWaitAfter: nil,
|
740
|
+
position: nil,
|
741
|
+
timeout: nil,
|
742
|
+
trial: nil)
|
743
|
+
wrap_impl(@impl.uncheck(force: unwrap_impl(force), noWaitAfter: unwrap_impl(noWaitAfter), position: unwrap_impl(position), timeout: unwrap_impl(timeout), trial: unwrap_impl(trial)))
|
647
744
|
end
|
648
745
|
|
649
746
|
# Returns when the element satisfies the `state`.
|
@@ -702,6 +799,13 @@ module Playwright
|
|
702
799
|
# span = div.wait_for_selector("span", state="attached")
|
703
800
|
# ```
|
704
801
|
#
|
802
|
+
# ```csharp
|
803
|
+
# await page.SetContentAsync("<div><span></span></div>");
|
804
|
+
# var div = await page.QuerySelectorAsync("div");
|
805
|
+
# // Waiting for the "span" selector relative to the div.
|
806
|
+
# var span = await page.WaitForSelectorAsync("span", WaitForSelectorState.Attached);
|
807
|
+
# ```
|
808
|
+
#
|
705
809
|
# > NOTE: This method does not work across navigations, use [`method: Page.waitForSelector`] instead.
|
706
810
|
def wait_for_selector(selector, state: nil, timeout: nil)
|
707
811
|
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
@@ -28,6 +28,13 @@ module Playwright
|
|
28
28
|
# file_chooser = fc_info.value
|
29
29
|
# file_chooser.set_files("myfile.pdf")
|
30
30
|
# ```
|
31
|
+
#
|
32
|
+
# ```csharp
|
33
|
+
# var waitForFileChooserTask = page.WaitForFileChooserAsync();
|
34
|
+
# await page.ClickAsync("upload");
|
35
|
+
# var fileChooser = await waitForFileChooserTask;
|
36
|
+
# await fileChooser.SetFilesAsync("temp.txt");
|
37
|
+
# ```
|
31
38
|
class FileChooser < PlaywrightApi
|
32
39
|
|
33
40
|
# Returns input element associated with this file chooser.
|
data/lib/playwright_api/frame.rb
CHANGED
@@ -96,6 +96,32 @@ module Playwright
|
|
96
96
|
# with sync_playwright() as playwright:
|
97
97
|
# run(playwright)
|
98
98
|
# ```
|
99
|
+
#
|
100
|
+
# ```csharp
|
101
|
+
# using Microsoft.Playwright;
|
102
|
+
# using System;
|
103
|
+
# using System.Threading.Tasks;
|
104
|
+
#
|
105
|
+
# class FrameExamples
|
106
|
+
# {
|
107
|
+
# public static async Task Main()
|
108
|
+
# {
|
109
|
+
# using var playwright = await Playwright.CreateAsync();
|
110
|
+
# await using var browser = await playwright.Firefox.LaunchAsync();
|
111
|
+
# var page = await browser.NewPageAsync();
|
112
|
+
#
|
113
|
+
# await page.GotoAsync("https://www.bing.com");
|
114
|
+
# DumpFrameTree(page.MainFrame, string.Empty);
|
115
|
+
# }
|
116
|
+
#
|
117
|
+
# private static void DumpFrameTree(IFrame frame, string indent)
|
118
|
+
# {
|
119
|
+
# Console.WriteLine($"{indent}{frame.Url}");
|
120
|
+
# foreach (var child in frame.ChildFrames)
|
121
|
+
# DumpFrameTree(child, indent + " ");
|
122
|
+
# }
|
123
|
+
# }
|
124
|
+
# ```
|
99
125
|
class Frame < PlaywrightApi
|
100
126
|
|
101
127
|
# Returns the added tag when the script's onload fires or when the script content was injected into frame.
|
@@ -131,8 +157,9 @@ module Playwright
|
|
131
157
|
force: nil,
|
132
158
|
noWaitAfter: nil,
|
133
159
|
position: nil,
|
134
|
-
timeout: nil
|
135
|
-
|
160
|
+
timeout: nil,
|
161
|
+
trial: nil)
|
162
|
+
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)))
|
136
163
|
end
|
137
164
|
|
138
165
|
def child_frames
|
@@ -158,8 +185,9 @@ module Playwright
|
|
158
185
|
modifiers: nil,
|
159
186
|
noWaitAfter: nil,
|
160
187
|
position: nil,
|
161
|
-
timeout: nil
|
162
|
-
|
188
|
+
timeout: nil,
|
189
|
+
trial: nil)
|
190
|
+
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)))
|
163
191
|
end
|
164
192
|
|
165
193
|
# Gets the full HTML contents of the frame, including the doctype.
|
@@ -188,8 +216,9 @@ module Playwright
|
|
188
216
|
modifiers: nil,
|
189
217
|
noWaitAfter: nil,
|
190
218
|
position: nil,
|
191
|
-
timeout: nil
|
192
|
-
|
219
|
+
timeout: nil,
|
220
|
+
trial: nil)
|
221
|
+
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)))
|
193
222
|
end
|
194
223
|
|
195
224
|
# The snippet below dispatches the `click` event on the element. Regardless of the visibility state of the element,
|
@@ -213,6 +242,10 @@ module Playwright
|
|
213
242
|
# frame.dispatch_event("button#submit", "click")
|
214
243
|
# ```
|
215
244
|
#
|
245
|
+
# ```csharp
|
246
|
+
# await frame.DispatchEventAsync("button#submit", "click");
|
247
|
+
# ```
|
248
|
+
#
|
216
249
|
# Under the hood, it creates an instance of an event based on the given `type`, initializes it with `eventInit` properties
|
217
250
|
# and dispatches it on the element. Events are `composed`, `cancelable` and bubble by default.
|
218
251
|
#
|
@@ -253,6 +286,12 @@ module Playwright
|
|
253
286
|
# data_transfer = frame.evaluate_handle("new DataTransfer()")
|
254
287
|
# frame.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
|
255
288
|
# ```
|
289
|
+
#
|
290
|
+
# ```csharp
|
291
|
+
# // Note you can only create DataTransfer in Chromium and Firefox
|
292
|
+
# var dataTransfer = await frame.EvaluateHandleAsync("() => new DataTransfer()");
|
293
|
+
# await frame.DispatchEventAsync("#source", "dragstart", new { dataTransfer });
|
294
|
+
# ```
|
256
295
|
def dispatch_event(selector, type, eventInit: nil, timeout: nil)
|
257
296
|
wrap_impl(@impl.dispatch_event(unwrap_impl(selector), unwrap_impl(type), eventInit: unwrap_impl(eventInit), timeout: unwrap_impl(timeout)))
|
258
297
|
end
|
@@ -292,6 +331,12 @@ module Playwright
|
|
292
331
|
# preload_href = frame.eval_on_selector("link[rel=preload]", "el => el.href")
|
293
332
|
# html = frame.eval_on_selector(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello")
|
294
333
|
# ```
|
334
|
+
#
|
335
|
+
# ```csharp
|
336
|
+
# var searchValue = await frame.EvalOnSelectorAsync<string>("#search", "el => el.value");
|
337
|
+
# var preloadHref = await frame.EvalOnSelectorAsync<string>("link[rel=preload]", "el => el.href");
|
338
|
+
# var html = await frame.EvalOnSelectorAsync(".main-container", "(e, suffix) => e.outerHTML + suffix", "hello");
|
339
|
+
# ```
|
295
340
|
def eval_on_selector(selector, expression, arg: nil)
|
296
341
|
wrap_impl(@impl.eval_on_selector(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
297
342
|
end
|
@@ -322,6 +367,10 @@ module Playwright
|
|
322
367
|
# ```python sync
|
323
368
|
# divs_counts = frame.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
|
324
369
|
# ```
|
370
|
+
#
|
371
|
+
# ```csharp
|
372
|
+
# var divsCount = await frame.EvalOnSelectorAllAsync<bool>("div", "(divs, min) => divs.length >= min", 10);
|
373
|
+
# ```
|
325
374
|
def eval_on_selector_all(selector, expression, arg: nil)
|
326
375
|
wrap_impl(@impl.eval_on_selector_all(unwrap_impl(selector), unwrap_impl(expression), arg: unwrap_impl(arg)))
|
327
376
|
end
|
@@ -360,6 +409,11 @@ module Playwright
|
|
360
409
|
# print(result) # prints "56"
|
361
410
|
# ```
|
362
411
|
#
|
412
|
+
# ```csharp
|
413
|
+
# var result = await frame.EvaluateAsync<int>("([x, y]) => Promise.resolve(x * y)", new[] { 7, 8 });
|
414
|
+
# Console.WriteLine(result);
|
415
|
+
# ```
|
416
|
+
#
|
363
417
|
# A string can also be passed in instead of a function.
|
364
418
|
#
|
365
419
|
#
|
@@ -383,6 +437,10 @@ module Playwright
|
|
383
437
|
# print(frame.evaluate(f"1 + {x}")) # prints "11"
|
384
438
|
# ```
|
385
439
|
#
|
440
|
+
# ```csharp
|
441
|
+
# Console.WriteLine(await frame.EvaluateAsync<int>("1 + 2")); // prints "3"
|
442
|
+
# ```
|
443
|
+
#
|
386
444
|
# `ElementHandle` instances can be passed as an argument to the [`method: Frame.evaluate`]:
|
387
445
|
#
|
388
446
|
#
|
@@ -409,6 +467,12 @@ module Playwright
|
|
409
467
|
# html = frame.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
|
410
468
|
# body_handle.dispose()
|
411
469
|
# ```
|
470
|
+
#
|
471
|
+
# ```csharp
|
472
|
+
# var bodyHandle = await frame.QuerySelectorAsync("body");
|
473
|
+
# var html = await frame.EvaluateAsync<string>("([body, suffix]) => body.innerHTML + suffix", new object [] { bodyHandle, "hello" });
|
474
|
+
# await bodyHandle.DisposeAsync();
|
475
|
+
# ```
|
412
476
|
def evaluate(expression, arg: nil)
|
413
477
|
wrap_impl(@impl.evaluate(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
414
478
|
end
|
@@ -442,6 +506,11 @@ module Playwright
|
|
442
506
|
# a_window_handle # handle for the window object.
|
443
507
|
# ```
|
444
508
|
#
|
509
|
+
# ```csharp
|
510
|
+
# // Handle for the window object.
|
511
|
+
# var aWindowHandle = await frame.EvaluateHandleAsync("() => Promise.resolve(window)");
|
512
|
+
# ```
|
513
|
+
#
|
445
514
|
# A string can also be passed in instead of a function.
|
446
515
|
#
|
447
516
|
#
|
@@ -461,6 +530,10 @@ module Playwright
|
|
461
530
|
# a_handle = page.evaluate_handle("document") # handle for the "document"
|
462
531
|
# ```
|
463
532
|
#
|
533
|
+
# ```csharp
|
534
|
+
# var docHandle = await frame.EvalueHandleAsync("document"); // Handle for the `document`
|
535
|
+
# ```
|
536
|
+
#
|
464
537
|
# `JSHandle` instances can be passed as an argument to the [`method: Frame.evaluateHandle`]:
|
465
538
|
#
|
466
539
|
#
|
@@ -491,15 +564,25 @@ module Playwright
|
|
491
564
|
# print(result_handle.json_value())
|
492
565
|
# result_handle.dispose()
|
493
566
|
# ```
|
567
|
+
#
|
568
|
+
# ```csharp
|
569
|
+
# var handle = await frame.EvaluateHandleAsync("() => document.body");
|
570
|
+
# var resultHandle = await frame.EvaluateHandleAsync("([body, suffix]) => body.innerHTML + suffix", new object[] { handle, "hello" });
|
571
|
+
# Console.WriteLine(await resultHandle.JsonValueAsync<string>());
|
572
|
+
# await resultHandle.DisposeAsync();
|
573
|
+
# ```
|
494
574
|
def evaluate_handle(expression, arg: nil)
|
495
575
|
wrap_impl(@impl.evaluate_handle(unwrap_impl(expression), arg: unwrap_impl(arg)))
|
496
576
|
end
|
497
577
|
|
498
578
|
# This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, focuses the
|
499
|
-
# element, fills it and triggers an `input` event after filling.
|
500
|
-
#
|
501
|
-
#
|
502
|
-
#
|
579
|
+
# element, fills it and triggers an `input` event after filling. Note that you can pass an empty string to clear the input
|
580
|
+
# field.
|
581
|
+
#
|
582
|
+
# If the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error.
|
583
|
+
# However, if the element is inside the `<label>` element that has an associated
|
584
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled
|
585
|
+
# instead.
|
503
586
|
#
|
504
587
|
# To send fine-grained keyboard events, use [`method: Frame.type`].
|
505
588
|
def fill(selector, value, noWaitAfter: nil, timeout: nil)
|
@@ -543,6 +626,12 @@ module Playwright
|
|
543
626
|
# content_frame = frame_element.content_frame()
|
544
627
|
# assert frame == content_frame
|
545
628
|
# ```
|
629
|
+
#
|
630
|
+
# ```csharp
|
631
|
+
# var frameElement = await frame.FrameElementAsync();
|
632
|
+
# var contentFrame = await frameElement.ContentFrameAsync();
|
633
|
+
# Console.WriteLine(frame == contentFrame); // -> True
|
634
|
+
# ```
|
546
635
|
def frame_element
|
547
636
|
wrap_impl(@impl.frame_element)
|
548
637
|
end
|
@@ -589,8 +678,9 @@ module Playwright
|
|
589
678
|
force: nil,
|
590
679
|
modifiers: nil,
|
591
680
|
position: nil,
|
592
|
-
timeout: nil
|
593
|
-
|
681
|
+
timeout: nil,
|
682
|
+
trial: nil)
|
683
|
+
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)))
|
594
684
|
end
|
595
685
|
|
596
686
|
# Returns `element.innerHTML`.
|
@@ -700,12 +790,16 @@ module Playwright
|
|
700
790
|
wrap_impl(@impl.query_selector_all(unwrap_impl(selector)))
|
701
791
|
end
|
702
792
|
|
703
|
-
#
|
793
|
+
# This method waits for an element matching `selector`, waits for [actionability](./actionability.md) checks, waits until
|
794
|
+
# all specified options are present in the `<select>` element and selects these options.
|
704
795
|
#
|
705
|
-
#
|
706
|
-
#
|
796
|
+
# If the target element is not a `<select>` element, this method throws an error. However, if the element is inside the
|
797
|
+
# `<label>` element that has an associated
|
798
|
+
# [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be used instead.
|
707
799
|
#
|
708
|
-
#
|
800
|
+
# Returns the array of option values that have been successfully selected.
|
801
|
+
#
|
802
|
+
# Triggers a `change` and `input` event once all the provided options have been selected.
|
709
803
|
#
|
710
804
|
#
|
711
805
|
# ```js
|
@@ -745,6 +839,15 @@ module Playwright
|
|
745
839
|
# # multiple selection
|
746
840
|
# frame.select_option("select#colors", value=["red", "green", "blue"])
|
747
841
|
# ```
|
842
|
+
#
|
843
|
+
# ```csharp
|
844
|
+
# // single selection matching the value
|
845
|
+
# await frame.SelectOptionAsync("select#colors", new[] { "blue" });
|
846
|
+
# // single selection matching both the value and the label
|
847
|
+
# await frame.SelectOptionAsync("select#colors", new[] { new SelectOptionValue() { Label = "blue" } });
|
848
|
+
# // multiple selection
|
849
|
+
# await frame.SelectOptionAsync("select#colors", new[] { "red", "green", "blue" });
|
850
|
+
# ```
|
748
851
|
def select_option(
|
749
852
|
selector,
|
750
853
|
element: nil,
|
@@ -788,8 +891,9 @@ module Playwright
|
|
788
891
|
modifiers: nil,
|
789
892
|
noWaitAfter: nil,
|
790
893
|
position: nil,
|
791
|
-
timeout: nil
|
792
|
-
|
894
|
+
timeout: nil,
|
895
|
+
trial: nil)
|
896
|
+
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)))
|
793
897
|
end
|
794
898
|
|
795
899
|
# Returns `element.textContent`.
|
@@ -829,6 +933,11 @@ module Playwright
|
|
829
933
|
# frame.type("#mytextarea", "hello") # types instantly
|
830
934
|
# frame.type("#mytextarea", "world", delay=100) # types slower, like a user
|
831
935
|
# ```
|
936
|
+
#
|
937
|
+
# ```csharp
|
938
|
+
# await frame.TypeAsync("#mytextarea", "hello"); // types instantly
|
939
|
+
# await frame.TypeAsync("#mytextarea", "world", delay: 100); // types slower, like a user
|
940
|
+
# ```
|
832
941
|
def type(
|
833
942
|
selector,
|
834
943
|
text,
|
@@ -856,8 +965,9 @@ module Playwright
|
|
856
965
|
force: nil,
|
857
966
|
noWaitAfter: nil,
|
858
967
|
position: nil,
|
859
|
-
timeout: nil
|
860
|
-
|
968
|
+
timeout: nil,
|
969
|
+
trial: nil)
|
970
|
+
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)))
|
861
971
|
end
|
862
972
|
|
863
973
|
# Returns frame's url.
|
@@ -933,6 +1043,23 @@ module Playwright
|
|
933
1043
|
# run(playwright)
|
934
1044
|
# ```
|
935
1045
|
#
|
1046
|
+
# ```csharp
|
1047
|
+
# using Microsoft.Playwright;
|
1048
|
+
# using System.Threading.Tasks;
|
1049
|
+
#
|
1050
|
+
# class FrameExamples
|
1051
|
+
# {
|
1052
|
+
# public static async Task Main()
|
1053
|
+
# {
|
1054
|
+
# using var playwright = await Playwright.CreateAsync();
|
1055
|
+
# await using var browser = await playwright.Firefox.LaunchAsync();
|
1056
|
+
# var page = await browser.NewPageAsync();
|
1057
|
+
# await page.SetViewportSizeAsync(50, 50);
|
1058
|
+
# await page.MainFrame.WaitForFunctionAsync("window.innerWidth < 100");
|
1059
|
+
# }
|
1060
|
+
# }
|
1061
|
+
# ```
|
1062
|
+
#
|
936
1063
|
# To pass an argument to the predicate of `frame.waitForFunction` function:
|
937
1064
|
#
|
938
1065
|
#
|
@@ -955,6 +1082,11 @@ module Playwright
|
|
955
1082
|
# selector = ".foo"
|
956
1083
|
# frame.wait_for_function("selector => !!document.querySelector(selector)", selector)
|
957
1084
|
# ```
|
1085
|
+
#
|
1086
|
+
# ```csharp
|
1087
|
+
# var selector = ".foo";
|
1088
|
+
# await page.MainFrame.WaitForFunctionAsync("selector => !!document.querySelector(selector)", selector);
|
1089
|
+
# ```
|
958
1090
|
def wait_for_function(expression, arg: nil, polling: nil, timeout: nil)
|
959
1091
|
wrap_impl(@impl.wait_for_function(unwrap_impl(expression), arg: unwrap_impl(arg), polling: unwrap_impl(polling), timeout: unwrap_impl(timeout)))
|
960
1092
|
end
|
@@ -984,6 +1116,11 @@ module Playwright
|
|
984
1116
|
# frame.click("button") # click triggers navigation.
|
985
1117
|
# frame.wait_for_load_state() # the promise resolves after "load" event.
|
986
1118
|
# ```
|
1119
|
+
#
|
1120
|
+
# ```csharp
|
1121
|
+
# await frame.ClickAsync("button");
|
1122
|
+
# await frame.WaitForLoadStateAsync(); // Defaults to LoadState.Load
|
1123
|
+
# ```
|
987
1124
|
def wait_for_load_state(state: nil, timeout: nil)
|
988
1125
|
wrap_impl(@impl.wait_for_load_state(state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
989
1126
|
end
|
@@ -1023,6 +1160,14 @@ module Playwright
|
|
1023
1160
|
# # Resolves after navigation has finished
|
1024
1161
|
# ```
|
1025
1162
|
#
|
1163
|
+
# ```csharp
|
1164
|
+
# await Task.WhenAll(
|
1165
|
+
# frame.WaitForNavigationAsync(),
|
1166
|
+
# // clicking the link will indirectly cause a navigation
|
1167
|
+
# frame.ClickAsync("a.delayed-navigation"));
|
1168
|
+
# // Resolves after navigation has finished
|
1169
|
+
# ```
|
1170
|
+
#
|
1026
1171
|
# > NOTE: Usage of the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) to change the URL is
|
1027
1172
|
# considered a navigation.
|
1028
1173
|
def expect_navigation(timeout: nil, url: nil, waitUntil: nil, &block)
|
@@ -1110,6 +1255,29 @@ module Playwright
|
|
1110
1255
|
# with sync_playwright() as playwright:
|
1111
1256
|
# run(playwright)
|
1112
1257
|
# ```
|
1258
|
+
#
|
1259
|
+
# ```csharp
|
1260
|
+
# using Microsoft.Playwright;
|
1261
|
+
# using System;
|
1262
|
+
# using System.Threading.Tasks;
|
1263
|
+
#
|
1264
|
+
# class FrameExamples
|
1265
|
+
# {
|
1266
|
+
# public static async Task Main()
|
1267
|
+
# {
|
1268
|
+
# using var playwright = await Playwright.CreateAsync();
|
1269
|
+
# await using var browser = await playwright.Chromium.LaunchAsync();
|
1270
|
+
# var page = await browser.NewPageAsync();
|
1271
|
+
#
|
1272
|
+
# foreach (var currentUrl in new[] { "https://www.google.com", "https://bbc.com" })
|
1273
|
+
# {
|
1274
|
+
# await page.GotoAsync(currentUrl);
|
1275
|
+
# element = await page.MainFrame.WaitForSelectorAsync("img");
|
1276
|
+
# Console.WriteLine($"Loaded image: {await element.GetAttributeAsync("src")}");
|
1277
|
+
# }
|
1278
|
+
# }
|
1279
|
+
# }
|
1280
|
+
# ```
|
1113
1281
|
def wait_for_selector(selector, state: nil, timeout: nil)
|
1114
1282
|
wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
|
1115
1283
|
end
|
@@ -1144,6 +1312,11 @@ module Playwright
|
|
1144
1312
|
# frame.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
|
1145
1313
|
# frame.wait_for_url("**/target.html")
|
1146
1314
|
# ```
|
1315
|
+
#
|
1316
|
+
# ```csharp
|
1317
|
+
# await frame.ClickAsync("a.delayed-navigation"); // clicking the link will indirectly cause a navigation
|
1318
|
+
# await frame.WaitForURLAsync("**/target.html");
|
1319
|
+
# ```
|
1147
1320
|
def wait_for_url(url, timeout: nil, waitUntil: nil)
|
1148
1321
|
wrap_impl(@impl.wait_for_url(unwrap_impl(url), timeout: unwrap_impl(timeout), waitUntil: unwrap_impl(waitUntil)))
|
1149
1322
|
end
|