How to use FrameManager class of PuppeteerSharp package

Best Puppeteer-sharp code snippet using PuppeteerSharp.FrameManager

Page.cs

Source:Page.cs Github

copy

Full Screen

...219        /// </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);...

Full Screen

Full Screen

ElementHandle.cs

Source:ElementHandle.cs Github

copy

Full Screen

...16    /// ElementHandles can be created by <see cref="PuppeteerSharp.Page.QuerySelectorAsync(string)"/> or <see cref="PuppeteerSharp.Page.QuerySelectorAllAsync(string)"/>.17    /// </summary>18    public class ElementHandle : JSHandle19    {20        private readonly FrameManager _frameManager;21        private readonly ILogger<ElementHandle> _logger;22        internal ElementHandle(23            ExecutionContext context,24            CDPSession client,25            RemoteObject remoteObject,26            Page page,27            FrameManager frameManager) : base(context, client, remoteObject)28        {29            Page = page;30            _frameManager = frameManager;31            _logger = client.LoggerFactory.CreateLogger<ElementHandle>();32        }33        internal Page Page { get; }34        /// <summary>35        /// This method scrolls element into view if needed, and then uses <seealso cref="PuppeteerSharp.Page.ScreenshotDataAsync(ScreenshotOptions)"/> to take a screenshot of the element.36        /// If the element is detached from DOM, the method throws an error.37        /// </summary>38        /// <returns>The task</returns>39        /// <param name="file">The file path to save the image to. The screenshot type will be inferred from file extension.40        /// If path is a relative path, then it is resolved relative to current working directory. If no path is provided,41        /// the image won't be saved to the disk.</param>...

Full Screen

Full Screen

FrameManager.cs

Source:FrameManager.cs Github

copy

Full Screen

