How to use PageErrorEventArgs class of PuppeteerSharp package

Best Puppeteer-sharp code snippet using PuppeteerSharp.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 async Task Main(string[] args)7        {8            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);9            var browser = await Puppeteer.LaunchAsync(new LaunchOptions10            {11                Args = new string[] { "--enable-automation" }12            });13            var page = await browser.NewPageAsync();14            page.PageError += (sender, e) =>15            {16                Console.WriteLine(e.Message);17            };18            await page.EvaluateExpressionAsync("not.existing.object.property");19            await browser.CloseAsync();20        }21    }22}23    at ExecutionContext._evaluateInternal (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\node_modules\puppeteer\lib\ExecutionContext.js:122:19)24    at ExecutionContext.evaluate (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\node_modules\puppeteer\lib\ExecutionContext.js:48:16)25    at Frame.evaluate (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\node_modules\puppeteer\lib\FrameManager.js:1023:20)26    at Page.evaluate (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\node_modules\puppeteer\lib\Page.js:1241:33)27    at Program.Main (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\1.cs:24:43)28    at ExecutionContext._evaluateInternal (C:\Users\Karthik\source\repos\PuppeteerSharpExample\PuppeteerSharpExample\node_modules\puppeteer\lib\ExecutionContext.js:122:19)29    at ExecutionContext.evaluate (C:\Users\Karthik\source\repos\PuppeteerSharpExample

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5    {6        static async Task Main(string[] args)7        {8            var browser = await Puppeteer.LaunchAsync(new LaunchOptions9            {10                Args = new[] { "--no-sandbox" }11            });12            var page = await browser.NewPageAsync();13            page.PageError += Page_PageError;14            await page.ScreenshotAsync("google.png");15            Console.WriteLine("Hello World!");16            await browser.CloseAsync();17        }18        private static void Page_PageError(object sender, PageErrorEventArgs e)19        {20            Console.WriteLine(e.Message);21        }22    }23}24    at Object.handleInterceptedRequest (/home/abhishek/Downloads/PuppeteerTest/node_modules/puppeteer/lib/NetworkManager.js:186:15)25    at CDPSession.Page.client.on.event (/home/abhishek/Downloads/PuppeteerTest/node_modules/puppeteer/lib/NetworkManager.js:86:50)26    at CDPSession.emit (events.js:315:20)27    at CDPSession.EventEmitter.emit (domain.js:483:12)28    at CDPSession._onMessage (/home/abhishek/Downloads/PuppeteerTest/node_modules/puppeteer/lib/Connection.js:200:12)29    at Connection._onMessage (/home/abhishek/Downloads/PuppeteerTest/node_modules/puppeteer/lib/Connection.js:112:17)30    at WebSocketTransport._ws.addEventListener.event (/home/abhishek/Downloads/PuppeteerTest/node_modules/puppeteer/lib/WebSocketTransport.js:44:24)31    at WebSocket.onMessage (/home/abhishek/Downloads/PuppeteerTest/node_modules/ws/lib/event-target.js:132:16)32    at WebSocket.emit (events.js:315:20)33    at WebSocket.EventEmitter.emit (domain.js:483:12)34    at Receiver.receiverOnMessage (/home/abhishek/Downloads/PuppeteerTest/node_modules/ws/lib/websocket.js:789:20)35    at Receiver.emit (events.js:315:20)36    at Receiver.EventEmitter.emit (domain.js:483:12)37    at Receiver.dataMessage (/home/

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5    {6        static async Task Main(string[] args)7        {8            var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false });9            var page = await browser.NewPageAsync();10            await page.ScreenshotAsync("google.png");11            await browser.CloseAsync();12        }13        private static void Page_PageError(object sender, PageErrorEventArgs e)14        {15            Console.WriteLine(e.Message);16        }17    }18}

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using PuppeteerSharp;2using System;3using System.Threading.Tasks;4{5    {6        static async Task Main(string[] args)7        {8            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);9            var browser = await Puppeteer.LaunchAsync(new LaunchOptions10            {11            });12            var page = await browser.NewPageAsync();13            page.PageError += Page_PageError;14            await page.ScreenshotAsync("1.png");15            await browser.CloseAsync();16        }17        private static void Page_PageError(object sender, PageErrorEventArgs e)18        {19            Console.WriteLine(e.Message);20        }21    }22}23using PuppeteerSharp;24using System;25using System.Threading.Tasks;26{27    {28        static async Task Main(string[] args)29        {30            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);31            var browser = await Puppeteer.LaunchAsync(new LaunchOptions32            {33            });34            var page = await browser.NewPageAsync();35            page.PageError += Page_PageError;36            await page.ScreenshotAsync("1.png");37            await browser.CloseAsync();38        }39        private static void Page_PageError(object sender, PageErrorEventArgs e)40        {41            Console.WriteLine(e.Message);42        }43    }44}45using PuppeteerSharp;46using System;

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1var browser = await Puppeteer.LaunchAsync(new LaunchOptions2{3    Args = new[] { "--no-sandbox" }4});5var page = await browser.NewPageAsync();6await page.SetRequestInterceptionAsync(true);7page.Request += async (sender, e) =>8{9    await e.Request.ContinueAsync();10};11page.PageError += (sender, e) =>12{13    Console.WriteLine(e.Message);14};15await page.ScreenshotAsync("google.png");16await browser.CloseAsync();17var browser = await Puppeteer.LaunchAsync(new LaunchOptions18{19    Args = new[] { "--no-sandbox" }20});21var page = await browser.NewPageAsync();22await page.SetRequestInterceptionAsync(true);23page.Request += async (sender, e) =>24{25    await e.Request.ContinueAsync();26};27page.PageError += (sender, e) =>28{29    Console.WriteLine(e.Message);30};31await page.ScreenshotAsync("google.png");32await browser.CloseAsync();33var browser = await Puppeteer.LaunchAsync(new LaunchOptions34{35    Args = new[] { "--no-sandbox" }36});37var page = await browser.NewPageAsync();38await page.SetRequestInterceptionAsync(true);39page.Request += async (sender, e) =>40{41    await e.Request.ContinueAsync();42};43page.PageError += (sender, e) =>44{45    Console.WriteLine(e.Message);46};

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5    {6        static async Task Main(string[] args)7        {8            var browser = await Puppeteer.LaunchAsync(new LaunchOptions9            {10            });11            var page = await browser.NewPageAsync();12            page.PageError += Page_PageError;13            await page.EvaluateExpressionAsync("notExistingFunction()");14        }15        private static void Page_PageError(object sender, PageErrorEventArgs e)16        {17            Console.WriteLine("Page error: " + e.Message);18        }19    }20}21PuppeteerSharp - Wait for Navigation using WaitUntilNavigationAsync()

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5    {6        static async Task Main(string[] args)7        {8            var browser = await Puppeteer.LaunchAsync(new LaunchOptions9            {10            });11            var page = await browser.NewPageAsync();12            page.PageError += Page_PageError;13            await Task.Delay(30000);14            await browser.CloseAsync();15        }16        private static void Page_PageError(object sender, PageErrorEventArgs e)17        {18            Console.WriteLine(e.Message);19        }20    }21}

Full Screen

Full Screen

PageErrorEventArgs

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5    {6        static async Task Main(string[] args)7        {8            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);9            var browser = await Puppeteer.LaunchAsync(new LaunchOptions10            {11            });12            var page = await browser.NewPageAsync();13            page.PageError += Page_PageError;14            await page.EvaluateExpressionAsync("not_existing_function()");15            await browser.CloseAsync();16        }17        private static void Page_PageError(object sender, PageErrorEventArgs e)18        {19            Console.WriteLine(e.Message);20        }21    }22}23    at ExecutionContext._evaluateInternal (/Users/kblok/code/puppeteer-sharp/lib/ExecutionContext.js:122:13)24    at process._tickCallback (internal/process/next_tick.js:68:7)

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 methods 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