How to use PageErrorEventArgs method of PuppeteerSharp.PageErrorEventArgs class

Best Puppeteer-sharp code snippet using PuppeteerSharp.PageErrorEventArgs.PageErrorEventArgs

Page.cs

Source:Page.cs Github

copy

Full Screen

...161 public event EventHandler<RequestEventArgs> RequestFailed;162 /// <summary>163 /// Raised when an uncaught exception happens within the page.164 /// </summary>165 public event EventHandler<PageErrorEventArgs> PageError;166 ///// <summary>167 ///// Emitted when a dedicated WebWorker (<see href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API"/>) is spawned by the page.168 ///// </summary>169 //public event EventHandler<WorkerEventArgs> WorkerCreated;170 ///// <summary>171 ///// Emitted when a dedicated WebWorker (<see href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API"/>) is terminated.172 ///// </summary>173 //public event EventHandler<WorkerEventArgs> WorkerDestroyed;174 /// <summary>175 /// Raised when the page closes.176 /// </summary>177 public event EventHandler Close;178 /// <summary>179 /// Raised when the page opens a new tab or window.180 /// </summary>181 public event EventHandler<PopupEventArgs> Popup;182 /// <summary>183 /// This setting will change the default maximum time for the following methods:184 /// - <see cref="GoToAsync(string, NavigationOptions)"/>185 /// - <see cref="GoBackAsync(NavigationOptions)"/>186 /// - <see cref="GoForwardAsync(NavigationOptions)"/>187 /// - <see cref="ReloadAsync(NavigationOptions)"/>188 /// - <see cref="SetContentAsync(string, NavigationOptions)"/>189 /// - <see cref="WaitForNavigationAsync(NavigationOptions)"/>190 /// **NOTE** <see cref="DefaultNavigationTimeout"/> takes priority over <seealso cref="DefaultTimeout"/>191 /// </summary>192 public int DefaultNavigationTimeout193 {194 get => _timeoutSettings.NavigationTimeout;195 set => _timeoutSettings.NavigationTimeout = value;196 }197 /// <summary>198 /// This setting will change the default maximum times for the following methods:199 /// - <see cref="GoBackAsync(NavigationOptions)"/>200 /// - <see cref="GoForwardAsync(NavigationOptions)"/>201 /// - <see cref="GoToAsync(string, NavigationOptions)"/>202 /// - <see cref="ReloadAsync(NavigationOptions)"/>203 /// - <see cref="SetContentAsync(string, NavigationOptions)"/>204 /// - <see cref="WaitForFunctionAsync(string, object[])"/>205 /// - <see cref="WaitForNavigationAsync(NavigationOptions)"/>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>868 /// <param name="xpath">A xpath selector of an element to wait for</param>869 /// <param name="options">Optional waiting parameters</param>870 /// <returns>A task which resolves when element specified by xpath string is added to DOM. 871 /// Resolves to `null` if waiting for `hidden: true` and xpath is not found in DOM.</returns>872 /// <example>873 /// <code>874 /// <![CDATA[875 /// var browser = await Puppeteer.LaunchAsync(new LaunchOptions());876 /// var page = await browser.NewPageAsync();877 /// string currentURL = null;878 /// page879 /// .WaitForXPathAsync("//img")880 /// .ContinueWith(_ => Console.WriteLine("First URL with image: " + currentURL));881 /// foreach (var current in new[] { "https://example.com", "https://google.com", "https://bbc.com" })882 /// {883 /// currentURL = current;884 /// await page.GoToAsync(currentURL);885 /// }886 /// await browser.CloseAsync();887 /// ]]>888 /// </code>889 /// </example>890 /// <seealso cref="WaitForSelectorAsync(string, WaitForSelectorOptions)"/>891 /// <seealso cref="Frame.WaitForXPathAsync(string, WaitForSelectorOptions)"/>892 public Task<ElementHandle> WaitForXPathAsync(string xpath, WaitForSelectorOptions options = null)893 => MainFrame.WaitForXPathAsync(xpath, options ?? new WaitForSelectorOptions());894 /// <summary>895 /// This resolves when the page navigates to a new URL or reloads.896 /// It is useful for when you run code which will indirectly cause the page to navigate.897 /// </summary>898 /// <param name="options">navigation options</param>899 /// <returns>Task which resolves to the main resource response. 900 /// In case of multiple redirects, the navigation will resolve with the response of the last redirect.901 /// In case of navigation to a different anchor or navigation due to History API usage, the navigation will resolve with `null`.902 /// </returns>903 /// <remarks>904 /// Usage of the <c>History API</c> <see href="https://developer.mozilla.org/en-US/docs/Web/API/History_API"/> to change the URL is considered a navigation905 /// </remarks>906 /// <example>907 /// <code>908 /// <![CDATA[909 /// var navigationTask = page.WaitForNavigationAsync();910 /// await page.ClickAsync("a.my-link");911 /// await navigationTask;912 /// ]]>913 /// </code>914 /// </example>915 public Task<Response> WaitForNavigationAsync(NavigationOptions options = null) => FrameManager.WaitForFrameNavigationAsync(FrameManager.MainFrame, options);916 /// <summary>917 /// Waits for a request.918 /// </summary>919 /// <example>920 /// <code>921 /// <![CDATA[922 /// var firstRequest = await page.WaitForRequestAsync("http://example.com/resource");923 /// return firstRequest.Url;924 /// ]]>925 /// </code>926 /// </example>927 /// <returns>A task which resolves when a matching request was made.</returns>928 /// <param name="url">URL to wait for.</param>929 /// <param name="options">Options.</param>930 public Task<Request> WaitForRequestAsync(string url, WaitForOptions options = null)931 => WaitForRequestAsync(request => request.Url == url, options);932 /// <summary>933 /// Waits for a request.934 /// </summary>935 /// <example>936 /// <code>937 /// <![CDATA[938 /// var request = await page.WaitForRequestAsync(request => request.Url === "http://example.com" && request.Method === HttpMethod.Get;939 /// return request.Url;940 /// ]]>941 /// </code>942 /// </example>943 /// <returns>A task which resolves when a matching request was made.</returns>944 /// <param name="predicate">Function which looks for a matching request.</param>945 /// <param name="options">Options.</param>946 public async Task<Request> WaitForRequestAsync(Func<Request, bool> predicate, WaitForOptions options = null)947 {948 var timeout = options?.Timeout ?? DefaultTimeout;949 var requestTcs = new TaskCompletionSource<Request>(TaskCreationOptions.RunContinuationsAsynchronously);950 void requestEventListener(object sender, RequestEventArgs e)951 {952 if (predicate(e.Request))953 {954 requestTcs.TrySetResult(e.Request);955 FrameManager.NetworkManager.Request -= requestEventListener;956 }957 }958 FrameManager.NetworkManager.Request += requestEventListener;959 await Task.WhenAny(requestTcs.Task, SessionClosedTask).WithTimeout(timeout, t =>960 {961 FrameManager.NetworkManager.Request -= requestEventListener;962 return new TimeoutException($"Timeout of {t.TotalMilliseconds} ms exceeded");963 }).ConfigureAwait(false);964 if (SessionClosedTask.IsFaulted)965 {966 await SessionClosedTask.ConfigureAwait(false);967 }968 return await requestTcs.Task.ConfigureAwait(false);969 }970 /// <summary>971 /// Waits for a response.972 /// </summary>973 /// <example>974 /// <code>975 /// <![CDATA[976 /// var firstResponse = await page.WaitForResponseAsync("http://example.com/resource");977 /// return firstResponse.Url;978 /// ]]>979 /// </code>980 /// </example>981 /// <returns>A task which resolves when a matching response is received.</returns>982 /// <param name="url">URL to wait for.</param>983 /// <param name="options">Options.</param>984 public Task<Response> WaitForResponseAsync(string url, WaitForOptions options = null)985 => WaitForResponseAsync(response => response.Url == url, options);986 /// <summary>987 /// Waits for a response.988 /// </summary>989 /// <example>990 /// <code>991 /// <![CDATA[992 /// var response = await page.WaitForResponseAsync(response => response.Url === "http://example.com" && response.Status === HttpStatus.Ok;993 /// return response.Url;994 /// ]]>995 /// </code>996 /// </example>997 /// <returns>A task which resolves when a matching response is received.</returns>998 /// <param name="predicate">Function which looks for a matching response.</param>999 /// <param name="options">Options.</param>1000 public async Task<Response> WaitForResponseAsync(Func<Response, bool> predicate, WaitForOptions options = null)1001 {1002 var timeout = options?.Timeout ?? DefaultTimeout;1003 var responseTcs = new TaskCompletionSource<Response>(TaskCreationOptions.RunContinuationsAsynchronously);1004 void responseEventListener(object sender, ResponseCreatedEventArgs e)1005 {1006 if (predicate(e.Response))1007 {1008 responseTcs.TrySetResult(e.Response);1009 FrameManager.NetworkManager.Response -= responseEventListener;1010 }1011 }1012 FrameManager.NetworkManager.Response += responseEventListener;1013 await Task.WhenAny(responseTcs.Task, SessionClosedTask).WithTimeout(timeout).ConfigureAwait(false);1014 if (SessionClosedTask.IsFaulted)1015 {1016 await SessionClosedTask.ConfigureAwait(false);1017 }1018 return await responseTcs.Task.ConfigureAwait(false);1019 }1020 /// <summary>1021 /// Navigate to the previous page in history.1022 /// </summary>1023 /// <returns>Task that resolves to the main resource response. In case of multiple redirects, 1024 /// the navigation will resolve with the response of the last redirect. If can not go back, resolves to null.</returns>1025 /// <param name="options">Navigation parameters.</param>1026 public Task<Response> GoBackAsync(NavigationOptions options = null) => GoAsync(-1, options);1027 /// <summary>1028 /// Navigate to the next page in history.1029 /// </summary>1030 /// <returns>Task that resolves to the main resource response. In case of multiple redirects, 1031 /// the navigation will resolve with the response of the last redirect. If can not go forward, resolves to null.</returns>1032 /// <param name="options">Navigation parameters.</param>1033 public Task<Response> GoForwardAsync(NavigationOptions options = null) => GoAsync(1, options);1034 /// <summary>1035 /// Resets the background color and Viewport after taking Screenshots using BurstMode.1036 /// </summary>1037 /// <returns>The burst mode off.</returns>1038 public Task SetBurstModeOffAsync()1039 {1040 return Task.CompletedTask;1041 }1042 #endregion1043 internal void OnPopup(Page popupPage) => Popup?.Invoke(this, new PopupEventArgs { PopupPage = popupPage });1044 #region Private Method1045 internal static async Task<Page> CreateAsync(1046 CDPSession client,1047 Target target,1048 bool ignoreHTTPSErrors,1049 ViewPortOptions defaultViewPort,1050 TaskQueue screenshotTaskQueue)1051 {1052 var page = new Page(client, target, screenshotTaskQueue);1053 await page.InitializeAsync(ignoreHTTPSErrors).ConfigureAwait(false);1054 if (defaultViewPort != null)1055 {1056 await page.SetViewportAsync(defaultViewPort).ConfigureAwait(false);1057 }1058 return page;1059 }1060 private async Task InitializeAsync(bool ignoreHTTPSErrors)1061 {1062 FrameManager = await FrameManager.CreateFrameManagerAsync(Client, this, ignoreHTTPSErrors, _timeoutSettings).ConfigureAwait(false);1063 var networkManager = FrameManager.NetworkManager;1064 Client.MessageReceived += Client_MessageReceived;1065 FrameManager.FrameAttached += (sender, e) => FrameAttached?.Invoke(this, e);1066 FrameManager.FrameDetached += (sender, e) => FrameDetached?.Invoke(this, e);1067 FrameManager.FrameNavigated += (sender, e) => FrameNavigated?.Invoke(this, e);1068 networkManager.Request += (sender, e) => Request?.Invoke(this, e);1069 networkManager.RequestFailed += (sender, e) => RequestFailed?.Invoke(this, e);1070 networkManager.Response += (sender, e) => Response?.Invoke(this, e);1071 networkManager.RequestFinished += (sender, e) => RequestFinished?.Invoke(this, e);1072 await Task.WhenAll(1073 Client.SendAsync("Target.setAutoAttach", new TargetSetAutoAttachRequest1074 {1075 AutoAttach = true,1076 WaitForDebuggerOnStart = false,1077 Flatten = true1078 }),1079 Client.SendAsync("Performance.enable", null),1080 Client.SendAsync("Log.enable", null)1081 ).ConfigureAwait(false);1082 try1083 {1084 await Client.SendAsync("Page.setInterceptFileChooserDialog", new PageSetInterceptFileChooserDialog1085 {1086 Enabled = true1087 }).ConfigureAwait(false);1088 }1089 catch1090 {1091 }1092 }1093 private async Task<Response> GoAsync(int delta, NavigationOptions options)1094 {1095 var history = await Client.SendAsync<PageGetNavigationHistoryResponse>("Page.getNavigationHistory").ConfigureAwait(false);1096 if (history.Entries.Count <= history.CurrentIndex + delta)1097 {1098 return null;1099 }1100 var entry = history.Entries[history.CurrentIndex + delta];1101 var waitTask = WaitForNavigationAsync(options);1102 await Task.WhenAll(1103 waitTask,1104 Client.SendAsync("Page.navigateToHistoryEntry", new PageNavigateToHistoryEntryRequest1105 {1106 EntryId = entry.Id1107 })1108 ).ConfigureAwait(false);1109 return waitTask.Result;1110 }1111 private decimal ConvertPrintParameterToInches(object parameter)1112 {1113 if (parameter == null)1114 {1115 return 0;1116 }1117 decimal pixels;1118 if (parameter is decimal || parameter is int)1119 {1120 pixels = Convert.ToDecimal(parameter);1121 }1122 else1123 {1124 var text = parameter.ToString();1125 var unit = text.Substring(text.Length - 2).ToLower();1126 string valueText;1127 if (_unitToPixels.ContainsKey(unit))1128 {1129 valueText = text.Substring(0, text.Length - 2);1130 }1131 else1132 {1133 // In case of unknown unit try to parse the whole parameter as number of pixels.1134 // This is consistent with phantom's paperSize behavior.1135 unit = "px";1136 valueText = text;1137 }1138 if (decimal.TryParse(valueText, NumberStyles.Any, CultureInfo.InvariantCulture.NumberFormat, out var number))1139 {1140 pixels = number * _unitToPixels[unit];1141 }1142 else1143 {1144 throw new ArgumentException($"Failed to parse parameter value: '{text}'", nameof(parameter));1145 }1146 }1147 return pixels / 96;1148 }1149 private async void Client_MessageReceived(object sender, MessageEventArgs e)1150 {1151 try1152 {1153 switch (e.MessageID)1154 {1155 case "Page.domContentEventFired":1156 DOMContentLoaded?.Invoke(this, EventArgs.Empty);1157 break;1158 case "Page.loadEventFired":1159 Load?.Invoke(this, EventArgs.Empty);1160 break;1161 case "Runtime.exceptionThrown":1162 HandleException(e.MessageData.ToObject<RuntimeExceptionThrownResponse>(true).ExceptionDetails);1163 break;1164 case "Inspector.targetCrashed":1165 OnTargetCrashed();1166 break;1167 case "Target.attachedToTarget":1168 await OnAttachedToTargetAsync(e.MessageData.ToObject<TargetAttachedToTargetResponse>(true)).ConfigureAwait(false);1169 break;1170 case "Runtime.bindingCalled":1171 await OnBindingCalled(e.MessageData.ToObject<BindingCalledResponse>(true)).ConfigureAwait(false);1172 break;1173 }1174 }1175 catch (Exception ex)1176 {1177 var message = $"Page failed to process {e.MessageID}. {ex.Message}. {ex.StackTrace}";1178 Client.Close(message);1179 }1180 }1181 private async Task OnBindingCalled(BindingCalledResponse e)1182 {1183 string expression;1184 try1185 {1186 var result = await ExecuteBinding(e).ConfigureAwait(false);1187 expression = EvaluationString(1188 @"function deliverResult(name, seq, result) {1189 window[name]['callbacks'].get(seq).resolve(result);1190 window[name]['callbacks'].delete(seq);1191 }",1192 e.BindingPayload.Name,1193 e.BindingPayload.Seq,1194 result);1195 }1196 catch (Exception ex)1197 {1198 if (ex is TargetInvocationException)1199 {1200 ex = ex.InnerException;1201 }1202 expression = EvaluationString(1203 @"function deliverError(name, seq, message, stack) {1204 const error = new Error(message);1205 error.stack = stack;1206 window[name]['callbacks'].get(seq).reject(error);1207 window[name]['callbacks'].delete(seq);1208 }",1209 e.BindingPayload.Name,1210 e.BindingPayload.Seq,1211 ex.Message,1212 ex.StackTrace);1213 }1214 Client.Send("Runtime.evaluate", new1215 {1216 expression,1217 contextId = e.ExecutionContextId1218 });1219 }1220 private async Task<object> ExecuteBinding(BindingCalledResponse e)1221 {1222 const string taskResultPropertyName = "Result";1223 object result;1224 var binding = _pageBindings[e.BindingPayload.Name];1225 var methodParams = binding.Method.GetParameters().Select(parameter => parameter.ParameterType).ToArray();1226 var args = e.BindingPayload.Args.Select((token, i) => token.ToObject(methodParams[i])).ToArray();1227 result = binding.DynamicInvoke(args);1228 if (result is Task taskResult)1229 {1230 await taskResult.ConfigureAwait(false);1231 if (taskResult.GetType().IsGenericType)1232 {1233 // the task is already awaited and therefore the call to property Result will not deadlock1234 result = taskResult.GetType().GetProperty(taskResultPropertyName).GetValue(taskResult);1235 }1236 }1237 return result;1238 }1239 private async Task OnAttachedToTargetAsync(TargetAttachedToTargetResponse e)1240 {1241 var targetInfo = e.TargetInfo;1242 var sessionId = e.SessionId;1243 if (targetInfo.Type != TargetType.Worker)1244 {1245 try1246 {1247 await Client.SendAsync("Target.detachFromTarget", new TargetDetachFromTargetRequest1248 {1249 SessionId = sessionId1250 }).ConfigureAwait(false);1251 }1252 catch { }1253 return;1254 }1255 }1256 private void OnTargetCrashed()1257 {1258 if (Error == null)1259 {1260 throw new TargetCrashedException();1261 }1262 Error.Invoke(this, new ErrorEventArgs("Page crashed!"));1263 }1264 private void HandleException(EvaluateExceptionResponseDetails exceptionDetails)1265 => PageError?.Invoke(this, new PageErrorEventArgs(GetExceptionMessage(exceptionDetails)));1266 private string GetExceptionMessage(EvaluateExceptionResponseDetails exceptionDetails)1267 {1268 if (exceptionDetails.Exception != null)1269 {1270 return exceptionDetails.Exception.Description;1271 }1272 var message = exceptionDetails.Text;1273 if (exceptionDetails.StackTrace != null)1274 {1275 foreach (var callframe in exceptionDetails.StackTrace.CallFrames)1276 {1277 var location = $"{callframe.Url}:{callframe.LineNumber}:{callframe.ColumnNumber}";1278 var functionName = callframe.FunctionName ?? "<anonymous>";1279 message += $"\n at {functionName} ({location})";...