...8using System.Linq;9using System.Threading.Tasks;10namespace PuppeteerSharp11{12    internal class FrameManager13    {14        private Dictionary<int, ExecutionContext> _contextIdToContext;15        private bool _ensureNewDocumentNavigation;16        private readonly ConcurrentDictionary<string, Frame> _frames;17        private const string RefererHeaderName = "referer";18        private readonly AsyncDictionaryHelper<string, Frame> _asyncFrames;19        private readonly List<string> _isolatedWorlds = new List<string>();20        private const string UtilityWorldName = "__puppeteer_utility_world__";21        private FrameManager(CDPSession client, Page page, bool ignoreHTTPSErrors, TimeoutSettings timeoutSettings)22        {23            Client = client;24            Page = page;25            _frames = new ConcurrentDictionary<string, Frame>();26            _contextIdToContext = new Dictionary<int, ExecutionContext>();27            NetworkManager = new NetworkManager(client, ignoreHTTPSErrors, this);28            TimeoutSettings = timeoutSettings;29            _asyncFrames = new AsyncDictionaryHelper<string, Frame>(_frames, "Frame {0} not found");30            Client.MessageReceived += Client_MessageReceived;31        }32        #region Properties33        internal event EventHandler<FrameEventArgs> FrameAttached;34        internal event EventHandler<FrameEventArgs> FrameDetached;35        internal event EventHandler<FrameEventArgs> FrameNavigated;36        internal event EventHandler<FrameEventArgs> FrameNavigatedWithinDocument;37        internal event EventHandler<FrameEventArgs> LifecycleEvent;38        internal CDPSession Client { get; }39        internal NetworkManager NetworkManager { get; }40        internal Frame MainFrame { get; set; }41        internal Page Page { get; }42        internal TimeoutSettings TimeoutSettings { get; }43        #endregion44        #region Public Methods45        internal static async Task<FrameManager> CreateFrameManagerAsync(46            CDPSession client,47            Page page,48            bool ignoreHTTPSErrors,49            TimeoutSettings timeoutSettings)50        {51            var frameManager = new FrameManager(client, page, ignoreHTTPSErrors, timeoutSettings);52            var getFrameTreeTask = client.SendAsync<PageGetFrameTreeResponse>("Page.getFrameTree");53            await Task.WhenAll(54                client.SendAsync("Page.enable"),55                getFrameTreeTask).ConfigureAwait(false);56            await frameManager.HandleFrameTreeAsync(new FrameTree(getFrameTreeTask.Result.FrameTree)).ConfigureAwait(false);57            await Task.WhenAll(58                client.SendAsync("Page.setLifecycleEventsEnabled", new PageSetLifecycleEventsEnabledRequest { Enabled = true }),59                client.SendAsync("Runtime.enable"),60                frameManager.NetworkManager.InitializeAsync()).ConfigureAwait(false);61            await frameManager.EnsureIsolatedWorldAsync().ConfigureAwait(false);62            return frameManager;63        }64        internal ExecutionContext ExecutionContextById(int contextId)65        {...

Full Screen

Full Screen

NetworkManager.cs

Source:NetworkManager.cs Github

copy

Full Screen

...23        private bool _protocolRequestInterceptionEnabled;24        private readonly bool _ignoreHTTPSErrors;25        private bool _userCacheDisabled;26        #endregion27        internal NetworkManager(CDPSession client, bool ignoreHTTPSErrors, FrameManager frameManager)28        {29            FrameManager = frameManager;30            _client = client;31            _ignoreHTTPSErrors = ignoreHTTPSErrors;32            _client.MessageReceived += Client_MessageReceived;33        }34        #region Public Properties35        internal Dictionary<string, string> ExtraHTTPHeaders => _extraHTTPHeaders?.Clone();36        internal event EventHandler<ResponseCreatedEventArgs> Response;37        internal event EventHandler<RequestEventArgs> Request;38        internal event EventHandler<RequestEventArgs> RequestFinished;39        internal event EventHandler<RequestEventArgs> RequestFailed;40        internal FrameManager FrameManager { get; set; }41        #endregion42        #region Public Methods43        internal async Task InitializeAsync()44        {45            await _client.SendAsync("Network.enable").ConfigureAwait(false);46            if (_ignoreHTTPSErrors)47            {48                await _client.SendAsync("Security.setIgnoreCertificateErrors", new SecuritySetIgnoreCertificateErrorsRequest49                {50                    Ignore = true51                }).ConfigureAwait(false);52            }53        }54        internal Task AuthenticateAsync(Credentials credentials)55        {56            _credentials = credentials;57            return UpdateProtocolRequestInterceptionAsync();58        }59        internal Task SetExtraHTTPHeadersAsync(Dictionary<string, string> extraHTTPHeaders)60        {61            _extraHTTPHeaders = new Dictionary<string, string>();62            foreach (var item in extraHTTPHeaders)63            {64                _extraHTTPHeaders[item.Key.ToLower()] = item.Value;65            }66            return _client.SendAsync("Network.setExtraHTTPHeaders", new NetworkSetExtraHTTPHeadersRequest67            {68                Headers = _extraHTTPHeaders69            });70        }71        internal async Task SetOfflineModeAsync(bool value)72        {73            if (_offine != value)74            {75                _offine = value;76                await _client.SendAsync("Network.emulateNetworkConditions", new NetworkEmulateNetworkConditionsRequest77                {78                    Offline = value,79                    Latency = 0,80                    DownloadThroughput = -1,81                    UploadThroughput = -182                }).ConfigureAwait(false);83            }84        }85        internal Task SetUserAgentAsync(string userAgent)86            => _client.SendAsync("Network.setUserAgentOverride", new NetworkSetUserAgentOverrideRequest87            {88                UserAgent = userAgent89            });90        internal Task SetCacheEnabledAsync(bool enabled)91        {92            _userCacheDisabled = !enabled;93            return UpdateProtocolCacheDisabledAsync();94        }95        internal Task SetRequestInterceptionAsync(bool value)96        {97            _userRequestInterceptionEnabled = value;98            return UpdateProtocolRequestInterceptionAsync();99        }100        #endregion101        #region Private Methods102        private Task UpdateProtocolCacheDisabledAsync()103            => _client.SendAsync("Network.setCacheDisabled", new NetworkSetCacheDisabledRequest104            {105                CacheDisabled = _userCacheDisabled || _protocolRequestInterceptionEnabled106            });107        private async void Client_MessageReceived(object sender, MessageEventArgs e)108        {109            try110            {111                switch (e.MessageID)112                {113                    case "Fetch.requestPaused":114                        await OnRequestPausedAsync(e.MessageData.ToObject<FetchRequestPausedResponse>(true)).ConfigureAwait(false);115                        break;116                    case "Fetch.authRequired":117                        await OnAuthRequiredAsync(e.MessageData.ToObject<FetchAuthRequiredResponse>(true)).ConfigureAwait(false);118                        break;119                    case "Network.requestWillBeSent":120                        await OnRequestWillBeSentAsync(e.MessageData.ToObject<RequestWillBeSentPayload>(true)).ConfigureAwait(false);121                        break;122                    case "Network.requestServedFromCache":123                        OnRequestServedFromCache(e.MessageData.ToObject<RequestServedFromCacheResponse>(true));124                        break;125                    case "Network.responseReceived":126                        OnResponseReceived(e.MessageData.ToObject<ResponseReceivedResponse>(true));127                        break;128                    case "Network.loadingFinished":129                        OnLoadingFinished(e.MessageData.ToObject<LoadingFinishedResponse>(true));130                        break;131                    case "Network.loadingFailed":132                        OnLoadingFailed(e.MessageData.ToObject<LoadingFailedResponse>(true));133                        break;134                }135            }136            catch (Exception ex)137            {138                var message = $"NetworkManager failed to process {e.MessageID}. {ex.Message}. {ex.StackTrace}";139                _client.Close(message);140            }141        }142        private void OnLoadingFailed(LoadingFailedResponse e)143        {144            // For certain requestIds we never receive requestWillBeSent event.145            // @see https://crbug.com/750469146            if (_requestIdToRequest.TryGetValue(e.RequestId, out var request))147            {148                request.Failure = e.ErrorText;149                request.Response?.BodyLoadedTaskWrapper.TrySetResult(true);150                _requestIdToRequest.TryRemove(request.RequestId, out _);151                if (request.InterceptionId != null)152                {153                    _attemptedAuthentications.Remove(request.InterceptionId);154                }155                RequestFailed?.Invoke(this, new RequestEventArgs156                {157                    Request = request158                });159            }160        }161        private void OnLoadingFinished(LoadingFinishedResponse e)162        {163            // For certain requestIds we never receive requestWillBeSent event.164            // @see https://crbug.com/750469165            if (_requestIdToRequest.TryGetValue(e.RequestId, out var request))166            {167                request.Response?.BodyLoadedTaskWrapper.TrySetResult(true);168                _requestIdToRequest.TryRemove(request.RequestId, out _);169                if (request.InterceptionId != null)170                {171                    _attemptedAuthentications.Remove(request.InterceptionId);172                }173                RequestFinished?.Invoke(this, new RequestEventArgs174                {175                    Request = request176                });177            }178        }179        private void OnResponseReceived(ResponseReceivedResponse e)180        {181            // FileUpload sends a response without a matching request.182            if (_requestIdToRequest.TryGetValue(e.RequestId, out var request))183            {184                var response = new Response(185                    _client,186                    request,187                    e.Response);188                request.Response = response;189                Response?.Invoke(this, new ResponseCreatedEventArgs190                {191                    Response = response192                });193            }194        }195        private async Task OnAuthRequiredAsync(FetchAuthRequiredResponse e)196        {197            var response = "Default";198            if (_attemptedAuthentications.Contains(e.RequestId))199            {200                response = "CancelAuth";201            }202            else if (_credentials != null)203            {204                response = "ProvideCredentials";205                _attemptedAuthentications.Add(e.RequestId);206            }207            var credentials = _credentials ?? new Credentials();208            try209            {210                await _client.SendAsync("Fetch.continueWithAuth", new ContinueWithAuthRequest211                {212                    RequestId = e.RequestId,213                    AuthChallengeResponse = new ContinueWithAuthRequestChallengeResponse214                    {215                        Response = response,216                        Username = credentials.Username,217                        Password = credentials.Password218                    }219                }).ConfigureAwait(false);220            }221            catch { }222        }223        private async Task OnRequestPausedAsync(FetchRequestPausedResponse e)224        {225            if (!_userRequestInterceptionEnabled && _protocolRequestInterceptionEnabled)226            {227                try228                {229                    await _client.SendAsync("Fetch.continueRequest", new FetchContinueRequestRequest230                    {231                        RequestId = e.RequestId232                    }).ConfigureAwait(false);233                }234                catch { }235            }236            var requestId = e.NetworkId;237            var interceptionId = e.RequestId;238            if (!string.IsNullOrEmpty(requestId))239            {240                if (_requestIdToRequestWillBeSentEvent.TryRemove(requestId, out var requestWillBeSentEvent))241                {242                    await OnRequestAsync(requestWillBeSentEvent, interceptionId).ConfigureAwait(false);243                }244                else245                {246                    _requestIdToInterceptionId[requestId] = interceptionId;247                }248            }249        }250        private async Task OnRequestAsync(RequestWillBeSentPayload e, string interceptionId)251        {252            Request request;253            var redirectChain = new List<Request>();254            if (e.RedirectResponse != null)255            {256                _requestIdToRequest.TryGetValue(e.RequestId, out request);257                // If we connect late to the target, we could have missed the requestWillBeSent event.258                if (request != null)259                {260                    HandleRequestRedirect(request, e.RedirectResponse);261                    redirectChain = request.RedirectChainList;262                }263            }264            if (!_requestIdToRequest.TryGetValue(e.RequestId, out var currentRequest) ||265              currentRequest.Frame == null)266            {267                var frame = !string.IsNullOrEmpty(e.FrameId) ? await FrameManager.TryGetFrameAsync(e.FrameId).ConfigureAwait(false) : null;268                request = new Request(269                    _client,270                    frame,271                    interceptionId,272                    _userRequestInterceptionEnabled,273                    e,274                    redirectChain);275                _requestIdToRequest[e.RequestId] = request;276                Request?.Invoke(this, new RequestEventArgs277                {278                    Request = request279                });280            }281        }...

Full Screen

Full Screen

DOMWorld.cs

Source:DOMWorld.cs Github

copy

Full Screen

...6namespace PuppeteerSharp7{8    internal class DOMWorld9    {10        private readonly FrameManager _frameManager;11        private readonly TimeoutSettings _timeoutSettings;12        private bool _detached;13        private TaskCompletionSource<ExecutionContext> _contextResolveTaskWrapper;14        private TaskCompletionSource<ElementHandle> _documentCompletionSource;15        internal List<WaitTask> WaitTasks { get; set; }16        internal Frame Frame { get; }17        public DOMWorld(FrameManager frameManager, Frame frame, TimeoutSettings timeoutSettings)18        {19            _frameManager = frameManager;20            Frame = frame;21            _timeoutSettings = timeoutSettings;22            SetContext(null);23            WaitTasks = new List<WaitTask>();24            _detached = false;25        }26        internal void SetContext(ExecutionContext context)27        {28            if (context != null)29            {30                _contextResolveTaskWrapper.TrySetResult(context);31                foreach (var waitTask in WaitTasks)...

Full Screen

Full Screen

ExecutionContext.cs

Source:ExecutionContext.cs Github

copy

Full Screen

...160            }161        }162        internal JSHandle CreateJSHandle(RemoteObject remoteObject)163            => remoteObject.Subtype == RemoteObjectSubtype.Node && Frame != null164                ? new ElementHandle(this, _client, remoteObject, Frame.FrameManager.Page, Frame.FrameManager)165                : new JSHandle(this, _client, remoteObject);166        private object FormatArgument(object arg)167        {168            switch (arg)169            {170                case BigInteger big:171                    return new { unserializableValue = $"{big}n" };172                case int integer when integer == -0:173                    return new { unserializableValue = "-0" };174                case double d:175                    if (double.IsPositiveInfinity(d))176                    {177                        return new { unserializableValue = "Infinity" };178                    }...

Full Screen

Full Screen

LifecycleWatcher.cs

Source:LifecycleWatcher.cs Github

copy

Full Screen

...16                [WaitUntilNavigation.Networkidle0] = "networkIdle",17                [WaitUntilNavigation.Networkidle2] = "networkAlmostIdle"18            };19        private static readonly WaitUntilNavigation[] _defaultWaitUntil = { WaitUntilNavigation.Load };20        private readonly FrameManager _frameManager;21        private readonly Frame _frame;22        private readonly IEnumerable<string> _expectedLifecycle;23        private readonly int _timeout;24        private readonly string _initialLoaderId;25        private Request _navigationRequest;26        private bool _hasSameDocumentNavigation;27        private TaskCompletionSource<bool> _newDocumentNavigationTaskWrapper;28        private TaskCompletionSource<bool> _sameDocumentNavigationTaskWrapper;29        private TaskCompletionSource<bool> _lifecycleTaskWrapper;30        private TaskCompletionSource<bool> _terminationTaskWrapper;31        public LifecycleWatcher(32            FrameManager frameManager,33            Frame frame,34            WaitUntilNavigation[] waitUntil,35            int timeout)36        {37            _expectedLifecycle = (waitUntil ?? _defaultWaitUntil).Select(w =>38            {39                var protocolEvent = _puppeteerToProtocolLifecycle.GetValueOrDefault(w);40                Contract.Assert(protocolEvent != null, $"Unknown value for options.waitUntil: {w}");41                return protocolEvent;42            });43            _frameManager = frameManager;44            _frame = frame;45            _initialLoaderId = frame.LoaderId;46            _timeout = timeout;47            _hasSameDocumentNavigation = false;48            _sameDocumentNavigationTaskWrapper = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);49            _newDocumentNavigationTaskWrapper = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);50            _lifecycleTaskWrapper = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);51            _terminationTaskWrapper = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);52            frameManager.LifecycleEvent += FrameManager_LifecycleEvent;53            frameManager.FrameNavigatedWithinDocument += NavigatedWithinDocument;54            frameManager.FrameDetached += OnFrameDetached;55            frameManager.NetworkManager.Request += OnRequest;56            frameManager.Client.Disconnected += OnClientDisconnected;57            CheckLifecycleComplete();58        }59        #region Properties60        public Task<Task> NavigationTask { get; internal set; }61        public Task<bool> SameDocumentNavigationTask => _sameDocumentNavigationTaskWrapper.Task;62        public Task<bool> NewDocumentNavigationTask => _newDocumentNavigationTaskWrapper.Task;63        public Response NavigationResponse => _navigationRequest?.Response;64        public Task TimeoutOrTerminationTask65            => _terminationTaskWrapper.Task.WithTimeout(_timeout);66        public Task LifecycleTask => _lifecycleTaskWrapper.Task;67        #endregion68        #region Private methods69        private void OnClientDisconnected(object sender, EventArgs e)70            => Terminate(new TargetClosedException("Navigation failed because browser has disconnected!", _frameManager.Client.CloseReason));71        void FrameManager_LifecycleEvent(object sender, FrameEventArgs e) => CheckLifecycleComplete();7273        private void OnFrameDetached(object sender, FrameEventArgs e)74        {75            var frame = e.Frame;76            if (_frame == frame)77            {78                Terminate(new PuppeteerException("Navigating frame was detached"));79                return;80            }81            CheckLifecycleComplete();82        }83        private void CheckLifecycleComplete()84        {85            // We expect navigation to commit.86            if (!CheckLifecycle(_frame, _expectedLifecycle))87            {88                return;89            }90            _lifecycleTaskWrapper.TrySetResult(true);91            if (_frame.LoaderId == _initialLoaderId && !_hasSameDocumentNavigation)92            {93                return;94            }95            if (_hasSameDocumentNavigation)96            {97                _sameDocumentNavigationTaskWrapper.TrySetResult(true);98            }99            if (_frame.LoaderId != _initialLoaderId)100            {101                _newDocumentNavigationTaskWrapper.TrySetResult(true);102            }103        }104        private void Terminate(PuppeteerException ex) => _terminationTaskWrapper.TrySetException(ex);105        private void OnRequest(object sender, RequestEventArgs e)106        {107            if (e.Request.Frame != _frame || !e.Request.IsNavigationRequest)108            {109                return;110            }111            _navigationRequest = e.Request;112        }113        private void NavigatedWithinDocument(object sender, FrameEventArgs e)114        {115            if (e.Frame != _frame)116            {117                return;118            }119            _hasSameDocumentNavigation = true;120            CheckLifecycleComplete();121        }122        private bool CheckLifecycle(Frame frame, IEnumerable<string> expectedLifecycle)123        {124            foreach (var item in expectedLifecycle)125            {126                if (!frame.LifecycleEvents.Contains(item))127                {128                    return false;129                }130            }131            foreach (var child in frame.ChildFrames)132            {133                if (!CheckLifecycle(child, expectedLifecycle))134                {135                    return false;136                }137            }138            return true;139        }140        public void Dispose() => Dispose(true);141        ~LifecycleWatcher() => Dispose(false);142        public void Dispose(bool disposing)143        {144            _frameManager.LifecycleEvent -= FrameManager_LifecycleEvent;145            _frameManager.FrameNavigatedWithinDocument -= NavigatedWithinDocument;146            _frameManager.FrameDetached -= OnFrameDetached;147            _frameManager.NetworkManager.Request -= OnRequest;148            _frameManager.Client.Disconnected -= OnClientDisconnected;149        }150        #endregion151    }152}...

Full Screen

Full Screen

NavigatorWatcher.cs

Source:NavigatorWatcher.cs Github

copy

Full Screen

...16            [WaitUntilNavigation.DOMContentLoaded] = "DOMContentLoaded",17            [WaitUntilNavigation.Networkidle0] = "networkIdle",18            [WaitUntilNavigation.Networkidle2] = "networkAlmostIdle"19        };20        private FrameManager _frameManager;21        private Frame _frame;22        private NavigationOptions _options;23        private IEnumerable<string> _expectedLifecycle;24        private int _timeout;25        private string _initialLoaderId;26        public NavigatorWatcher(FrameManager frameManager, Frame mainFrame, int timeout, NavigationOptions options)27        {28            var waitUntil = new[] { WaitUntilNavigation.Load };2930            if (options?.WaitUntil != null)31            {32                waitUntil = options.WaitUntil;33            }3435            _expectedLifecycle = waitUntil.Select(w =>36            {37                var protocolEvent = _puppeteerToProtocolLifecycle.GetValueOrDefault(w);38                Contract.Assert(protocolEvent != null, $"Unknown value for options.waitUntil: {w}");39                return protocolEvent;40            });4142            _frameManager = frameManager;43            _frame = mainFrame;44            _options = options;45            _initialLoaderId = mainFrame.LoaderId;46            _timeout = timeout;4748            frameManager.LifecycleEvent += FrameManager_LifecycleEvent;49            frameManager.FrameDetached += FrameManager_LifecycleEvent;50            LifeCycleCompleteTaskWrapper = new TaskCompletionSource<bool>();5152            NavigationTask = Task.WhenAny(new[]53            {54                CreateTimeoutTask(),55                LifeCycleCompleteTask,56            }).ContinueWith((task) =>57            {58                CleanUp();59                return task.GetAwaiter().GetResult();60            });61        }62        #region Properties63        public Task<Task> NavigationTask { get; internal set; }64        public Task<bool> LifeCycleCompleteTask => LifeCycleCompleteTaskWrapper.Task;65        public TaskCompletionSource<bool> LifeCycleCompleteTaskWrapper { get; }66        #endregion67        #region Public methods68        public void Cancel()69        {70            CleanUp();71        }72        #endregion73        #region Private methods74        void FrameManager_LifecycleEvent(object sender, FrameEventArgs e)75        {76            // We expect navigation to commit.77            if (_frame.LoaderId == _initialLoaderId)78            {79                return;80            }81            if (!CheckLifecycle(_frame, _expectedLifecycle))82            {83                return;84            }8586            if (!LifeCycleCompleteTaskWrapper.Task.IsCompleted)87            {88                LifeCycleCompleteTaskWrapper.SetResult(true);89            }90        }9192        private bool CheckLifecycle(Frame frame, IEnumerable<string> expectedLifecycle)93        {94            foreach (var item in expectedLifecycle)95            {96                if (!frame.LifecycleEvents.Contains(item))97                {98                    return false;99                }100            }101            foreach (var child in frame.ChildFrames)102            {103                if (!CheckLifecycle(child, expectedLifecycle))104                {105                    return false;106                }107            }108            return true;109        }110        private void CleanUp()111        {112            _frameManager.LifecycleEvent -= FrameManager_LifecycleEvent;113            _frameManager.FrameDetached -= FrameManager_LifecycleEvent;114        }115        private async Task CreateTimeoutTask()116        {117            var wrapper = new TaskCompletionSource<bool>();118119            if (_timeout == 0)120            {121                await Task.Delay(-1);122            }123            else124            {125                await Task.Delay(_timeout);126                throw new NavigationException($"Navigation Timeout Exceeded: {_timeout}ms exceeded");127            }
...

