Best Puppeteer-sharp code snippet using PuppeteerSharp.Frame.WaitForExpressionAsync
Page.cs
Source:Page.cs
...206 /// - <see cref="WaitForRequestAsync(string, WaitForOptions)"/>207 /// - <see cref="WaitForResponseAsync(string, WaitForOptions)"/>208 /// - <see cref="WaitForXPathAsync(string, WaitForSelectorOptions)"/>209 /// - <see cref="WaitForSelectorAsync(string, WaitForSelectorOptions)"/>210 /// - <see cref="WaitForExpressionAsync(string, WaitForFunctionOptions)"/>211 /// </summary>212 public int DefaultTimeout213 {214 get => _timeoutSettings.Timeout;215 set => _timeoutSettings.Timeout = value;216 }217 /// <summary>218 /// Gets page's main frame219 /// </summary>220 /// <remarks>221 /// Page is guaranteed to have a main frame which persists during navigations.222 /// </remarks>223 public Frame MainFrame => FrameManager.MainFrame;224 /// <summary>225 /// Gets all frames attached to the page.226 /// </summary>227 /// <value>An array of all frames attached to the page.</value>228 public Frame[] Frames => FrameManager.GetFrames();229 ///// <summary>230 ///// Gets all workers in the page.231 ///// </summary>232 //public Worker[] Workers => _workers.Values.ToArray();233 /// <summary>234 /// Shortcut for <c>page.MainFrame.Url</c>235 /// </summary>236 public string Url => MainFrame.Url;237 /// <summary>238 /// Gets that target this page was created from.239 /// </summary>240 public Target Target { get; }241 /// <summary>242 /// Gets this page's keyboard243 /// </summary>244 public Keyboard Keyboard { get; }245 /// <summary>246 /// Gets this page's touchscreen247 /// </summary>248 public Touchscreen Touchscreen { get; }249 /// <summary>250 /// Gets this page's coverage251 /// </summary>252 public Coverage Coverage { get; }253 /// <summary>254 /// Gets this page's mouse255 /// </summary>256 public Mouse Mouse { get; }257 /// <summary>258 /// Gets this page's viewport259 /// </summary>260 public ViewPortOptions Viewport { get; private set; }261 /// <summary>262 /// List of supported metrics provided by the <see cref="Metrics"/> event.263 /// </summary>264 public static readonly IEnumerable<string> SupportedMetrics = new List<string>265 {266 "Timestamp",267 "Documents",268 "Frames",269 "JSEventListeners",270 "Nodes",271 "LayoutCount",272 "RecalcStyleCount",273 "LayoutDuration",274 "RecalcStyleDuration",275 "ScriptDuration",276 "TaskDuration",277 "JSHeapUsedSize",278 "JSHeapTotalSize"279 };280 /// <summary>281 /// Get the browser the page belongs to.282 /// </summary>283 public Browser Browser => Target.Browser;284 /// <summary>285 /// Get the browser context that the page belongs to.286 /// </summary>287 public BrowserContext BrowserContext => Target.BrowserContext;288 /// <summary>289 /// Get an indication that the page has been closed.290 /// </summary>291 public bool IsClosed { get; private set; }292 /// <summary>293 /// Gets the accessibility.294 /// </summary>295 public Accessibility Accessibility { get; }296 internal bool JavascriptEnabled { get; set; } = true;297 internal bool HasPopupEventListeners => Popup?.GetInvocationList().Any() == true;298 internal FrameManager FrameManager { get; private set; }299 private Task SessionClosedTask300 {301 get302 {303 if (_sessionClosedTcs == null)304 {305 _sessionClosedTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);306 Client.Disconnected += clientDisconnected;307 void clientDisconnected(object sender, EventArgs e)308 {309 _sessionClosedTcs.TrySetException(new TargetClosedException("Target closed", "Session closed"));310 Client.Disconnected -= clientDisconnected;311 }312 }313 return _sessionClosedTcs.Task;314 }315 }316 #endregion317 #region Public Methods318 /// <summary>319 /// A utility function to be used with <see cref="Extensions.EvaluateFunctionAsync{T}(Task{JSHandle}, string, object[])"/>320 /// </summary>321 /// <param name="selector">A selector to query page for</param>322 /// <returns>Task which resolves to a <see cref="JSHandle"/> of <c>document.querySelectorAll</c> result</returns>323 public Task<JSHandle> QuerySelectorAllHandleAsync(string selector)324 => EvaluateFunctionHandleAsync("selector => Array.from(document.querySelectorAll(selector))", selector);325 /// <summary>326 /// Executes a script in browser context327 /// </summary>328 /// <param name="script">Script to be evaluated in browser context</param>329 /// <remarks>330 /// If the script, returns a Promise, then the method would wait for the promise to resolve and return its value.331 /// </remarks>332 /// <returns>Task which resolves to script return value</returns>333 public async Task<JSHandle> EvaluateExpressionHandleAsync(string script)334 {335 var context = await MainFrame.GetExecutionContextAsync().ConfigureAwait(false);336 return await context.EvaluateExpressionHandleAsync(script).ConfigureAwait(false);337 }338 /// <summary>339 /// Executes a script in browser context340 /// </summary>341 /// <param name="pageFunction">Script to be evaluated in browser context</param>342 /// <param name="args">Function arguments</param>343 /// <remarks>344 /// If the script, returns a Promise, then the method would wait for the promise to resolve and return its value.345 /// <see cref="JSHandle"/> instances can be passed as arguments346 /// </remarks>347 /// <returns>Task which resolves to script return value</returns>348 public async Task<JSHandle> EvaluateFunctionHandleAsync(string pageFunction, params object[] args)349 {350 var context = await MainFrame.GetExecutionContextAsync().ConfigureAwait(false);351 return await context.EvaluateFunctionHandleAsync(pageFunction, args).ConfigureAwait(false);352 }353 /// <summary>354 /// Activating request interception enables <see cref="Request.AbortAsync(RequestAbortErrorCode)">request.AbortAsync</see>, 355 /// <see cref="Request.ContinueAsync(Payload)">request.ContinueAsync</see> and <see cref="Request.RespondAsync(ResponseData)">request.RespondAsync</see> methods.356 /// </summary>357 /// <returns>The request interception task.</returns>358 /// <param name="value">Whether to enable request interception..</param>359 public Task SetRequestInterceptionAsync(bool value)360 => FrameManager.NetworkManager.SetRequestInterceptionAsync(value);361 /// <summary>362 /// Set offline mode for the page.363 /// </summary>364 /// <returns>Result task</returns>365 /// <param name="value">When <c>true</c> enables offline mode for the page.</param>366 public Task SetOfflineModeAsync(bool value) => FrameManager.NetworkManager.SetOfflineModeAsync(value);367 /// <summary>368 /// Adds a <c><![CDATA[<script>]]></c> tag into the page with the desired url or content369 /// </summary>370 /// <param name="options">add script tag options</param>371 /// <remarks>372 /// Shortcut for <c>page.MainFrame.AddScriptTagAsync(options)</c>373 /// </remarks>374 /// <returns>Task which resolves to the added tag when the script's onload fires or when the script content was injected into frame</returns>375 /// <seealso cref="Frame.AddScriptTagAsync(AddTagOptions)"/>376 public Task<ElementHandle> AddScriptTagAsync(AddTagOptions options) => MainFrame.AddScriptTagAsync(options);377 /// <summary>378 /// Adds a <c><![CDATA[<script>]]></c> tag into the page with the desired url or content379 /// </summary>380 /// <param name="url">script url</param>381 /// <remarks>382 /// Shortcut for <c>page.MainFrame.AddScriptTagAsync(new AddTagOptions { Url = url })</c>383 /// </remarks>384 /// <returns>Task which resolves to the added tag when the script's onload fires or when the script content was injected into frame</returns>385 public Task<ElementHandle> AddScriptTagAsync(string url) => AddScriptTagAsync(new AddTagOptions { Url = url });386 /// <summary>387 /// Adds a <c><![CDATA[<link rel="stylesheet">]]></c> tag into the page with the desired url or a <c><![CDATA[<link rel="stylesheet">]]></c> tag with the content388 /// </summary>389 /// <param name="options">add style tag options</param>390 /// <remarks>391 /// Shortcut for <c>page.MainFrame.AddStyleTagAsync(options)</c>392 /// </remarks>393 /// <returns>Task which resolves to the added tag when the stylesheet's onload fires or when the CSS content was injected into frame</returns>394 /// <seealso cref="Frame.AddStyleTag(AddTagOptions)"/>395 public Task<ElementHandle> AddStyleTagAsync(AddTagOptions options) => MainFrame.AddStyleTagAsync(options);396 /// <summary>397 /// Adds a <c><![CDATA[<link rel="stylesheet">]]></c> tag into the page with the desired url or a <c><![CDATA[<link rel="stylesheet">]]></c> tag with the content398 /// </summary>399 /// <param name="url">stylesheel url</param>400 /// <remarks>401 /// Shortcut for <c>page.MainFrame.AddStyleTagAsync(new AddTagOptions { Url = url })</c>402 /// </remarks>403 /// <returns>Task which resolves to the added tag when the stylesheet's onload fires or when the CSS content was injected into frame</returns>404 public Task<ElementHandle> AddStyleTagAsync(string url) => AddStyleTagAsync(new AddTagOptions { Url = url });405 /// <summary>406 /// Adds a function called <c>name</c> on the page's <c>window</c> object.407 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves when <paramref name="puppeteerFunction"/> completes.408 /// </summary>409 /// <param name="name">Name of the function on the window object</param>410 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>411 /// <remarks>412 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.413 /// Functions installed via <see cref="ExposeFunctionAsync(string, Action)"/> survive navigations414 /// </remarks>415 /// <returns>Task</returns>416 public Task ExposeFunctionAsync(string name, Action puppeteerFunction)417 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);418 /// <summary>419 /// Adds a function called <c>name</c> on the page's <c>window</c> object.420 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves to the return value of <paramref name="puppeteerFunction"/>.421 /// </summary>422 /// <typeparam name="TResult">The result of <paramref name="puppeteerFunction"/></typeparam>423 /// <param name="name">Name of the function on the window object</param>424 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>425 /// <remarks>426 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.427 /// Functions installed via <see cref="ExposeFunctionAsync{TResult}(string, Func{TResult})"/> survive navigations428 /// </remarks>429 /// <returns>Task</returns>430 public Task ExposeFunctionAsync<TResult>(string name, Func<TResult> puppeteerFunction)431 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);432 /// <summary>433 /// Adds a function called <c>name</c> on the page's <c>window</c> object.434 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves to the return value of <paramref name="puppeteerFunction"/>.435 /// </summary>436 /// <typeparam name="TResult">The result of <paramref name="puppeteerFunction"/></typeparam>437 /// <typeparam name="T">The parameter of <paramref name="puppeteerFunction"/></typeparam>438 /// <param name="name">Name of the function on the window object</param>439 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>440 /// <remarks>441 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.442 /// Functions installed via <see cref="ExposeFunctionAsync{T, TResult}(string, Func{T, TResult})"/> survive navigations443 /// </remarks>444 /// <returns>Task</returns>445 public Task ExposeFunctionAsync<T, TResult>(string name, Func<T, TResult> puppeteerFunction)446 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);447 /// <summary>448 /// Adds a function called <c>name</c> on the page's <c>window</c> object.449 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves to the return value of <paramref name="puppeteerFunction"/>.450 /// </summary>451 /// <typeparam name="TResult">The result of <paramref name="puppeteerFunction"/></typeparam>452 /// <typeparam name="T1">The first parameter of <paramref name="puppeteerFunction"/></typeparam>453 /// <typeparam name="T2">The second parameter of <paramref name="puppeteerFunction"/></typeparam>454 /// <param name="name">Name of the function on the window object</param>455 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>456 /// <remarks>457 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.458 /// Functions installed via <see cref="ExposeFunctionAsync{T1, T2, TResult}(string, Func{T1, T2, TResult})"/> survive navigations459 /// </remarks>460 /// <returns>Task</returns>461 public Task ExposeFunctionAsync<T1, T2, TResult>(string name, Func<T1, T2, TResult> puppeteerFunction)462 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);463 /// <summary>464 /// Adds a function called <c>name</c> on the page's <c>window</c> object.465 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves to the return value of <paramref name="puppeteerFunction"/>.466 /// </summary>467 /// <typeparam name="TResult">The result of <paramref name="puppeteerFunction"/></typeparam>468 /// <typeparam name="T1">The first parameter of <paramref name="puppeteerFunction"/></typeparam>469 /// <typeparam name="T2">The second parameter of <paramref name="puppeteerFunction"/></typeparam>470 /// <typeparam name="T3">The third parameter of <paramref name="puppeteerFunction"/></typeparam>471 /// <param name="name">Name of the function on the window object</param>472 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>473 /// <remarks>474 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.475 /// Functions installed via <see cref="ExposeFunctionAsync{T1, T2, T3, TResult}(string, Func{T1, T2, T3, TResult})"/> survive navigations476 /// </remarks>477 /// <returns>Task</returns>478 public Task ExposeFunctionAsync<T1, T2, T3, TResult>(string name, Func<T1, T2, T3, TResult> puppeteerFunction)479 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);480 /// <summary>481 /// Adds a function called <c>name</c> on the page's <c>window</c> object.482 /// When called, the function executes <paramref name="puppeteerFunction"/> in C# and returns a <see cref="Task"/> which resolves to the return value of <paramref name="puppeteerFunction"/>.483 /// </summary>484 /// <typeparam name="TResult">The result of <paramref name="puppeteerFunction"/></typeparam>485 /// <typeparam name="T1">The first parameter of <paramref name="puppeteerFunction"/></typeparam>486 /// <typeparam name="T2">The second parameter of <paramref name="puppeteerFunction"/></typeparam>487 /// <typeparam name="T3">The third parameter of <paramref name="puppeteerFunction"/></typeparam>488 /// <typeparam name="T4">The fourth parameter of <paramref name="puppeteerFunction"/></typeparam>489 /// <param name="name">Name of the function on the window object</param>490 /// <param name="puppeteerFunction">Callback function which will be called in Puppeteer's context.</param>491 /// <remarks>492 /// If the <paramref name="puppeteerFunction"/> returns a <see cref="Task"/>, it will be awaited.493 /// Functions installed via <see cref="ExposeFunctionAsync{T1, T2, T3, T4, TResult}(string, Func{T1, T2, T3, T4, TResult})"/> survive navigations494 /// </remarks>495 /// <returns>Task</returns>496 public Task ExposeFunctionAsync<T1, T2, T3, T4, TResult>(string name, Func<T1, T2, T3, T4, TResult> puppeteerFunction)497 => ExposeFunctionAsync(name, (Delegate)puppeteerFunction);498 /// <summary>499 /// Gets the full HTML contents of the page, including the doctype.500 /// </summary>501 /// <returns>Task which resolves to the HTML content.</returns>502 /// <seealso cref="Frame.GetContentAsync"/>503 public Task<string> GetContentAsync() => FrameManager.MainFrame.GetContentAsync();504 /// <summary>505 /// Sets the HTML markup to the page506 /// </summary>507 /// <param name="html">HTML markup to assign to the page.</param>508 /// <param name="options">The navigations options</param>509 /// <returns>Task.</returns>510 /// <seealso cref="Frame.SetContentAsync(string, NavigationOptions)"/>511 public Task SetContentAsync(string html, NavigationOptions options = null) => FrameManager.MainFrame.SetContentAsync(html, options);512 /// <summary>513 /// Navigates to an url514 /// </summary>515 /// <remarks>516 /// <see cref="GoToAsync(string, int?, WaitUntilNavigation[])"/> will throw an error if:517 /// - there's an SSL error (e.g. in case of self-signed certificates).518 /// - target URL is invalid.519 /// - the `timeout` is exceeded during navigation.520 /// - the remote server does not respond or is unreachable.521 /// - the main resource failed to load.522 /// 523 /// <see cref="GoToAsync(string, int?, WaitUntilNavigation[])"/> will not throw an error when any valid HTTP status code is returned by the remote server, 524 /// including 404 "Not Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling <see cref="Response.Status"/>525 /// 526 /// > **NOTE** <see cref="GoToAsync(string, int?, WaitUntilNavigation[])"/> either throws an error or returns a main resource response. 527 /// The only exceptions are navigation to `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.528 /// 529 /// > **NOTE** Headless mode doesn't support navigation to a PDF document. See the <see fref="https://bugs.chromium.org/p/chromium/issues/detail?id=761295">upstream issue</see>.530 /// 531 /// Shortcut for <seealso cref="Frame.GoToAsync(string, int?, WaitUntilNavigation[])"/>532 /// </remarks>533 /// <param name="url">URL to navigate page to. The url should include scheme, e.g. https://.</param>534 /// <param name="options">Navigation parameters.</param>535 /// <returns>Task which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect.</returns>536 /// <seealso cref="GoToAsync(string, int?, WaitUntilNavigation[])"/>537 public Task<Response> GoToAsync(string url, NavigationOptions options) => FrameManager.MainFrame.GoToAsync(url, options);538 /// <summary>539 /// Navigates to an url540 /// </summary>541 /// <param name="url">URL to navigate page to. The url should include scheme, e.g. https://.</param>542 /// <param name="timeout">Maximum navigation time in milliseconds, defaults to 30 seconds, pass <c>0</c> to disable timeout. </param>543 /// <param name="waitUntil">When to consider navigation succeeded, defaults to <see cref="WaitUntilNavigation.Load"/>. Given an array of <see cref="WaitUntilNavigation"/>, navigation is considered to be successful after all events have been fired</param>544 /// <returns>Task which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect</returns>545 /// <seealso cref="GoToAsync(string, NavigationOptions)"/>546 public Task<Response> GoToAsync(string url, int? timeout = null, WaitUntilNavigation[] waitUntil = null)547 => GoToAsync(url, new NavigationOptions { Timeout = timeout, WaitUntil = waitUntil });548 /// <summary>549 /// Navigates to an url550 /// </summary>551 /// <param name="url">URL to navigate page to. The url should include scheme, e.g. https://.</param>552 /// <param name="waitUntil">When to consider navigation succeeded.</param>553 /// <returns>Task which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect</returns>554 /// <seealso cref="GoToAsync(string, NavigationOptions)"/>555 public Task<Response> GoToAsync(string url, WaitUntilNavigation waitUntil)556 => GoToAsync(url, new NavigationOptions { WaitUntil = new[] { waitUntil } });557 /// <summary>558 /// generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>559 /// </summary>560 /// <param name="file">The file path to save the PDF to. paths are resolved using <see cref="Path.GetFullPath(string)"/></param>561 /// <returns></returns>562 /// <remarks>563 /// Generating a pdf is currently only supported in Chrome headless564 /// </remarks>565 public Task PdfAsync(string file) => PdfAsync(file, new PdfOptions());566 /// <summary>567 /// generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>568 /// </summary>569 /// <param name="file">The file path to save the PDF to. paths are resolved using <see cref="Path.GetFullPath(string)"/></param>570 /// <param name="options">pdf options</param>571 /// <returns></returns>572 /// <remarks>573 /// Generating a pdf is currently only supported in Chrome headless574 /// </remarks>575 public async Task PdfAsync(string file, PdfOptions options)576 => await PdfInternalAsync(file, options).ConfigureAwait(false);577 /// <summary>578 /// generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>579 /// </summary>580 /// <returns>Task which resolves to a <see cref="Stream"/> containing the PDF data.</returns>581 /// <remarks>582 /// Generating a pdf is currently only supported in Chrome headless583 /// </remarks>584 public Task<Stream> PdfStreamAsync() => PdfStreamAsync(new PdfOptions());585 /// <summary>586 /// Generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>587 /// </summary>588 /// <param name="options">pdf options</param>589 /// <returns>Task which resolves to a <see cref="Stream"/> containing the PDF data.</returns>590 /// <remarks>591 /// Generating a pdf is currently only supported in Chrome headless592 /// </remarks>593 public async Task<Stream> PdfStreamAsync(PdfOptions options)594 => new MemoryStream(await PdfDataAsync(options).ConfigureAwait(false));595 /// <summary>596 /// Generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>597 /// </summary>598 /// <returns>Task which resolves to a <see cref="byte"/>[] containing the PDF data.</returns>599 /// <remarks>600 /// Generating a pdf is currently only supported in Chrome headless601 /// </remarks>602 public Task<byte[]> PdfDataAsync() => PdfDataAsync(new PdfOptions());603 /// <summary>604 /// Generates a pdf of the page with <see cref="MediaType.Print"/> css media. To generate a pdf with <see cref="MediaType.Screen"/> media call <see cref="EmulateMediaAsync(MediaType)"/> with <see cref="MediaType.Screen"/>605 /// </summary>606 /// <param name="options">pdf options</param>607 /// <returns>Task which resolves to a <see cref="byte"/>[] containing the PDF data.</returns>608 /// <remarks>609 /// Generating a pdf is currently only supported in Chrome headless610 /// </remarks>611 public Task<byte[]> PdfDataAsync(PdfOptions options) => PdfInternalAsync(null, options);612 internal async Task<byte[]> PdfInternalAsync(string file, PdfOptions options)613 {614 var paperWidth = PaperFormat.Letter.Width;615 var paperHeight = PaperFormat.Letter.Height;616 if (options.Format != null)617 {618 paperWidth = options.Format.Width;619 paperHeight = options.Format.Height;620 }621 else622 {623 if (options.Width != null)624 {625 paperWidth = ConvertPrintParameterToInches(options.Width);626 }627 if (options.Height != null)628 {629 paperHeight = ConvertPrintParameterToInches(options.Height);630 }631 }632 var marginTop = ConvertPrintParameterToInches(options.MarginOptions.Top);633 var marginLeft = ConvertPrintParameterToInches(options.MarginOptions.Left);634 var marginBottom = ConvertPrintParameterToInches(options.MarginOptions.Bottom);635 var marginRight = ConvertPrintParameterToInches(options.MarginOptions.Right);636 var result = await Client.SendAsync<PagePrintToPDFResponse>("Page.printToPDF", new PagePrintToPDFRequest637 {638 TransferMode = "ReturnAsStream",639 Landscape = options.Landscape,640 DisplayHeaderFooter = options.DisplayHeaderFooter,641 HeaderTemplate = options.HeaderTemplate,642 FooterTemplate = options.FooterTemplate,643 PrintBackground = options.PrintBackground,644 Scale = options.Scale,645 PaperWidth = paperWidth,646 PaperHeight = paperHeight,647 MarginTop = marginTop,648 MarginBottom = marginBottom,649 MarginLeft = marginLeft,650 MarginRight = marginRight,651 PageRanges = options.PageRanges,652 PreferCSSPageSize = options.PreferCSSPageSize653 }).ConfigureAwait(false);654 return await ProtocolStreamReader.ReadProtocolStreamByteAsync(Client, result.Stream, file).ConfigureAwait(false);655 }656 /// <summary>657 /// Enables/Disables Javascript on the page658 /// </summary>659 /// <returns>Task.</returns>660 /// <param name="enabled">Whether or not to enable JavaScript on the page.</param>661 public Task SetJavaScriptEnabledAsync(bool enabled)662 {663 if (enabled == JavascriptEnabled)664 {665 return Task.CompletedTask;666 }667 JavascriptEnabled = enabled;668 return Client.SendAsync("Emulation.setScriptExecutionDisabled", new EmulationSetScriptExecutionDisabledRequest669 {670 Value = !enabled671 });672 }673 /// <summary>674 /// Toggles bypassing page's Content-Security-Policy.675 /// </summary>676 /// <param name="enabled">sets bypassing of page's Content-Security-Policy.</param>677 /// <returns></returns>678 /// <remarks>679 /// CSP bypassing happens at the moment of CSP initialization rather then evaluation.680 /// Usually this means that <see cref="SetBypassCSPAsync(bool)"/> should be called before navigating to the domain.681 /// </remarks>682 public Task SetBypassCSPAsync(bool enabled) => Client.SendAsync("Page.setBypassCSP", new PageSetBypassCSPRequest683 {684 Enabled = enabled685 });686 /// <summary>687 /// Emulates a media such as screen or print.688 /// </summary>689 /// <returns>Task.</returns>690 /// <param name="media">Media to set.</param>691 [Obsolete("User EmulateMediaTypeAsync instead")]692 public Task EmulateMediaAsync(MediaType media) => EmulateMediaTypeAsync(media);693 /// <summary>694 /// Emulates a media such as screen or print.695 /// </summary>696 /// <param name="type">Media to set.</param>697 /// <example>698 /// <code>699 /// <![CDATA[700 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('screen').matches)");701 /// // â true702 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('print').matches)");703 /// // â true704 /// await page.EmulateMediaTypeAsync(MediaType.Print);705 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('screen').matches)");706 /// // â false707 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('print').matches)");708 /// // â true709 /// await page.EmulateMediaTypeAsync(MediaType.None);710 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('screen').matches)");711 /// // â true712 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('print').matches)");713 /// // â true714 /// ]]>715 /// </code>716 /// </example>717 /// <returns>Emulate media type task.</returns>718 public Task EmulateMediaTypeAsync(MediaType type)719 => Client.SendAsync("Emulation.setEmulatedMedia", new EmulationSetEmulatedMediaTypeRequest { Media = type });720 /// <summary>721 /// Given an array of media feature objects, emulates CSS media features on the page.722 /// </summary>723 /// <param name="features">Features to apply</param>724 /// <example>725 /// <code>726 /// <![CDATA[727 /// await page.EmulateMediaFeaturesAsync(new MediaFeature[]{ new MediaFeature { MediaFeature = MediaFeature.PrefersColorScheme, Value = "dark" }});728 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: dark)').matches)");729 /// // â true730 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: light)').matches)");731 /// // â false732 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: no-preference)').matches)");733 /// // â false734 /// await page.EmulateMediaFeaturesAsync(new MediaFeature[]{ new MediaFeature { MediaFeature = MediaFeature.PrefersReducedMotion, Value = "reduce" }});735 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-reduced-motion: reduce)').matches)");736 /// // â true737 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: no-preference)').matches)");738 /// // â false739 /// await page.EmulateMediaFeaturesAsync(new MediaFeature[]740 /// { 741 /// new MediaFeature { MediaFeature = MediaFeature.PrefersColorScheme, Value = "dark" },742 /// new MediaFeature { MediaFeature = MediaFeature.PrefersReducedMotion, Value = "reduce" },743 /// });744 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: dark)').matches)");745 /// // â true746 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: light)').matches)");747 /// // â false748 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: no-preference)').matches)");749 /// // â false750 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-reduced-motion: reduce)').matches)");751 /// // â true752 /// await page.EvaluateFunctionAsync<bool>("() => matchMedia('(prefers-color-scheme: no-preference)').matches)");753 /// // â false754 /// ]]>755 /// </code>756 /// </example>757 /// <returns>Emulate features task</returns>758 public Task EmulateMediaFeaturesAsync(IEnumerable<MediaFeatureValue> features)759 => Client.SendAsync("Emulation.setEmulatedMedia", new EmulationSetEmulatedMediaFeatureRequest { Features = features });760 /// <summary>761 /// Sets the viewport.762 /// In the case of multiple pages in a single browser, each page can have its own viewport size.763 /// <see cref="SetViewportAsync(ViewPortOptions)"/> will resize the page. A lot of websites don't expect phones to change size, so you should set the viewport before navigating to the page.764 /// </summary>765 /// <example>766 ///<![CDATA[767 /// using(var page = await browser.NewPageAsync())768 /// {769 /// await page.SetViewPortAsync(new ViewPortOptions770 /// {771 /// Width = 640, 772 /// Height = 480, 773 /// DeviceScaleFactor = 1774 /// });775 /// await page.goto('https://www.example.com');776 /// }777 /// ]]>778 /// </example>779 /// <returns>The viewport task.</returns>780 /// <param name="viewport">Viewport options.</param>781 public async Task SetViewportAsync(ViewPortOptions viewport)782 {783 var needsReload = await _emulationManager.EmulateViewport(viewport).ConfigureAwait(false);784 Viewport = viewport;785 if (needsReload)786 {787 await ReloadAsync().ConfigureAwait(false);788 }789 }790 /// <summary>791 /// Closes the page.792 /// </summary>793 /// <param name="options">Close options.</param>794 /// <returns>Task.</returns>795 public Task CloseAsync(PageCloseOptions options = null)796 {797 if (!(Client?.Connection?.IsClosed ?? true))798 {799 var runBeforeUnload = options?.RunBeforeUnload ?? false;800 if (runBeforeUnload)801 {802 return Client.SendAsync("Page.close");803 }804 return Client.Connection.SendAsync("Target.closeTarget", new TargetCloseTargetRequest805 {806 TargetId = Target.TargetId807 }).ContinueWith(task => Target.CloseTask);808 }809 return _closeCompletedTcs.Task;810 }811 /// <summary>812 /// Reloads the page813 /// </summary>814 /// <param name="options">Navigation options</param>815 /// <returns>Task which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect</returns>816 /// <seealso cref="ReloadAsync(int?, WaitUntilNavigation[])"/>817 public async Task<Response> ReloadAsync(NavigationOptions options)818 {819 var navigationTask = WaitForNavigationAsync(options);820 await Task.WhenAll(821 navigationTask,822 Client.SendAsync("Page.reload")823 ).ConfigureAwait(false);824 return navigationTask.Result;825 }826 /// <summary>827 /// Reloads the page828 /// </summary>829 /// <param name="timeout">Maximum navigation time in milliseconds, defaults to 30 seconds, pass <c>0</c> to disable timeout. </param>830 /// <param name="waitUntil">When to consider navigation succeeded, defaults to <see cref="WaitUntilNavigation.Load"/>. Given an array of <see cref="WaitUntilNavigation"/>, navigation is considered to be successful after all events have been fired</param>831 /// <returns>Task which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect</returns>832 /// <seealso cref="ReloadAsync(NavigationOptions)"/>833 public Task<Response> ReloadAsync(int? timeout = null, WaitUntilNavigation[] waitUntil = null)834 => ReloadAsync(new NavigationOptions { Timeout = timeout, WaitUntil = waitUntil });835 /// <summary>836 /// Waits for a function to be evaluated to a truthy value837 /// </summary>838 /// <param name="script">Function to be evaluated in browser context</param>839 /// <param name="options">Optional waiting parameters</param>840 /// <param name="args">Arguments to pass to <c>script</c></param>841 /// <returns>A task that resolves when the <c>script</c> returns a truthy value</returns>842 /// <seealso cref="Frame.WaitForFunctionAsync(string, WaitForFunctionOptions, object[])"/>843 public Task<JSHandle> WaitForFunctionAsync(string script, WaitForFunctionOptions options = null, params object[] args)844 => MainFrame.WaitForFunctionAsync(script, options ?? new WaitForFunctionOptions(), args);845 /// <summary>846 /// Waits for an expression to be evaluated to a truthy value847 /// </summary>848 /// <param name="script">Expression to be evaluated in browser context</param>849 /// <param name="options">Optional waiting parameters</param>850 /// <returns>A task that resolves when the <c>script</c> returns a truthy value</returns>851 /// <seealso cref="Frame.WaitForExpressionAsync(string, WaitForFunctionOptions)"/>852 public Task<JSHandle> WaitForExpressionAsync(string script, WaitForFunctionOptions options = null)853 => MainFrame.WaitForExpressionAsync(script, options ?? new WaitForFunctionOptions());854 /// <summary>855 /// Waits for a selector to be added to the DOM856 /// </summary>857 /// <param name="selector">A selector of an element to wait for</param>858 /// <param name="options">Optional waiting parameters</param>859 /// <returns>A task that resolves when element specified by selector string is added to DOM.860 /// Resolves to `null` if waiting for `hidden: true` and selector is not found in DOM.</returns>861 /// <seealso cref="WaitForXPathAsync(string, WaitForSelectorOptions)"/>862 /// <seealso cref="Frame.WaitForSelectorAsync(string, WaitForSelectorOptions)"/>863 public Task<ElementHandle> WaitForSelectorAsync(string selector, WaitForSelectorOptions options = null)864 => MainFrame.WaitForSelectorAsync(selector, options ?? new WaitForSelectorOptions());865 /// <summary>866 /// Waits for a xpath selector to be added to the DOM867 /// </summary>...
Frame.cs
Source:Frame.cs
...314 /// </summary>315 /// <param name="script">Expression to be evaluated in browser context</param>316 /// <param name="options">Optional waiting parameters</param>317 /// <returns>A task that resolves when the <c>script</c> returns a truthy value</returns>318 /// <seealso cref="Page.WaitForExpressionAsync(string, WaitForFunctionOptions)"/>319 /// <exception cref="WaitTaskTimeoutException">If timeout occurred.</exception>320 public Task<JSHandle> WaitForExpressionAsync(string script, WaitForFunctionOptions options)321 => MainWorld.WaitForExpressionAsync(script, options);322 /// <summary>323 /// Adds a <c><![CDATA[<link rel="stylesheet">]]></c> tag into the page with the desired url or a <c><![CDATA[<link rel="stylesheet">]]></c> tag with the content324 /// </summary>325 /// <param name="options">add style tag options</param>326 /// <returns>Task which resolves to the added tag when the stylesheet's onload fires or when the CSS content was injected into frame</returns>327 /// <seealso cref="Page.AddStyleTagAsync(AddTagOptions)"/>328 /// <seealso cref="Page.AddStyleTagAsync(string)"/>329 [Obsolete("Use AddStyleTagAsync instead")]330 public Task<ElementHandle> AddStyleTag(AddTagOptions options) => MainWorld.AddStyleTagAsync(options);331 /// <summary>332 /// Adds a <c><![CDATA[<script>]]></c> tag into the page with the desired url or content333 /// </summary>334 /// <param name="options">add script tag options</param>335 /// <returns>Task which resolves to the added tag when the script's onload fires or when the script content was injected into frame</returns>...
DOMWorld.cs
Source:DOMWorld.cs
...236 options.Polling,237 options.PollingInterval,238 options.Timeout ?? _timeoutSettings.Timeout,239 args).Task;240 internal Task<JSHandle> WaitForExpressionAsync(string script, WaitForFunctionOptions options)241 => new WaitTask(242 this,243 script,244 true,245 "function",246 options.Polling,247 options.PollingInterval,248 options.Timeout ?? _timeoutSettings.Timeout).Task;249 internal Task<string> GetTitleAsync() => EvaluateExpressionAsync<string>("document.title");250 private async Task<ElementHandle> GetDocument()251 {252 if (_documentCompletionSource == null)253 {254 _documentCompletionSource = new TaskCompletionSource<ElementHandle>(TaskCreationOptions.RunContinuationsAsynchronously);...
FrameWaitForFunctionTests.cs
Source:FrameWaitForFunctionTests.cs
...145 [PuppeteerFact]146 public async Task ShouldRespectTimeout()147 {148 var exception = await Assert.ThrowsAsync<WaitTaskTimeoutException>(()149 => Page.WaitForExpressionAsync("false", new WaitForFunctionOptions { Timeout = 10 }));150 Assert.Contains("waiting for function failed: timeout", exception.Message);151 }152 [PuppeteerTest("waittask.spec.ts", "Frame.waitForFunction", "should respect default timeout")]153 [PuppeteerFact]154 public async Task ShouldRespectDefaultTimeout()155 {156 Page.DefaultTimeout = 1;157 var exception = await Assert.ThrowsAsync<WaitTaskTimeoutException>(()158 => Page.WaitForExpressionAsync("false"));159 Assert.Contains("waiting for function failed: timeout", exception.Message);160 }161 [PuppeteerTest("waittask.spec.ts", "Frame.waitForFunction", "should disable timeout when its set to 0")]162 [PuppeteerFact]163 public async Task ShouldDisableTimeoutWhenItsSetTo0()164 {165 var watchdog = Page.WaitForFunctionAsync(@"() => {166 window.__counter = (window.__counter || 0) + 1;167 return window.__injected;168 }", new WaitForFunctionOptions { Timeout = 0, PollingInterval = 10 });169 await Page.WaitForFunctionAsync("() => window.__counter > 10");170 await Page.EvaluateExpressionAsync("window.__injected = true");171 await watchdog;172 }173 [PuppeteerTest("waittask.spec.ts", "Frame.waitForFunction", "should survive cross-process navigation")]174 [PuppeteerFact]175 public async Task ShouldSurviveCrossProcessNavigation()176 {177 var fooFound = false;178 var waitForFunction = Page.WaitForExpressionAsync("window.__FOO === 1")179 .ContinueWith(_ => fooFound = true);180 await Page.GoToAsync(TestConstants.EmptyPage);181 Assert.False(fooFound);182 await Page.ReloadAsync();183 Assert.False(fooFound);184 await Page.GoToAsync(TestConstants.CrossProcessUrl + "/grid.html");185 Assert.False(fooFound);186 await Page.EvaluateExpressionAsync("window.__FOO = 1");187 await waitForFunction;188 Assert.True(fooFound);189 }190 [PuppeteerTest("waittask.spec.ts", "Frame.waitForFunction", "should survive navigations")]191 [PuppeteerFact]192 public async Task ShouldSurviveNavigations()...
BlazorTest.cs
Source:BlazorTest.cs
...174175 await page.ClickAsync("h1 > strong > a");176 await page.WaitForNavigationAsync(new NavigationOptions { Timeout = timeout });177178 await page.WaitForExpressionAsync("1 + 1 === 2", new WaitForFunctionOptions { Timeout = timeout });179 await page.WaitForFunctionAsync("() => window.location.href === 'https://github.com/kblok/puppeteer-sharp'", new WaitForFunctionOptions { Timeout = timeout });180 await page.WaitForSelectorAsync("#readme", new WaitForSelectorOptions { Timeout = timeout });181 await page.WaitForXPathAsync("//*[@id='readme']", new WaitForSelectorOptions { Timeout = timeout });182183 await page.WaitForTimeoutAsync(timeout);184185 // WaitUntilNavigation186 new NavigationOptions().WaitUntil = new []187 {188 WaitUntilNavigation.Load,189 WaitUntilNavigation.DOMContentLoaded,190 WaitUntilNavigation.Networkidle0,191 WaitUntilNavigation.Networkidle2192 };193194 // Frame195 var frame = page.MainFrame;196197 await frame.WaitForExpressionAsync("1 + 1 === 2", new WaitForFunctionOptions { Timeout = timeout });198 await frame.WaitForFunctionAsync("() => window.location.href === 'https://github.com/kblok/puppeteer-sharp'", new WaitForFunctionOptions { Timeout = timeout });199 await frame.WaitForSelectorAsync("#readme", new WaitForSelectorOptions { Timeout = timeout });200 await frame.WaitForXPathAsync("//*[@id='readme']", new WaitForSelectorOptions { Timeout = timeout });201202 await frame.WaitForTimeoutAsync(timeout);203 }204205 [Fact]206 public async Task values_from_Page()207 {208 var page = await Page();209210 var url = page.Url;211 var title = await page.GetTitleAsync();
...
Examples.cs
Source:Examples.cs
...66 await _page.GoToAsync("https://github.com/hardkoded/puppeteer-sharp");67 await Task.WhenAll(requestTask, responseTask);68 await _page.ClickAsync("h1 > strong > a");69 await _page.WaitForNavigationAsync(new NavigationOptions { Timeout = timeout });70 await _page.WaitForExpressionAsync("1 + 1 === 2", new WaitForFunctionOptions { Timeout = timeout });71 await _page.WaitForFunctionAsync("() => window.location.href === 'https://github.com/hardkoded/puppeteer-sharp'", new WaitForFunctionOptions { Timeout = timeout });72 await _page.WaitForSelectorAsync("#readme", new WaitForSelectorOptions { Timeout = timeout });73 await _page.WaitForXPathAsync("//*[@id='readme']", new WaitForSelectorOptions { Timeout = timeout });74 await _page.WaitForTimeoutAsync(timeout);75 // WaitUntilNavigation76 new NavigationOptions().WaitUntil = new[]77 {78 WaitUntilNavigation.Load,79 WaitUntilNavigation.DOMContentLoaded,80 WaitUntilNavigation.Networkidle0,81 WaitUntilNavigation.Networkidle282 };83 // Frame84 var frame = _page.MainFrame;85 await frame.WaitForExpressionAsync("1 + 1 === 2", new WaitForFunctionOptions { Timeout = timeout });86 await frame.WaitForFunctionAsync("() => window.location.href === 'https://github.com/hardkoded/puppeteer-sharp'", new WaitForFunctionOptions { Timeout = timeout });87 await frame.WaitForSelectorAsync("#readme", new WaitForSelectorOptions { Timeout = timeout });88 await frame.WaitForXPathAsync("//*[@id='readme']", new WaitForSelectorOptions { Timeout = timeout });89 await frame.WaitForTimeoutAsync(timeout);90 }91 [Fact]92 public async Task values_from_Page()93 {94 var url = _page.Url;95 var title = await _page.GetTitleAsync();96 var content = await _page.GetContentAsync();97 var cookies = await _page.GetCookiesAsync();98 }99 [Fact]...
WaitForFunctionTests.cs
Source:WaitForFunctionTests.cs
...95 [Fact]96 public async Task ShouldRespectTimeout()97 {98 var exception = await Assert.ThrowsAsync<WaitTaskTimeoutException>(()99 => Page.WaitForExpressionAsync("false", new WaitForFunctionOptions { Timeout = 10 }));100 Assert.Contains("waiting for function failed: timeout", exception.Message);101 }102 [Fact]103 public async Task ShouldRespectDefaultTimeout()104 {105 Page.DefaultTimeout = 1;106 var exception = await Assert.ThrowsAsync<WaitTaskTimeoutException>(()107 => Page.WaitForExpressionAsync("false"));108 Assert.Contains("waiting for function failed: timeout", exception.Message);109 }110 [Fact]111 public async Task ShouldDisableTimeoutWhenItsSetTo0()112 {113 var watchdog = Page.WaitForFunctionAsync(@"() => {114 window.__counter = (window.__counter || 0) + 1;115 return window.__injected;116 }", new WaitForFunctionOptions { Timeout = 0, PollingInterval = 10 });117 await Page.WaitForFunctionAsync("() => window.__counter > 10");118 await Page.EvaluateExpressionAsync("window.__injected = true");119 await watchdog;120 }121 [Fact]122 public async Task ShouldSurviveCrossProcessNavigation()123 {124 var fooFound = false;125 var waitForFunction = Page.WaitForExpressionAsync("window.__FOO === 1")126 .ContinueWith(_ => fooFound = true);127 await Page.GoToAsync(TestConstants.EmptyPage);128 Assert.False(fooFound);129 await Page.ReloadAsync();130 Assert.False(fooFound);131 await Page.GoToAsync(TestConstants.CrossProcessUrl + "/grid.html");132 Assert.False(fooFound);133 await Page.EvaluateExpressionAsync("window.__FOO = 1");134 await waitForFunction;135 Assert.True(fooFound);136 }137 [Fact]138 public async Task ShouldSurviveNavigations()139 {...
PuppeteerExtensions.cs
Source:PuppeteerExtensions.cs
...24 await (await frame.QuerySelectorAsync(selector)).ClickAsync();25 }26 public static async Task WaitForTruth(this Page page, string script, WaitForFunctionOptions opts = null)27 {28 var jsHandle = await page.WaitForExpressionAsync(script, opts);29 await jsHandle.DisposeAsync();30 }31 public static async Task WaitForDocumentInteractiveState(this Page page, int? timeout = null)32 {33 await page.WaitForTruth("document.readyState === 'interactive' || document.readyState === 'complete'", new WaitForFunctionOptions { Timeout = timeout ?? page.Browser.DefaultWaitForTimeout });34 }35 }36}
WaitForExpressionAsync
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 MainAsync().Wait();9 }10 private static async Task MainAsync()11 {12 var browser = await Puppeteer.LaunchAsync(new LaunchOptions13 {14 });15 var page = await browser.NewPageAsync();16 await page.WaitForExpressionAsync("document.querySelector('input')");17 Console.WriteLine("input element found");18 await browser.CloseAsync();19 }20 }21}
WaitForExpressionAsync
Using AI Code Generation
1var frame = page.MainFrame;2await frame.WaitForExpressionAsync("window.Foo != undefined");3var frame = page.MainFrame;4await frame.WaitForFunctionAsync("window.Foo != undefined");5await page.WaitForFunctionAsync("window.Foo != undefined");6var query = new QueryDefinition(7 .WithParameter("@ids", new[] { "id1", "id2", "id3" });8Microsoft.Azure.Documents.DocumentClientException: 'Message: {"Errors":["Encountered invalid character 'I' in identifier. Expecting 'N' or 'S' or 'B' or 'F' or 'D' or 'U' or 'G' or 'E' or 'L' or 'P' or 'Y' or 'O' or 'R' or 'T' or 'M' or 'A' or 'C' or 'V' or 'W' or 'X' or 'Z' or 'i' or 'n' or 's' or 'b' or 'f' or 'd' or 'u' or 'g' or 'e' or 'l' or 'p' or 'y' or 'o' or 'r' or 't' or 'm' or 'a' or 'c' or 'v' or 'w' or 'x' or 'z' or '_' or '0' or '1' or '2' or '3' or '4' or '5' or '6' or '7
WaitForExpressionAsync
Using AI Code Generation
1var page = await browser.NewPageAsync();2var element = await page.WaitForSelectorAsync("input[name='q']");3await element.TypeAsync("PuppeteerSharp");4await page.WaitForExpressionAsync("document.querySelector('input[name=\"q\"]').value");5var page = await browser.NewPageAsync();6var element = await page.WaitForSelectorAsync("input[name='q']");7await element.TypeAsync("PuppeteerSharp");8await page.WaitForFunctionAsync("document.querySelector('input[name=\"q\"]').value");9var page = await browser.NewPageAsync();10var element = await page.WaitForSelectorAsync("input[name='q']");11await element.TypeAsync("PuppeteerSharp");12await page.WaitForFunctionAsync("document.querySelector('input[name=\"q\"]').value == 'PuppeteerSharp'");13var page = await browser.NewPageAsync();14var element = await page.WaitForSelectorAsync("input[name='q']");15await element.TypeAsync("PuppeteerSharp");16await page.WaitForFunctionAsync("document.querySelector('input[name=\"q\"]').value == 'PuppeteerSharp'", new WaitForFunctionOptions { PollingInterval = 1000 });17var page = await browser.NewPageAsync();18var element = await page.WaitForSelectorAsync("input[name='q']");19await element.TypeAsync("PuppeteerSharp");20await page.WaitForFunctionAsync("document.querySelector('input[name=\"q\"]').value == 'PuppeteerSharp'", new WaitForFunctionOptions { PollingInterval = 1000, Timeout = 5000 });21var page = await browser.NewPageAsync();
WaitForExpressionAsync
Using AI Code Generation
1public static async Task WaitForExpressionAsyncFrameExample()2{3 var browser = await Puppeteer.LaunchAsync(new LaunchOptions4 {5 });6 var page = await browser.NewPageAsync();7 var result = await page.WaitForExpressionAsync("document.title");8 Console.WriteLine(result);9 await browser.CloseAsync();10}11public static async Task WaitForFunctionAsyncFrameExample()12{13 var browser = await Puppeteer.LaunchAsync(new LaunchOptions14 {15 });16 var page = await browser.NewPageAsync();17 var result = await page.WaitForFunctionAsync("document.title");18 Console.WriteLine(result);19 await browser.CloseAsync();20}21public static async Task WaitForNavigationAsyncFrameExample()22{23 var browser = await Puppeteer.LaunchAsync(new LaunchOptions24 {25 });26 var page = await browser.NewPageAsync();27 var result = await page.WaitForNavigationAsync();28 Console.WriteLine(result);29 await browser.CloseAsync();30}31public static async Task WaitForSelectorAsyncFrameExample()32{33 var browser = await Puppeteer.LaunchAsync(new LaunchOptions34 {35 });36 var page = await browser.NewPageAsync();
WaitForExpressionAsync
Using AI Code Generation
1{2 public static async Task Main(string[] args)3 {4 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);5 using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false }))6 {7 using (var page = await browser.NewPageAsync())8 {9 var frame = page.MainFrame;10 var result = await frame.WaitForExpressionAsync("document.querySelector('input[name=q]').value == 'Puppeteer'");11 Console.WriteLine(result);12 }13 }14 }15}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!