Full Screen

Full Screen

PuppeteerBrowserBuilder.cs

Source:PuppeteerBrowserBuilder.cs Github

copy

Full Screen

...520 Convert.ToInt32((timeSpan ?? TimeSpan.FromSeconds(30)).Milliseconds), waitUntilNavigations);521 LogGoToResponse(stringUrl, resp);522 return page;523 }524 private void Page_PageError(object sender, PageErrorEventArgs e)525 {526 _logger.Error(e.Message);527 }528 private void Page_Request(object sender, RequestEventArgs e)529 {530 _logger.Debug($"{e.Request?.Method}:{e.Request?.ResourceType.ToString()}:{e.Request?.Url}");531 }532 private void LogGoToResponse(string stringUrl, Response resp)533 {534 if (resp != null)535 {536 var respLogEvent = new LogEventInfo(LogLevel.Info, string.Empty, $"goto response to {stringUrl}");537 respLogEvent.Properties["FromCache"] = resp.FromCache;538 respLogEvent.Properties["Url"] = resp.Url;...

Full Screen

Full Screen

BrowserContext.cs

Source:BrowserContext.cs Github

copy

Full Screen

...219 {220 Console.WriteLine($"Page_Metrics: {e.Title}, {e.Metrics.Count}");221 }222 }223 private void Page_PageError(object sender, PageErrorEventArgs e)224 {225 if (DebugInfo)226 {227 Console.WriteLine($"Page_PageError: {e.Message}");228 }229 }230 private void Page_Popup(object sender, PopupEventArgs e)231 {232 if (DebugInfo)233 {234 Console.WriteLine($"Page_Popup: {e.PopupPage.Url}");235 }236 }237 private void Page_Request(object sender, RequestEventArgs e)...

Full Screen

Full Screen

BrowserInstance.cs

Source:BrowserInstance.cs Github

copy

Full Screen

...150 private void OnCurrentBrowserInstanceOnClosed(object? sender, EventArgs args) =>151 App.PuppeteerLogger.Information($"Browser closed.");152 private void OnCurrentPageInstanceOnDialog(object? sender, DialogEventArgs args) =>153 App.PuppeteerLogger.Information($"{args.Dialog.DialogType} {args.Dialog.Message}");154 private void OnCurrentPageInstanceOnPageInstanceError(object? sender, PageErrorEventArgs args) =>155 App.PuppeteerLogger.Error($"PageError {args.Message}");156 private void OnCurrentPageInstanceOnClose(object? sender, EventArgs args) =>157 App.PuppeteerLogger.Information($"Page closed.");158 private void OnCurrentPageInstanceOnRequestFailed(object? sender, RequestEventArgs args) =>159 App.PuppeteerLogger.Error($"{args.Request.Method.Method} {args.Request.Url}");160 private void OnCurrentPageInstanceOnDomContentLoaded(object? sender, EventArgs args) =>161 App.PuppeteerLogger.Information($"DOMLoaded {CurrentPageInstance.Url}");162 private void OnCurrentPageInstanceOnError(object? sender, ErrorEventArgs args) =>163 App.PuppeteerLogger.Error($"{args.Error}");164 private void OnCurrentPageInstanceOnLoad(object? sender, EventArgs args) =>165 App.PuppeteerLogger.Information($"OnLoaded {CurrentPageInstance.Url}");166 private void OnCurrentPageInstanceOnFrameNavigated(object? sender, FrameEventArgs args) =>167 App.PuppeteerLogger.Information($"Navigated to {args.Frame.Url}");168 public void DeleteUserData()...

Full Screen

Full Screen

PageEventsPageErrorTests.cs

Source:PageEventsPageErrorTests.cs Github

copy

Full Screen

...15 [SkipBrowserFact(skipFirefox: true)]16 public async Task ShouldFire()17 {18 string error = null;19 void EventHandler(object sender, PageErrorEventArgs e)20 {21 error = e.Message;22 Page.PageError -= EventHandler;23 }24 Page.PageError += EventHandler;25 await Task.WhenAll(26 Page.GoToAsync(TestConstants.ServerUrl + "/error.html"),27 WaitEvent(Page.Client, "Runtime.exceptionThrown")28 );29 Assert.Contains("Fancy", error);30 }31 }32}...