Full Screen

Full Screen

FrameManager

Using AI Code Generation

copy

Full Screen

1using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions2{3    Args = new[] { "--no-sandbox" }4}))5{6    var page = await browser.NewPageAsync();7    await page.ScreenshotAsync("screenshot.png");8}9using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions10{11    Args = new[] { "--no-sandbox" }12}))13{14    var page = await browser.NewPageAsync();15    await page.ScreenshotAsync("screenshot.png");16}17using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions18{19    Args = new[] { "--no-sandbox" }20}))21{22    var page = await browser.NewPageAsync();23    await page.ScreenshotAsync("screenshot.png");24}25using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions26{27    Args = new[] { "--no-sandbox" }28}))29{30    var page = await browser.NewPageAsync();31    await page.ScreenshotAsync("screenshot.png");32}33using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions34{35    Args = new[] { "--no-sandbox" }36}))37{38    var page = await browser.NewPageAsync();39    await page.ScreenshotAsync("screenshot.png");40}41using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions42{43    Args = new[] { "--no-sandbox" }44}))45{

Full Screen

Full Screen

FrameManager

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            var browser = await Puppeteer.LaunchAsync(new LaunchOptions9            {10                Args = new string[] { "--start-maximized" }11            });12            var page = await browser.NewPageAsync();13            await page.ScreenshotAsync("google.png");14            await browser.CloseAsync();15        }16    }17}

Full Screen

Full Screen

FrameManager

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            Console.WriteLine("Hello World!");9            {10            };11            using (var browser = await Puppeteer.LaunchAsync(options))12            {13                using (var page = await browser.NewPageAsync())14                {15                    await page.ScreenshotAsync("google.png");16                    var frames = await page.FramesAsync();17                    foreach (var frame in frames)18                    {19                        Console.WriteLine(frame.Name);20                    }21                    var frame2 = await page.FrameAsync("iframe");22                    var button = await frame2.QuerySelectorAsync("button");23                    await button.ClickAsync();

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.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful