Path: blob/trunk/dotnet/test/common/DevTools/DevToolsNetworkTest.cs
2868 views
// <copyright file="DevToolsNetworkTest.cs" company="Selenium Committers"> // Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // </copyright> using NUnit.Framework; using OpenQA.Selenium.Environment; using System; using System.Threading; using System.Threading.Tasks; namespace OpenQA.Selenium.DevTools; using CurrentCdpVersion = V138; [TestFixture] public class DevToolsNetworkTest : DevToolsTestFixture { [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] public void GetSetDeleteAndClearAllCookies() { //var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); //await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); //var allCookieResponse = await domains.Network.GetAllCookies(); //ReadOnlyCollection<Cookie> seleniumCookies = allCookieResponse.Cookies.ToSeleniumCookies(); //Assert.That(seleniumCookies.Count == 0); //Cookie cookie = new ReturnedCookie("name", "value", EnvironmentManager.Instance.UrlBuilder.HostName, "/devtools/test", null, false, true); //var setCookieResponse = await domains.Network.SetCookie(cookie.ToDevToolsSetCookieCommandSettings()); //Assert.That(setCookieResponse.Success); //allCookieResponse = await domains.Network.GetAllCookies(); //seleniumCookies = allCookieResponse.Cookies.ToSeleniumCookies(); //Assert.That(seleniumCookies.Count == 1); //var cookieResponse = await domains.Network.GetCookies(new CurrentCdpVersion.Network.GetCookiesCommandSettings()); //seleniumCookies = cookieResponse.Cookies.ToSeleniumCookies(); //Assert.That(seleniumCookies.Count == 0); //await domains.Network.DeleteCookies(new CurrentCdpVersion.Network.DeleteCookiesCommandSettings() //{ // Name = "name", // Domain = EnvironmentManager.Instance.UrlBuilder.HostName, // Path = "/devtools/test" //}); //await domains.Network.ClearBrowserCookies(); //allCookieResponse = await domains.Network.GetAllCookies(); //seleniumCookies = allCookieResponse.Cookies.ToSeleniumCookies(); //Assert.That(seleniumCookies.Count == 0); //setCookieResponse = await domains.Network.SetCookie(cookie.ToDevToolsSetCookieCommandSettings()); //Assert.That(setCookieResponse.Success); //allCookieResponse = await domains.Network.GetAllCookies(); //seleniumCookies = allCookieResponse.Cookies.ToSeleniumCookies(); //Assert.That(seleniumCookies.Count == 1); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task SendRequestWithUrlFiltersAndExtraHeadersAndVerifyRequests() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); await domains.Network.SetBlockedURLs(new CurrentCdpVersion.Network.SetBlockedURLsCommandSettings() { Urls = new string[] { "*://*/*.gif" } }); var additionalHeaders = new CurrentCdpVersion.Network.Headers(); additionalHeaders.Add("headerName", "headerValue"); await domains.Network.SetExtraHTTPHeaders(new CurrentCdpVersion.Network.SetExtraHTTPHeadersCommandSettings() { Headers = additionalHeaders }); ManualResetEventSlim loadingFailedSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.LoadingFailedEventArgs> loadingFailedHandler = (sender, e) => { if (e.Type == CurrentCdpVersion.Network.ResourceType.Image) { Assert.That(e.BlockedReason == CurrentCdpVersion.Network.BlockedReason.Inspector); } loadingFailedSync.Set(); }; domains.Network.LoadingFailed += loadingFailedHandler; ManualResetEventSlim requestSentSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.RequestWillBeSentEventArgs> requestWillBeSentHandler = (sender, e) => { if (e.Type != CurrentCdpVersion.Network.ResourceType.Image) { Assert.That(e.Request.Headers.ContainsKey("headerName")); Assert.That(e.Request.Headers["headerName"] == "headerValue"); requestSentSync.Set(); } }; domains.Network.RequestWillBeSent += requestWillBeSentHandler; ManualResetEventSlim dataSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.DataReceivedEventArgs> dataReceivedHandler = (sender, e) => { Assert.That(e.RequestId, Is.Not.Null); dataSync.Set(); }; domains.Network.DataReceived += dataReceivedHandler; driver.Url = linkedImage; Assert.That(loadingFailedSync.Wait(TimeSpan.FromSeconds(5)), Is.True); Assert.That(requestSentSync.Wait(TimeSpan.FromSeconds(5)), Is.True); Assert.That(dataSync.Wait(TimeSpan.FromSeconds(5)), Is.True); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task EmulateNetworkConditionOffline() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings() { MaxTotalBufferSize = 100000000 }); await domains.Network.EmulateNetworkConditions(new CurrentCdpVersion.Network.EmulateNetworkConditionsCommandSettings() { Offline = true, Latency = 100, DownloadThroughput = 1000, UploadThroughput = 2000, ConnectionType = CurrentCdpVersion.Network.ConnectionType.Cellular3g }); ManualResetEventSlim loadingFailedSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.LoadingFailedEventArgs> loadingFailedHandler = (sender, e) => { Assert.That(e.ErrorText, Is.EqualTo("net::ERR_INTERNET_DISCONNECTED")); loadingFailedSync.Set(); }; domains.Network.LoadingFailed += loadingFailedHandler; try { driver.Url = simpleTestPage; } catch (WebDriverException e) { Assert.That(e.Message.Contains("net::ERR_INTERNET_DISCONNECTED")); } Assert.That(loadingFailedSync.Wait(TimeSpan.FromSeconds(5)), Is.True); } [Test] [Ignore("The request ID is not getting added to cache")] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyRequestReceivedFromCacheAndResponseBody() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); string[] requestIdFromCache = new string[1]; await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings() { MaxResourceBufferSize = 100000000 }); ManualResetEventSlim servedFromCacheSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.RequestServedFromCacheEventArgs> requestServedFromCacheHandler = (sender, e) => { Assert.That(e.RequestId, Is.Not.Null); requestIdFromCache[0] = e.RequestId; servedFromCacheSync.Set(); }; domains.Network.RequestServedFromCache += requestServedFromCacheHandler; ManualResetEventSlim loadingFinishedSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.LoadingFinishedEventArgs> loadingFinishedHandler = (sender, e) => { Assert.That(e.RequestId, Is.Not.Null); loadingFinishedSync.Set(); }; domains.Network.LoadingFinished += loadingFinishedHandler; driver.Url = simpleTestPage; driver.Url = simpleTestPage; Assert.That(loadingFinishedSync.Wait(TimeSpan.FromSeconds(5)), Is.True); Assert.That(servedFromCacheSync.Wait(TimeSpan.FromSeconds(5)), Is.True); var responseBody = await domains.Network.GetResponseBody(new CurrentCdpVersion.Network.GetResponseBodyCommandSettings() { RequestId = requestIdFromCache[0] }); Assert.That(responseBody.Body, Is.Not.Null); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifySearchInResponseBody() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); string[] requestIds = new string[1]; await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings() { MaxResourceBufferSize = 100000000 }); ManualResetEventSlim responseSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.ResponseReceivedEventArgs> responseReceivedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); requestIds[0] = e.RequestId; responseSync.Set(); }; domains.Network.ResponseReceived += responseReceivedHandler; driver.Url = simpleTestPage; Assert.That(responseSync.Wait(TimeSpan.FromSeconds(5)), Is.True); var searchResponse = await domains.Network.SearchInResponseBody(new CurrentCdpVersion.Network.SearchInResponseBodyCommandSettings() { RequestId = requestIds[0], Query = ".*", IsRegex = true }); Assert.That(searchResponse.Result.Length > 0); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyCacheDisabledAndClearCache() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings() { MaxPostDataSize = 100000000 }); ManualResetEventSlim responseSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.ResponseReceivedEventArgs> responseReceivedHandler = (sender, e) => { Assert.That(e.Response.FromDiskCache, Is.False); responseSync.Set(); }; domains.Network.ResponseReceived += responseReceivedHandler; driver.Url = simpleTestPage; Assert.That(responseSync.Wait(TimeSpan.FromSeconds(5)), Is.True); await domains.Network.SetCacheDisabled(new CurrentCdpVersion.Network.SetCacheDisabledCommandSettings() { CacheDisabled = true }); driver.Url = simpleTestPage; await domains.Network.ClearBrowserCache(); } [Test] [Ignore("Unable to open secure url")] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyCertificatesAndOverrideUserAgent() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); await domains.Network.SetUserAgentOverride(new CurrentCdpVersion.Network.SetUserAgentOverrideCommandSettings() { UserAgent = "userAgent" }); ManualResetEventSlim requestSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.RequestWillBeSentEventArgs> requestWillBeSentHandler = (sender, e) => { Assert.That(e.Request.Headers["User-Agent"], Is.EqualTo("userAgent")); requestSync.Set(); }; domains.Network.RequestWillBeSent += requestWillBeSentHandler; string origin = EnvironmentManager.Instance.UrlBuilder.WhereIsSecure("simpleTest.html"); driver.Url = origin; Assert.That(requestSync.Wait(TimeSpan.FromSeconds(5)), Is.True); var result = await domains.Network.GetCertificate(new CurrentCdpVersion.Network.GetCertificateCommandSettings() { Origin = origin }); Assert.That(result.TableNames.Length, Is.GreaterThan(0)); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyResponseReceivedEventAndNetworkDisable() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); ManualResetEventSlim responseSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.ResponseReceivedEventArgs> responseReceivedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); responseSync.Set(); }; domains.Network.ResponseReceived += responseReceivedHandler; driver.Url = simpleTestPage; Assert.That(responseSync.Wait(TimeSpan.FromSeconds(5)), Is.True); await domains.Network.Disable(); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyWebSocketOperations() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); EventHandler<CurrentCdpVersion.Network.WebSocketCreatedEventArgs> webSocketCreatedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); }; domains.Network.WebSocketCreated += webSocketCreatedHandler; EventHandler<CurrentCdpVersion.Network.WebSocketFrameReceivedEventArgs> webSocketFrameReceivedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); }; domains.Network.WebSocketFrameReceived += webSocketFrameReceivedHandler; EventHandler<CurrentCdpVersion.Network.WebSocketFrameErrorEventArgs> webSocketFrameErrorHandler = (sender, e) => { Assert.That(e, Is.Not.Null); }; domains.Network.WebSocketFrameError += webSocketFrameErrorHandler; EventHandler<CurrentCdpVersion.Network.WebSocketFrameSentEventArgs> webSocketFrameSentHandler = (sender, e) => { Assert.That(e, Is.Not.Null); }; domains.Network.WebSocketFrameSent += webSocketFrameSentHandler; EventHandler<CurrentCdpVersion.Network.WebSocketClosedEventArgs> webSocketClosedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); }; domains.Network.WebSocketClosed += webSocketClosedHandler; driver.Url = simpleTestPage; } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task VerifyRequestPostData() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); string[] requestIds = new string[1]; ManualResetEventSlim requestSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.RequestWillBeSentEventArgs> requestWillBeSentHandler = (sender, e) => { Assert.That(e, Is.Not.Null); if (string.Compare(e.Request.Method, "post", StringComparison.OrdinalIgnoreCase) == 0) { requestIds[0] = e.RequestId; requestSync.Set(); } }; domains.Network.RequestWillBeSent += requestWillBeSentHandler; driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("postForm.html"); driver.FindElement(By.XPath("//form/input")).Click(); bool requestEventFired = requestSync.Wait(TimeSpan.FromSeconds(5)); Assert.That(requestEventFired, Is.True); var response = await domains.Network.GetRequestPostData(new CurrentCdpVersion.Network.GetRequestPostDataCommandSettings() { RequestId = requestIds[0] }); Assert.That(response.PostData, Is.Not.Null); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task ByPassServiceWorker() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); await domains.Network.SetBypassServiceWorker(new CurrentCdpVersion.Network.SetBypassServiceWorkerCommandSettings() { Bypass = true }); } [Test] [Ignore("Unable to open secure url")] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] public async Task VerifySignedExchangeReceived() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); ManualResetEventSlim requestSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.SignedExchangeReceivedEventArgs> signedExchangeReceivedHandler = (sender, e) => { Assert.That(e, Is.Not.Null); requestSync.Set(); }; domains.Network.SignedExchangeReceived += signedExchangeReceivedHandler; driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIsSecure("simpleTest.html"); Assert.That(requestSync.Wait(TimeSpan.FromSeconds(5)), Is.True); } [Test] [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] [IgnoreBrowser(Selenium.Browser.Edge, "We run it in Chrome and Edge releases are usually late.")] public async Task InterceptRequestAndContinue() { var domains = session.GetVersionSpecificDomains<CurrentCdpVersion.DevToolsSessionDomains>(); await domains.Network.Enable(new CurrentCdpVersion.Network.EnableCommandSettings()); ManualResetEventSlim requestSync = new ManualResetEventSlim(false); EventHandler<CurrentCdpVersion.Network.RequestInterceptedEventArgs> requestInterceptedHandler = (async (sender, e) => { await domains.Network.ContinueInterceptedRequest(new CurrentCdpVersion.Network.ContinueInterceptedRequestCommandSettings() { InterceptionId = e.InterceptionId }); requestSync.Set(); }); domains.Network.RequestIntercepted += requestInterceptedHandler; var pattern = new CurrentCdpVersion.Network.RequestPattern() { UrlPattern = "*.css", InterceptionStage = CurrentCdpVersion.Network.InterceptionStage.HeadersReceived }; await domains.Network.SetRequestInterception(new CurrentCdpVersion.Network.SetRequestInterceptionCommandSettings() { Patterns = new CurrentCdpVersion.Network.RequestPattern[] { pattern } }); driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("js/skins/lightgray/content.min.css"); Assert.That(requestSync.Wait(TimeSpan.FromSeconds(5)), Is.True); } }