Full Screen

Full Screen

PageErrorTests.cs

Source:PageErrorTests.cs Github

copy

Full Screen

...12 [Fact]13 public async Task ShouldFire()14 {15 string error = null;16 void EventHandler(object sender, PageErrorEventArgs e)17 {18 error = e.Message;19 Page.PageError -= EventHandler;20 }21 Page.PageError += EventHandler;22 await Task.WhenAll(23 Page.GoToAsync(TestConstants.ServerUrl + "/error.html"),24 WaitForEvents(Page.Client, "Runtime.exceptionThrown")25 );26 Assert.Contains("Fancy", error);27 }28 }29}...

Full Screen

Full Screen

PageErrorEventArgs.cs

Source:PageErrorEventArgs.cs Github

copy

Full Screen

...3{4 /// <summary>5 /// Page error event arguments.6 /// </summary>7 public class PageErrorEventArgs : EventArgs8 {9 /// <summary>10 /// Error Message11 /// </summary>12 /// <value>The message.</value>13 public string Message { get; set; }14 /// <summary>15 /// Initializes a new instance of the <see cref="PageErrorEventArgs"/> class.16 /// </summary>17 /// <param name="message">Message.</param>18 public PageErrorEventArgs(string message) => Message = message;19 }20}...

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 MainAsync(args).GetAwaiter().GetResult();9 }10 static async Task MainAsync(string[] args)11 {12 var browser = await Puppeteer.LaunchAsync(new LaunchOptions13 {14 Args = new string[] { "--no-sandbox" }15 });16 var page = await browser.NewPageAsync();17 page.PageError += Page_PageError;18 await page.WaitForSelectorAsync("input[title='Search']");19 await page.TypeAsync("input[title='Search']", "PuppeteerSharp");20 await page.Keyboard.PressAsync("Enter");21 await page.WaitForSelectorAsync("h3");22 await page.ScreenshotAsync("google.png");23 await browser.CloseAsync();24 }25 private static void Page_PageError(object sender, PageErrorEventArgs e)26 {27 Console.WriteLine(e.Message);28 }29 }30}

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 Console.WriteLine("Hello World!");9 MainAsync().Wait();10 }11 static async Task MainAsync()12 {13 var browser = await Puppeteer.LaunchAsync(new LaunchOptions14 {15 });16 var page = await browser.NewPageAsync();17 page.PageError += (sender, e) => { Console.WriteLine(e.Message); };

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 MainAsync().Wait();9 }10 static async Task MainAsync()11 {12 var browser = await Puppeteer.LaunchAsync(new LaunchOptions13 {14 });15 var page = await browser.NewPageAsync();16 page.PageError += async (sender, args) =>17 {18 Console.WriteLine("Error: " + args.Message);19 };20 }21 }22}

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 Console.WriteLine("Hello World!");9 }

Full Screen

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Puppeteer-sharp automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used method in PageErrorEventArgs

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful