Best Puppeteer-sharp code snippet using PuppeteerSharp.BrowserContext.CloseAsync
PuppeteerBrowserBuilder.cs
Source:PuppeteerBrowserBuilder.cs
...270 await SetPageOptions(newPage);271 await newPage.WaitForSelectorAsync(selector);272 return newPage;273 }274 async Task IPuppeteerBrowser.CloseAsync()275 {276 await _browser.CloseAsync();277 }278 async Task<Page> IPuppeteerBrowser.ClickAndGetPage(ElementHandle element, string targetId)279 {280 await element.ClickAsync();281 var newTarget = await _browserContext.WaitForTargetAsync(a => a.Opener?.TargetId == targetId);282 var newPage = await newTarget.PageAsync();283 await SetPageOptions(newPage);284 return newPage;285 }286 async Task<Page> IPuppeteerBrowser.MouseClickAndGetPage(BoundingBox box, Page page)287 {288 int retryN = 0;289 return await _policyNoData.ExecuteAsync(async () =>290 {...
Browser.cs
Source:Browser.cs
...17 /// <![CDATA[18 /// var browser = await Puppeteer.LaunchAsync(new LaunchOptions());19 /// var page = await browser.NewPageAsync();20 /// await page.GoToAsync("https://example.com");21 /// await browser.CloseAsync();22 /// ]]>23 /// </code>24 /// An example of disconnecting from and reconnecting to a <see cref="Browser"/>:25 /// <code>26 /// <![CDATA[27 /// var browser = await Puppeteer.LaunchAsync(new LaunchOptions());28 /// var browserWSEndpoint = browser.WebSocketEndpoint;29 /// browser.Disconnect();30 /// var browser2 = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = browserWSEndpoint });31 /// await browser2.CloseAsync();32 /// ]]>33 /// </code>34 /// </example>35 public class Browser : IDisposable36 {37 /// <summary>38 /// Time in milliseconds for chromium process to exit gracefully.39 /// </summary>40 private const int CloseTimeout = 5000;41 /// <summary>42 /// Initializes a new instance of the <see cref="Browser"/> class.43 /// </summary>44 /// <param name="connection">The connection</param>45 /// <param name="contextIds">The context ids></param>46 /// <param name="ignoreHTTPSErrors">The option to ignoreHTTPSErrors</param>47 /// <param name="defaultViewport">Default viewport</param>48 /// <param name="chromiumProcess">The Chromium process</param>49 public Browser(50 Connection connection,51 string[] contextIds,52 bool ignoreHTTPSErrors,53 ViewPortOptions defaultViewport,54 ChromiumProcess chromiumProcess)55 {56 Connection = connection;57 IgnoreHTTPSErrors = ignoreHTTPSErrors;58 DefaultViewport = defaultViewport;59 TargetsMap = new Dictionary<string, Target>();60 ScreenshotTaskQueue = new TaskQueue();61 DefaultContext = new BrowserContext(Connection, this, null);62 _contexts = contextIds.ToDictionary(keySelector: contextId => contextId,63 elementSelector: contextId => new BrowserContext(Connection, this, contextId));64 Connection.Closed += (object sender, EventArgs e) => Disconnected?.Invoke(this, new EventArgs());65 Connection.MessageReceived += Connect_MessageReceived;66 _chromiumProcess = chromiumProcess;67 _logger = Connection.LoggerFactory.CreateLogger<Browser>();68 }69 #region Private members70 internal readonly Dictionary<string, Target> TargetsMap;71 private readonly Dictionary<string, BrowserContext> _contexts;72 private readonly ILogger<Browser> _logger;73 private readonly ChromiumProcess _chromiumProcess;74 private Task _closeTask;75 #endregion76 #region Properties77 /// <summary>78 /// 79 /// </summary>80 public event EventHandler Closed;81 /// <summary>82 /// Raised when puppeteer gets disconnected from the Chromium instance. This might happen because one of the following83 /// - Chromium is closed or crashed84 /// - <see cref="Disconnect"/> method was called85 /// </summary>86 public event EventHandler Disconnected;87 /// <summary>88 /// Raised when the url of a target changes89 /// </summary>90 public event EventHandler<TargetChangedArgs> TargetChanged;91 /// <summary>92 /// Raised when a target is created, for example when a new page is opened by <c>window.open</c> <see href="https://developer.mozilla.org/en-US/docs/Web/API/Window/open"/> or <see cref="NewPageAsync"/>.93 /// </summary>94 public event EventHandler<TargetChangedArgs> TargetCreated;95 /// <summary>96 /// Raised when a target is destroyed, for example when a page is closed97 /// </summary>98 public event EventHandler<TargetChangedArgs> TargetDestroyed;99 /// <summary>100 /// Gets the Browser websocket url101 /// </summary>102 /// <remarks>103 /// Browser websocket endpoint which can be used as an argument to <see cref="Puppeteer.ConnectAsync(ConnectOptions, ILoggerFactory)"/>.104 /// The format is <c>ws://${host}:${port}/devtools/browser/[id]</c>105 /// You can find the <c>webSocketDebuggerUrl</c> from <c>http://${host}:${port}/json/version</c>.106 /// Learn more about the devtools protocol <see href="https://chromedevtools.github.io/devtools-protocol"/> 107 /// and the browser endpoint <see href="https://chromedevtools.github.io/devtools-protocol/#how-do-i-access-the-browser-target"/>108 /// </remarks>109 public string WebSocketEndpoint => Connection.Url;110 /// <summary>111 /// Gets the spawned browser process. Returns <c>null</c> if the browser instance was created with <see cref="Puppeteer.ConnectAsync(ConnectOptions, ILoggerFactory)"/> method.112 /// </summary>113 public Process Process => _chromiumProcess?.Process;114 /// <summary>115 /// Gets or Sets whether to ignore HTTPS errors during navigation116 /// </summary>117 public bool IgnoreHTTPSErrors { get; set; }118 /// <summary>119 /// Gets a value indicating if the browser is closed120 /// </summary>121 public bool IsClosed => _closeTask != null && _closeTask.IsCompleted && _closeTask.Exception != null;122 /// <summary>123 /// Returns the default browser context. The default browser context can not be closed.124 /// </summary>125 /// <value>The default context.</value>126 public BrowserContext DefaultContext { get; }127 internal TaskQueue ScreenshotTaskQueue { get; set; }128 internal Connection Connection { get; }129 internal ViewPortOptions DefaultViewport { get; }130 #endregion131 #region Public Methods132 /// <summary>133 /// Creates a new page134 /// </summary>135 /// <returns>Task which resolves to a new <see cref="Page"/> object</returns>136 public Task<Page> NewPageAsync() => DefaultContext.NewPageAsync();137 /// <summary>138 /// Returns An Array of all active targets139 /// </summary>140 /// <returns>An Array of all active targets</returns>141 public Target[] Targets() => TargetsMap.Values.Where(target => target.IsInitialized).ToArray();142 /// <summary>143 /// A target associated with the browser.144 /// </summary>145 public Target Target => Targets().FirstOrDefault(t => t.Type == TargetType.Browser);146 /// <summary>147 /// Creates a new incognito browser context. This won't share cookies/cache with other browser contexts.148 /// </summary>149 /// <returns>Task which resolves to a new <see cref="BrowserContext"/> object</returns>150 /// <example>151 /// <code>152 /// <![CDATA[153 /// using(var browser = await Puppeteer.LaunchAsync(new LaunchOptions()))154 /// {155 /// // Create a new incognito browser context.156 /// var context = await browser.CreateIncognitoBrowserContextAsync();157 /// // Create a new page in a pristine context.158 /// var page = await context.NewPageAsync();159 /// // Do stuff160 /// await page.GoToAsync("https://example.com");161 /// }162 /// ]]>163 /// </code>164 /// </example>165 public async Task<BrowserContext> CreateIncognitoBrowserContextAsync()166 {167 var response = await Connection.SendAsync<CreateBrowserContextResponse>("Target.createBrowserContext", new { }).ConfigureAwait(false);168 var context = new BrowserContext(Connection, this, response.BrowserContextId);169 _contexts[response.BrowserContextId] = context;170 return context;171 }172 /// <summary>173 /// Returns an array of all open <see cref="BrowserContext"/>. In a newly created browser, this will return a single instance of <see cref="BrowserContext"/>174 /// </summary>175 /// <returns>An array of <see cref="BrowserContext"/> objects</returns>176 public BrowserContext[] BrowserContexts()177 {178 var allContexts = new BrowserContext[_contexts.Count + 1];179 allContexts[0] = DefaultContext;180 _contexts.Values.CopyTo(allContexts, 1);181 return allContexts;182 }183 /// <summary>184 /// Returns a Task which resolves to an array of all open pages.185 /// Non visible pages, such as <c>"background_page"</c>, will not be listed here. You can find them using <see cref="Target.PageAsync"/>186 /// </summary>187 /// <returns>Task which resolves to an array of all open pages inside the Browser. 188 /// In case of multiple browser contexts, the method will return an array with all the pages in all browser contexts.189 /// </returns>190 public async Task<Page[]> PagesAsync()191 => (await Task.WhenAll(192 BrowserContexts().Select(t => t.PagesAsync())).ConfigureAwait(false)193 ).SelectMany(p => p).ToArray();194 /// <summary>195 /// Gets the browser's version196 /// </summary>197 /// <returns>For headless Chromium, this is similar to <c>HeadlessChrome/61.0.3153.0</c>. For non-headless, this is similar to <c>Chrome/61.0.3153.0</c></returns>198 /// <remarks>199 /// the format of <see cref="GetVersionAsync"/> might change with future releases of Chromium200 /// </remarks>201 public async Task<string> GetVersionAsync()202 {203 var version = await Connection.SendAsync("Browser.getVersion").ConfigureAwait(false);204 return version[MessageKeys.Product].AsString();205 }206 /// <summary>207 /// Gets the browser's original user agent208 /// </summary>209 /// <returns>Task which resolves to the browser's original user agent</returns>210 /// <remarks>211 /// Pages can override browser user agent with <see cref="Page.SetUserAgentAsync(string)"/>212 /// </remarks>213 public async Task<string> GetUserAgentAsync()214 {215 var version = await Connection.SendAsync("Browser.getVersion").ConfigureAwait(false);216 return version[MessageKeys.UserAgent].AsString();217 }218 /// <summary>219 /// Disconnects Puppeteer from the browser, but leaves the Chromium process running. After calling <see cref="Disconnect"/>, the browser object is considered disposed and cannot be used anymore220 /// </summary>221 public void Disconnect() => Connection.Dispose();222 /// <summary>223 /// Closes Chromium and all of its pages (if any were opened). The browser object itself is considered disposed and cannot be used anymore224 /// </summary>225 /// <returns>Task</returns>226 public Task CloseAsync() => _closeTask ?? (_closeTask = CloseCoreAsync());227 private async Task CloseCoreAsync()228 {229 try230 {231 try232 {233 // Initiate graceful browser close operation but don't await it just yet,234 // because we want to ensure chromium process shutdown first.235 var browserCloseTask = Connection.SendAsync("Browser.close", null);236 if (_chromiumProcess != null)237 {238 // Notify chromium process that exit is expected, but should be enforced if it239 // doesn't occur withing the close timeout.240 var closeTimeout = TimeSpan.FromMilliseconds(CloseTimeout);241 await _chromiumProcess.EnsureExitAsync(closeTimeout).ConfigureAwait(false);242 }243 // Now we can safely await the browser close operation without risking keeping chromium244 // process running for indeterminate period.245 await browserCloseTask.ConfigureAwait(false);246 }247 finally248 {249 Disconnect();250 }251 }252 catch (Exception ex)253 {254 _logger.LogError(ex, ex.Message);255 if (_chromiumProcess != null)256 {257 await _chromiumProcess.KillAsync().ConfigureAwait(false);258 }259 }260 Closed?.Invoke(this, new EventArgs());261 }262 #endregion263 #region Private Methods264 internal void ChangeTarget(Target target)265 {266 var args = new TargetChangedArgs { Target = target };267 TargetChanged?.Invoke(this, args);268 target.BrowserContext.OnTargetChanged(this, args);269 }270 internal async Task<Page> CreatePageInContextAsync(string contextId)271 {272 var args = new Dictionary<string, object> { [MessageKeys.Url] = "about:blank" };273 if (contextId != null)274 {275 args[MessageKeys.BrowserContextId] = contextId;276 }277 var targetId = (await Connection.SendAsync("Target.createTarget", args).ConfigureAwait(false))[MessageKeys.TargetId].ToString();278 var target = TargetsMap[targetId];279 await target.InitializedTask.ConfigureAwait(false);280 return await target.PageAsync().ConfigureAwait(false);281 }282 internal async Task DisposeContextAsync(string contextId)283 {284 await Connection.SendAsync("Target.disposeBrowserContext", new { browserContextId = contextId }).ConfigureAwait(false);285 _contexts.Remove(contextId);286 }287 private async void Connect_MessageReceived(object sender, MessageEventArgs e)288 {289 switch (e.MessageID)290 {291 case "Target.targetCreated":292 await CreateTargetAsync(e.MessageData.ToObject<TargetCreatedResponse>()).ConfigureAwait(false);293 return;294 case "Target.targetDestroyed":295 await DestroyTargetAsync(e.MessageData.ToObject<TargetDestroyedResponse>()).ConfigureAwait(false);296 return;297 case "Target.targetInfoChanged":298 ChangeTargetInfo(e.MessageData.ToObject<TargetCreatedResponse>());299 return;300 }301 }302 private void ChangeTargetInfo(TargetCreatedResponse e)303 {304 if (!TargetsMap.ContainsKey(e.TargetInfo.TargetId))305 {306 throw new InvalidTargetException("Target should exists before ChangeTargetInfo");307 }308 var target = TargetsMap[e.TargetInfo.TargetId];309 target.TargetInfoChanged(e.TargetInfo);310 }311 private async Task DestroyTargetAsync(TargetDestroyedResponse e)312 {313 if (!TargetsMap.ContainsKey(e.TargetId))314 {315 throw new InvalidTargetException("Target should exists before DestroyTarget");316 }317 var target = TargetsMap[e.TargetId];318 TargetsMap.Remove(e.TargetId);319 target.CloseTaskWrapper.TrySetResult(true);320 if (await target.InitializedTask.ConfigureAwait(false))321 {322 var args = new TargetChangedArgs { Target = target };323 TargetDestroyed?.Invoke(this, args);324 target.BrowserContext.OnTargetDestroyed(this, args);325 }326 }327 private async Task CreateTargetAsync(TargetCreatedResponse e)328 {329 var targetInfo = e.TargetInfo;330 var browserContextId = targetInfo.BrowserContextId;331 if (!(browserContextId != null && _contexts.TryGetValue(browserContextId, out var context)))332 {333 context = DefaultContext;334 }335 var target = new Target(336 e.TargetInfo,337 info => Connection.CreateSessionAsync(info),338 context);339 if (TargetsMap.ContainsKey(e.TargetInfo.TargetId))340 {341 _logger.LogError("Target should not exist before targetCreated");342 }343 TargetsMap[e.TargetInfo.TargetId] = target;344 if (await target.InitializedTask.ConfigureAwait(false))345 {346 var args = new TargetChangedArgs { Target = target };347 TargetCreated?.Invoke(this, args);348 context.OnTargetCreated(this, args);349 }350 }351 internal static async Task<Browser> CreateAsync(352 Connection connection,353 string[] contextIds,354 bool ignoreHTTPSErrors,355 ViewPortOptions defaultViewPort,356 ChromiumProcess chromiumProcess)357 {358 var browser = new Browser(connection, contextIds, ignoreHTTPSErrors, defaultViewPort, chromiumProcess);359 await connection.SendAsync("Target.setDiscoverTargets", new360 {361 discover = true362 }).ConfigureAwait(false);363 return browser;364 }365 #endregion366 #region IDisposable367 /// <summary>368 /// Closes <see cref="Connection"/> and any Chromium <see cref="Process"/> that was369 /// created by Puppeteer.370 /// </summary>371 public void Dispose() => _ = CloseAsync();372 #endregion373 }374}...
VkBrwUserFactory.cs
Source:VkBrwUserFactory.cs
...40 await userPage.SetUserAgentAsync("Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 74.0.3723.0 Safari / 537.36");41 user.Communitites = await GetCommunities(userContext, userPage, user);42 bool successParse = long.TryParse(user.ProfileLink.Split('/').LastOrDefault()?.Substring(2), out long parseResult);43 user.UserId = successParse ? parseResult : default;44 await userPage.CloseAsync();45 await userContext.CloseAsync();46 return user;47 }48 public async Task<List<VkBrwCommunity>> GetCommunities(BrowserContext userContext, Page userPage, VkBrwUser user)49 {50 List<VkBrwCommunity> nwPages = new List<VkBrwCommunity>();51 await userPage.GoToAsync(user.ProfileLink);52 ElementHandle userIsLoaded = await userPage.WaitForSelectorAsync("#page_info_wrap.page_info_wrap");53 ElementHandle[] hiddenProfileBlock = await userPage.QuerySelectorAllAsync("h5.profile_deleted_text");54 if (hiddenProfileBlock.Length == 0)55 {56 ElementHandle idolsLoaded = await userPage.WaitForSelectorAsync("#profile_idols");57 // ÐнÑеÑеÑнÑе ÑÑÑаниÑÑ58 ElementHandle[] noteworthyPagesBlock = await userPage.QuerySelectorAllAsync("#profile_idols.module.clear.page_list_module._module");59 if (noteworthyPagesBlock.Length == 1)60 {61 ElementHandle noteworthyPages = noteworthyPagesBlock.First();62 ElementHandle[] noteworthyPagesHeaderBlock = await noteworthyPages.QuerySelectorAllAsync("a.module_header");63 if (noteworthyPagesHeaderBlock.Length == 1)64 {65 ClickOptions clickOptions = new ClickOptions { Delay = new Random().Next(30, 100) };66 ElementHandle noteworthyPagesLinkElement = noteworthyPagesHeaderBlock.First();67 await noteworthyPagesLinkElement.ClickAsync(clickOptions);68 ElementHandle noteworthyPagesIsOpened = await userPage.WaitForSelectorAsync("#fans_rowsidols.fans_rows.fans_idols");69 ElementHandle[] closeBlock = await userPage.QuerySelectorAllAsync("div.box_x_button");70 if (closeBlock.Length == 1)71 {72 ElementHandle[] pagesCountBlock = await userPage.QuerySelectorAllAsync("span.ui_box_header_cnt");73 if (pagesCountBlock.Length == 1)74 {75 ElementHandle pagesTotalCountElement = pagesCountBlock.First();76 string pagesTotalCountValue = await pagesTotalCountElement.EvaluateFunctionAsync<string>("('span', span => span.innerText)");77 if (!string.IsNullOrEmpty(pagesTotalCountValue))78 {79 bool pagesTotalCountReceived = int.TryParse(pagesTotalCountValue, out int pagesTotalCount);80 if (pagesTotalCountReceived && pagesTotalCount > 0)81 {82 ElementHandle[] pagesVisibleElements = await userPage.QuerySelectorAllAsync("div.fans_idol_row.inl_bl");83 if (pagesVisibleElements.Length < pagesTotalCount)84 {85 PressOptions pressOptions = new PressOptions { Delay = new Random().Next(20, 40)};86 await userPage.FocusAsync("input");87 await userPage.Keyboard.PressAsync("Tab", pressOptions);88 int visiblePagesCounter = pagesVisibleElements.Length;89 while (visiblePagesCounter < pagesTotalCount)90 {91 await userPage.Keyboard.PressAsync("PageDown", pressOptions);92 await Task.Delay(new Random().Next(250, 350));93 await userPage.Keyboard.PressAsync("PageDown", pressOptions);94 await Task.Delay(new Random().Next(250, 350));95 await userPage.Keyboard.PressAsync("PageDown", pressOptions);96 await Task.Delay(new Random().Next(250, 350));97 await userPage.Keyboard.PressAsync("PageDown", pressOptions);98 await Task.Delay(new Random().Next(250, 350));99 ElementHandle[] newPagesVisibleElements = await userPage.QuerySelectorAllAsync("div.fans_idol_row.inl_bl");100 if (newPagesVisibleElements.Length == visiblePagesCounter)101 {102 break;103 }104 visiblePagesCounter = newPagesVisibleElements.Length;105 }106 }107 ElementHandle[] nwPagesElements = await userPage.QuerySelectorAllAsync("div.fans_idol_info");108 foreach (var element in nwPagesElements)109 {110 VkBrwCommunity community = await GetCommunityAsync(element, userContext);111 if (community != null)112 {113 nwPages.Add(community);114 community.Users.Add(user);115 }116 }117 }118 }119 }120 ElementHandle closeButtonElement = closeBlock.First();121 await closeButtonElement.ClickAsync(clickOptions);122 }123 }124 }125 }126 else127 {128 user.HiddenProfile = true;129 ElementHandle[] pageNameElements = await userPage.QuerySelectorAllAsync("h2.page_name");130 if (pageNameElements.Length == 1)131 {132 var pageElement = pageNameElements.First();133 user.PageName = await pageElement.EvaluateFunctionAsync<string>("('h2', h2 => h2.innerText)");134 }135 }136 return nwPages;137 }138 private async Task<VkBrwCommunity> GetCommunityAsync(ElementHandle communityElement, BrowserContext userContext)139 {140 ElementHandle communityNameElement = await communityElement.QuerySelectorAsync("div.fans_idol_name");141 if (communityNameElement != null)142 {143 VkBrwCommunity nwPage = new VkBrwCommunity();144 ////await page.EvaluateFunctionAsync(@"() => {145 //// Array.from(document.querySelectorAll('li'))146 //// .find(l => l.querySelector('span').innerText === 'fire').querySelector('INPUT').click();147 ////}");148 // equals to $eval('a', a => a.innerText)149 nwPage.Name = await communityNameElement.EvaluateFunctionAsync<string>("('a', a => a.innerText)");150 ElementHandle communityLinkElement = await communityElement.QuerySelectorAsync("a.fans_idol_lnk");151 nwPage.CommunityUrl = await communityLinkElement.EvaluateFunctionAsync<string>("('a', a => a.href)");152 ElementHandle communityStatusElement = await communityElement.QuerySelectorAsync("div.fans_idol_status");153 nwPage.Status = await communityStatusElement.EvaluateFunctionAsync<string>("('div', div => div.innerText)");154 ElementHandle communitySizeElement = await communityElement.QuerySelectorAsync("div.fans_idol_size");155 nwPage.Size = await communitySizeElement.EvaluateFunctionAsync<string>("('div', div => div.innerText)");156 if (!nwPage.CommunityUrl.Contains("event"))157 {158 await GetCommunityDetailsAsync(userContext, nwPage);159 }160 return nwPage;161 }162 else163 {164 return null;165 }166 }167 private async Task GetCommunityDetailsAsync(BrowserContext browserContext, VkBrwCommunity community)168 {169 Page communityPage = await browserContext.NewPageAsync();170 ////groupPage.EvaluateFunctionAsync($"() => window.open('{groupUrl}')").GetAwaiter().GetResult();171 ////Target newWindowTarget = browser.WaitForTargetAsync(target => target.Url == "https://www.example.com/").Result;172 ////Page newPage = newWindowTarget.PageAsync().Result;173 try174 {175 await communityPage.GoToAsync(community.CommunityUrl);176 }177 catch (NavigationException)178 {179 return;180 }181 WaitForSelectorOptions waitSelectorOptions = new WaitForSelectorOptions { Timeout = 10000 };182 ElementHandle communityLoadedElement = await communityPage.WaitForSelectorAsync("div#page_wrap.scroll_fix_wrap._page_wrap", waitSelectorOptions);183 if (communityLoadedElement != null)184 {185 ElementHandle communityBlockedElement = await communityPage.QuerySelectorAsync("div.groups_blocked");186 if (communityBlockedElement != null)187 {188 community.Blocked = true;189 }190 else191 {192 community.Type = await GetCommunityTypeAsync(communityPage);193 community.CommunityId = await GetCommunityIdAsync(communityPage, community.Type);194 }195 }196 await communityPage.CloseAsync();197 }198 private async Task<CommunityTypes> GetCommunityTypeAsync(Page communityPage)199 {200 ElementHandle publicElement = await communityPage.QuerySelectorAsync("#public_followers.module.clear.people_module._module");201 if (publicElement!= null)202 {203 return CommunityTypes.Public;204 }205 ElementHandle groupElement = await communityPage.QuerySelectorAsync("#group_followers.module.clear.people_module._module");206 if (groupElement != null)207 {208 return CommunityTypes.Group;209 }210 if (communityPage.Url.Contains("event"))...
BrowserContextTests.cs
Source:BrowserContextTests.cs
...21 {22 Assert.Single(Browser.BrowserContexts());23 var defaultContext = Browser.BrowserContexts()[0];24 Assert.False(defaultContext.IsIncognito);25 var exception = await Assert.ThrowsAsync<PuppeteerException>(defaultContext.CloseAsync);26 Assert.Same(defaultContext, Browser.DefaultContext);27 Assert.Contains("cannot be closed", exception.Message);28 }29 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should create new incognito context")]30 [PuppeteerFact]31 public async Task ShouldCreateNewIncognitoContext()32 {33 Assert.Single(Browser.BrowserContexts());34 var context = await Browser.CreateIncognitoBrowserContextAsync();35 Assert.True(context.IsIncognito);36 Assert.Equal(2, Browser.BrowserContexts().Length);37 Assert.Contains(context, Browser.BrowserContexts());38 await context.CloseAsync();39 Assert.Single(Browser.BrowserContexts());40 }41 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should close all belonging targets once closing context")]42 [PuppeteerFact]43 public async Task ShouldCloseAllBelongingTargetsOnceClosingContext()44 {45 Assert.Single((await Browser.PagesAsync()));46 var context = await Browser.CreateIncognitoBrowserContextAsync();47 await context.NewPageAsync();48 Assert.Equal(2, (await Browser.PagesAsync()).Length);49 Assert.Single((await context.PagesAsync()));50 await context.CloseAsync();51 Assert.Single((await Browser.PagesAsync()));52 }53 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "window.open should use parent tab context")]54 [SkipBrowserFact(skipFirefox: true)]55 public async Task WindowOpenShouldUseParentTabContext()56 {57 var context = await Browser.CreateIncognitoBrowserContextAsync();58 var page = await context.NewPageAsync();59 await page.GoToAsync(TestConstants.EmptyPage);60 var popupTargetCompletion = new TaskCompletionSource<Target>();61 Browser.TargetCreated += (_, e) => popupTargetCompletion.SetResult(e.Target);62 await Task.WhenAll(63 popupTargetCompletion.Task,64 page.EvaluateFunctionAsync("url => window.open(url)", TestConstants.EmptyPage)65 );66 var popupTarget = await popupTargetCompletion.Task;67 Assert.Same(context, popupTarget.BrowserContext);68 await context.CloseAsync();69 }70 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should fire target events")]71 [SkipBrowserFact(skipFirefox: true)]72 public async Task ShouldFireTargetEvents()73 {74 var context = await Browser.CreateIncognitoBrowserContextAsync();75 var events = new List<string>();76 context.TargetCreated += (_, e) => events.Add("CREATED: " + e.Target.Url);77 context.TargetChanged += (_, e) => events.Add("CHANGED: " + e.Target.Url);78 context.TargetDestroyed += (_, e) => events.Add("DESTROYED: " + e.Target.Url);79 var page = await context.NewPageAsync();80 await page.GoToAsync(TestConstants.EmptyPage);81 await page.CloseAsync();82 Assert.Equal(new[] {83 $"CREATED: {TestConstants.AboutBlank}",84 $"CHANGED: {TestConstants.EmptyPage}",85 $"DESTROYED: {TestConstants.EmptyPage}"86 }, events);87 await context.CloseAsync();88 }89 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should isolate local storage and cookies")]90 [PuppeteerFact]91 public async Task ShouldIsolateLocalStorageAndCookies()92 {93 // Create two incognito contexts.94 var context1 = await Browser.CreateIncognitoBrowserContextAsync();95 var context2 = await Browser.CreateIncognitoBrowserContextAsync();96 Assert.Empty(context1.Targets());97 Assert.Empty(context2.Targets());98 // Create a page in first incognito context.99 var page1 = await context1.NewPageAsync();100 await page1.GoToAsync(TestConstants.EmptyPage);101 await page1.EvaluateExpressionAsync(@"{102 localStorage.setItem('name', 'page1');103 document.cookie = 'name=page1';104 }");105 Assert.Single(context1.Targets());106 Assert.Empty(context2.Targets());107 // Create a page in second incognito context.108 var page2 = await context2.NewPageAsync();109 await page2.GoToAsync(TestConstants.EmptyPage);110 await page2.EvaluateExpressionAsync(@"{111 localStorage.setItem('name', 'page2');112 document.cookie = 'name=page2';113 }");114 Assert.Single(context1.Targets());115 Assert.Equal(page1.Target, context1.Targets()[0]);116 Assert.Single(context2.Targets());117 Assert.Equal(page2.Target, context2.Targets()[0]);118 // Make sure pages don't share localstorage or cookies.119 Assert.Equal("page1", await page1.EvaluateExpressionAsync<string>("localStorage.getItem('name')"));120 Assert.Equal("name=page1", await page1.EvaluateExpressionAsync<string>("document.cookie"));121 Assert.Equal("page2", await page2.EvaluateExpressionAsync<string>("localStorage.getItem('name')"));122 Assert.Equal("name=page2", await page2.EvaluateExpressionAsync<string>("document.cookie"));123 // Cleanup contexts.124 await Task.WhenAll(context1.CloseAsync(), context2.CloseAsync());125 Assert.Single(Browser.BrowserContexts());126 }127 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should work across sessions")]128 [SkipBrowserFact(skipFirefox: true)]129 public async Task ShouldWorkAcrossSessions()130 {131 Assert.Single(Browser.BrowserContexts());132 var context = await Browser.CreateIncognitoBrowserContextAsync();133 Assert.Equal(2, Browser.BrowserContexts().Length);134 var remoteBrowser = await Puppeteer.ConnectAsync(new ConnectOptions135 {136 BrowserWSEndpoint = Browser.WebSocketEndpoint137 });138 var contexts = remoteBrowser.BrowserContexts();139 Assert.Equal(2, contexts.Length);140 remoteBrowser.Disconnect();141 await context.CloseAsync();142 }143 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should wait for target")]144 [SkipBrowserFact(skipFirefox: true)]145 public async Task ShouldWaitForTarget()146 {147 var context = await Browser.CreateIncognitoBrowserContextAsync();148 var targetPromise = context.WaitForTargetAsync((target) => target.Url == TestConstants.EmptyPage);149 var page = await context.NewPageAsync();150 await page.GoToAsync(TestConstants.EmptyPage);151 var promiseTarget = await targetPromise;152 var targetPage = await promiseTarget.PageAsync();153 Assert.Equal(targetPage, page);154 await context.CloseAsync();155 }156 [PuppeteerTest("browsercontext.spec.ts", "BrowserContext", "should timeout waiting for non existant target")]157 [PuppeteerFact]158 public async Task ShouldTimeoutWaitingForNonExistantTarget()159 {160 var context = await Browser.CreateIncognitoBrowserContextAsync();161 await Assert.ThrowsAsync<TimeoutException>(()162 => context.WaitForTargetAsync((target) => target.Url == TestConstants.EmptyPage, new WaitForOptions { Timeout = 1 }));163 await context.CloseAsync();164 }165 }166}...
BrowserContext.cs
Source:BrowserContext.cs
...82 /// <summary>83 /// Closes the browser context. All the targets that belong to the browser context will be closed84 /// </summary>85 /// <returns>Task</returns>86 public Task CloseAsync()87 {88 if (_id == null)89 {90 throw new PuppeteerException("Non-incognito profiles cannot be closed!");91 }92 return Browser.DisposeContextAsync(_id);93 }94 /// <summary>95 /// Overrides the browser context permissions.96 /// </summary>97 /// <returns>The task.</returns>98 /// <param name="origin">The origin to grant permissions to, e.g. "https://example.com"</param>99 /// <param name="permissions">100 /// An array of permissions to grant. All permissions that are not listed here will be automatically denied....
BrowserContextOverridePermissionsTests.cs
Source:BrowserContextOverridePermissionsTests.cs
...99 Assert.Equal("granted", await GetPermissionAsync(otherPage, "geolocation"));100 await Context.ClearPermissionOverridesAsync();101 Assert.Equal("prompt", await GetPermissionAsync(Page, "geolocation"));102 Assert.Equal("granted", await GetPermissionAsync(otherPage, "geolocation"));103 await otherContext.CloseAsync();104 }105 }106}...
BrowserContextAccessor.cs
Source:BrowserContextAccessor.cs
...19 GC.SuppressFinalize(this);20 if (browserContext.IsValueCreated)21 {22 var value = await browserContext.Value.AnyContext();23 await value.CloseAsync();24 await value.Browser.DisposeAsync().ConfigureAwait(false);25 }26 }27 }28}...
PuppeteerPageBaseTest.cs
Source:PuppeteerPageBaseTest.cs
...19 }20 public async Task DisposeAsync()21 {22 await TearDown();23 await Page.CloseAsync();24 await Browser.CloseAsync();25 }26 protected virtual async Task SetUp()27 {28 await Task.CompletedTask;29 }30 protected virtual async Task TearDown()31 {32 await Task.CompletedTask;33 }34 }35}...
CloseAsync
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static async Task Main(string[] args)7 {8 var options = new LaunchOptions { Headless = false };9 using (var browser = await Puppeteer.LaunchAsync(options))10 {11 var page = await browser.NewPageAsync();12 await page.CloseAsync();13 }14 }15 }16}
CloseAsync
Using AI Code Generation
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 await page.WaitForSelectorAsync("input[name=q]");13 await page.TypeAsync("input[name=q]", "PuppeteerSharp");14 await page.ClickAsync("input[name=btnK]");15 await page.WaitForSelectorAsync("a[href='
CloseAsync
Using AI Code Generation
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 await page.ScreenshotAsync("screenshot.png");13 await browser.CloseAsync();14 Console.WriteLine("Hello World!");15 }16 }17}
CloseAsync
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using PuppeteerSharp;4{5 {6 static void Main(string[] args)7 {8 CloseAsyncExample().GetAwaiter().GetResult();9 }10 static async Task CloseAsyncExample()11 {12 var browser = await Puppeteer.LaunchAsync(new LaunchOptions13 {14 });15 var page = await browser.NewPageAsync();16 await page.WaitForTimeoutAsync(5000);17 await browser.CloseAsync();18 }19 }20}
CloseAsync
Using AI Code Generation
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 await page.CloseAsync();13 await browser.CloseAsync();14 }15 }16}17using System;18using System.Threading.Tasks;19using PuppeteerSharp;20{21 {22 static async Task Main(string[] args)23 {24 var browser = await Puppeteer.LaunchAsync(new LaunchOptions25 {26 });27 var page = await browser.NewPageAsync();28 await page.CloseAsync();29 await browser.CloseAsync();30 }31 }32}33using System;34using System.Threading.Tasks;35using PuppeteerSharp;36{37 {38 static async Task Main(string[] args)39 {40 var browser = await Puppeteer.LaunchAsync(new LaunchOptions41 {42 });43 var page = await browser.NewPageAsync();44 await page.CloseAsync();45 await browser.CloseAsync();46 }47 }48}
CloseAsync
Using AI Code Generation
1using System.Threading.Tasks;2using PuppeteerSharp;3{4 {5 static async Task Main(string[] args)6 {7 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);8 using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions9 {10 }))11 using (var page = await browser.NewPageAsync())12 {13 await page.ScreenshotAsync("google.png");14 }15 await browser.CloseAsync();16 }17 }18}
CloseAsync
Using AI Code Generation
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 }14}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!