diff --git a/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextBypassCSPTests.cs b/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextBypassCSPTests.cs index 26c71e94de..1f91ef5389 100644 --- a/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextBypassCSPTests.cs +++ b/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextBypassCSPTests.cs @@ -31,7 +31,7 @@ public async Task ShouldBypassCSPMetatag() Assert.Null(await page.EvaluateAsync("window.__injected")); } // By-pass CSP and try one more time. - await using (var context = await Browser.NewContextAsync(new BrowserContextOptions { BypassCSP = true })) + await using (var context = await Browser.NewContextAsync(bypassCSP: true)) { var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.ServerUrl + "/csp.html"); @@ -58,7 +58,7 @@ public async Task ShouldBypassCSPHeader() } // By-pass CSP and try one more time. - await using (var context = await Browser.NewContextAsync(new BrowserContextOptions { BypassCSP = true })) + await using (var context = await Browser.NewContextAsync(bypassCSP: true)) { var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.EmptyPage); @@ -73,7 +73,7 @@ public async Task ShouldBypassCSPHeader() [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] public async Task ShouldBypassAfterCrossProcessNavigation() { - await using var context = await Browser.NewContextAsync(new BrowserContextOptions { BypassCSP = true }); + await using var context = await Browser.NewContextAsync(bypassCSP: true); var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.ServerUrl + "/csp.html"); await page.AddScriptTagAsync(content: "window.__injected = 42;"); @@ -102,7 +102,7 @@ public async Task ShouldBypassCSPInIframesAsWell() } // By-pass CSP and try one more time. - await using (var context = await Browser.NewContextAsync(new BrowserContextOptions { BypassCSP = true })) + await using (var context = await Browser.NewContextAsync(bypassCSP: true)) { var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.EmptyPage); diff --git a/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextJavaScriptEnabledTests.cs b/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextJavaScriptEnabledTests.cs index 94ee3e934e..b14534cf47 100644 --- a/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextJavaScriptEnabledTests.cs +++ b/src/PlaywrightSharp.Tests/BrowserContext/BrowserContextJavaScriptEnabledTests.cs @@ -23,7 +23,7 @@ public BrowserContextJavaScriptEnabledTests(ITestOutputHelper output) : base(out [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] public async Task ShouldWork() { - await using (var context = await Browser.NewContextAsync(new BrowserContextOptions { JavaScriptEnabled = false })) + await using (var context = await Browser.NewContextAsync(javaScriptEnabled: false)) { var page = await context.NewPageAsync(); await page.GoToAsync("data:text/html, "); @@ -49,7 +49,7 @@ public async Task ShouldWork() [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] public async Task ShouldBeAbleToNavigateAfterDisablingJavascript() { - await using var context = await Browser.NewContextAsync(new BrowserContextOptions { JavaScriptEnabled = false }); + await using var context = await Browser.NewContextAsync(javaScriptEnabled: false); var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.EmptyPage); } diff --git a/src/PlaywrightSharp.Tests/BrowserContext/LaunchPersistentContextTests.cs b/src/PlaywrightSharp.Tests/BrowserContext/LaunchPersistentContextTests.cs index 4e8e9832db..dccbc67dff 100644 --- a/src/PlaywrightSharp.Tests/BrowserContext/LaunchPersistentContextTests.cs +++ b/src/PlaywrightSharp.Tests/BrowserContext/LaunchPersistentContextTests.cs @@ -648,7 +648,7 @@ public async Task ShouldFireCloseEventForAPersistentContext() var tmp = new TempDirectory(); var context = await BrowserType.LaunchPersistenContextAsync( tmp.Path, - (LaunchPersistentOptions)TestConstants.GetDefaultBrowserOptions() + (options ?? new BrowserContextOptions())); + TestConstants.GetDefaultBrowserOptions().ToPersistentOptions() + (options ?? new BrowserContextOptions())); var page = context.Pages.First(); return (tmp, context, page); diff --git a/src/PlaywrightSharp.Tests/DownloadsPath/DownloadsPathLaunchPersistentTests.cs b/src/PlaywrightSharp.Tests/DownloadsPath/DownloadsPathLaunchPersistentTests.cs index f5f8d82e0b..23a9d74a41 100644 --- a/src/PlaywrightSharp.Tests/DownloadsPath/DownloadsPathLaunchPersistentTests.cs +++ b/src/PlaywrightSharp.Tests/DownloadsPath/DownloadsPathLaunchPersistentTests.cs @@ -75,7 +75,7 @@ public async Task InitializeAsync() _downloadsPath = new TempDirectory(); _userDataDir = new TempDirectory(); - var options = (LaunchPersistentOptions)TestConstants.GetDefaultBrowserOptions(); + var options = TestConstants.GetDefaultBrowserOptions().ToPersistentOptions(); options.DownloadsPath = _downloadsPath.Path; options.AcceptDownloads = true; _context = await Playwright[TestConstants.Product].LaunchPersistenContextAsync(_userDataDir.Path, options); diff --git a/src/PlaywrightSharp.Tests/Emulation/BrowserContextLocaleTests.cs b/src/PlaywrightSharp.Tests/Emulation/BrowserContextLocaleTests.cs index 62e3d6bf98..c23f90940d 100644 --- a/src/PlaywrightSharp.Tests/Emulation/BrowserContextLocaleTests.cs +++ b/src/PlaywrightSharp.Tests/Emulation/BrowserContextLocaleTests.cs @@ -25,10 +25,7 @@ public BrowserContextLocaleTests(ITestOutputHelper output) : base(output) [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] public async Task ShouldAffectAcceptLanguageHeader() { - await using var context = await Browser.NewContextAsync(new BrowserContextOptions - { - Locale = "fr-CH" - }); + await using var context = await Browser.NewContextAsync(locale: "fr-CH"); string acceptLanguage = string.Empty; var page = await context.NewPageAsync(); var requestTask = Server.WaitForRequest("/empty.html", c => acceptLanguage = c.Headers["accept-language"]); diff --git a/src/PlaywrightSharp.Tests/Page/DownloadTests.cs b/src/PlaywrightSharp.Tests/Page/DownloadTests.cs index 1b8eadf16e..39c1470936 100644 --- a/src/PlaywrightSharp.Tests/Page/DownloadTests.cs +++ b/src/PlaywrightSharp.Tests/Page/DownloadTests.cs @@ -61,7 +61,7 @@ await TaskUtils.WhenAll( [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] public async Task ShouldReportDownloadsWithAcceptDownloadsTrue() { - var page = await Browser.NewPageAsync(new BrowserContextOptions { AcceptDownloads = true }); + var page = await Browser.NewPageAsync(acceptDownloads: true); await page.SetContentAsync($"download"); var downloadTask = page.WaitForEvent(PageEvent.Download); diff --git a/src/PlaywrightSharp.Tests/TestConstants.cs b/src/PlaywrightSharp.Tests/TestConstants.cs index c0122c1c15..29959b92a8 100644 --- a/src/PlaywrightSharp.Tests/TestConstants.cs +++ b/src/PlaywrightSharp.Tests/TestConstants.cs @@ -13,7 +13,7 @@ internal static class TestConstants public const string FirefoxProduct = "FIREFOX"; public static string Product => string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PRODUCT")) ? - WebkitProduct : + ChromiumProduct : Environment.GetEnvironmentVariable("PRODUCT"); public const string TestFixtureBrowserCollectionName = "PlaywrightSharpBrowserLoaderFixture collection"; @@ -34,7 +34,6 @@ internal static LaunchOptions GetDefaultBrowserOptions() SlowMo = Convert.ToInt32(Environment.GetEnvironmentVariable("SLOW_MO")), Headless = Convert.ToBoolean(Environment.GetEnvironmentVariable("HEADLESS") ?? "true"), Timeout = 0, - LogProcess = true, }; public static LaunchOptions GetHeadfulOptions() diff --git a/src/PlaywrightSharp/Browser.cs b/src/PlaywrightSharp/Browser.cs index cc7c71e578..3ee85a1674 100644 --- a/src/PlaywrightSharp/Browser.cs +++ b/src/PlaywrightSharp/Browser.cs @@ -77,9 +77,83 @@ public async Task CloseAsync() } /// - public async Task NewContextAsync(BrowserContextOptions options = null) + public Task NewContextAsync( + ViewportSize viewport, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => NewContextAsync(new BrowserContextOptions + { + Viewport = viewport, + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public Task NewContextAsync( + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => NewContextAsync(new BrowserContextOptions + { + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public async Task NewContextAsync(BrowserContextOptions options) { - var context = (await _channel.NewContextAsync(options).ConfigureAwait(false)).Object; + var context = (await _channel.NewContextAsync(options ?? new BrowserContextOptions()).ConfigureAwait(false)).Object; BrowserContextsList.Add(context); context.Browser = this; return context; @@ -89,7 +163,81 @@ public async Task NewContextAsync(BrowserContextOptions options public async Task NewBrowserCDPSessionAsync() => (await _channel.NewBrowserCDPSessionAsync().ConfigureAwait(false)).Object; /// - public async Task NewPageAsync(BrowserContextOptions options = null) + public Task NewPageAsync( + ViewportSize viewport, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => NewPageAsync(new BrowserContextOptions + { + Viewport = viewport, + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public Task NewPageAsync( + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => NewPageAsync(new BrowserContextOptions + { + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public async Task NewPageAsync(BrowserContextOptions options) { var context = await NewContextAsync(options).ConfigureAwait(false) as BrowserContext; var page = await context.NewPageAsync().ConfigureAwait(false) as Page; diff --git a/src/PlaywrightSharp/BrowserContextOptions.cs b/src/PlaywrightSharp/BrowserContextOptions.cs index 11a6f16a53..8a6108ad35 100644 --- a/src/PlaywrightSharp/BrowserContextOptions.cs +++ b/src/PlaywrightSharp/BrowserContextOptions.cs @@ -4,232 +4,94 @@ namespace PlaywrightSharp { /// - /// options. + /// . /// public class BrowserContextOptions { /// /// Sets a consistent viewport for each page. Defaults to an 800x600 viewport. null disables the default viewport. /// - public ViewportSize Viewport - { - get - { - Values.TryGetValue("viewport", out object result); - return result as ViewportSize; - } - set => Values["viewport"] = value; - } + public ViewportSize Viewport { get; set; } = ViewportSize.None; /// /// Specific user agent to use in this context. /// - public string UserAgent - { - get - { - Values.TryGetValue("userAgent", out object result); - return result as string; - } - set => Values["userAgent"] = value; - } + public string UserAgent { get; set; } /// /// Toggles bypassing page's Content-Security-Policy. /// - public bool? BypassCSP - { - get - { - Values.TryGetValue("bypassCSP", out object result); - return result as bool?; - } - set => Values["bypassCSP"] = value; - } + public bool? BypassCSP { get; set; } /// /// Whether or not to enable or disable JavaScript in the context. Defaults to true. /// - public bool? JavaScriptEnabled - { - get - { - Values.TryGetValue("javaScriptEnabled", out object result); - return result as bool?; - } - set => Values["javaScriptEnabled"] = value; - } + public bool? JavaScriptEnabled { get; set; } /// /// Whether to ignore HTTPS errors during navigation. Defaults to false. /// - public bool? IgnoreHTTPSErrors - { - get - { - Values.TryGetValue("ignoreHTTPSErrors", out object result); - return result as bool?; - } - set => Values["ignoreHTTPSErrors"] = value; - } + public bool? IgnoreHTTPSErrors { get; set; } /// /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. /// - public string TimezoneId - { - get - { - Values.TryGetValue("timezoneId", out object result); - return result as string; - } - set => Values["timezoneId"] = value; - } + public string TimezoneId { get; set; } /// /// Changes the Geolocation of the context. /// - public Geolocation Geolocation - { - get - { - Values.TryGetValue("geolocation", out object result); - return result as Geolocation; - } - set => Values["geolocation"] = value; - } + public Geolocation Geolocation { get; set; } /// /// A from origin keys to permissions values. See for more details. /// - public ContextPermission[] Permissions - { - get - { - Values.TryGetValue("permissions", out object result); - return result as ContextPermission[]; - } - set => Values["permissions"] = value; - } + public ContextPermission[] Permissions { get; set; } /// /// Gets or sets whether the meta viewport tag is taken into account. /// - public bool? IsMobile - { - get - { - Values.TryGetValue("isMobile", out object result); - return result as bool?; - } - set => Values["isMobile"] = value; - } + public bool? IsMobile { get; set; } /// /// Whether to emulate network being offline. Defaults to `false`. /// - public bool? Offline - { - get - { - Values.TryGetValue("offline", out object result); - return result as bool?; - } - set => Values["offline"] = value; - } + public bool? Offline { get; set; } /// /// Gets or sets the device scale factor. /// - public decimal? DeviceScaleFactor - { - get - { - Values.TryGetValue("deviceScaleFactor", out object result); - return result as decimal?; - } - set => Values["deviceScaleFactor"] = value; - } + public decimal? DeviceScaleFactor { get; set; } /// /// Credentials for HTTP authentication. /// - public Credentials HttpCredentials - { - get - { - Values.TryGetValue("httpCredentials", out object result); - return result as Credentials; - } - set => Values["httpCredentials"] = value; - } + public Credentials HttpCredentials { get; set; } /// /// Specifies if viewport supports touch events. Defaults to false. /// - public bool? HasTouch - { - get - { - Values.TryGetValue("hasTouch", out object result); - return result as bool?; - } - set => Values["hasTouch"] = value; - } + public bool? HasTouch { get; set; } /// /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. /// - public bool? AcceptDownloads - { - get - { - Values.TryGetValue("acceptDownloads", out object result); - return result as bool?; - } - set => Values["acceptDownloads"] = value; - } + public bool? AcceptDownloads { get; set; } /// /// Emulates 'prefers-colors-scheme' media feature. /// - public ColorScheme? ColorScheme - { - get - { - Values.TryGetValue("colorScheme", out object result); - return result as ColorScheme?; - } - set => Values["colorScheme"] = value; - } + public ColorScheme? ColorScheme { get; set; } /// /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. /// - public string Locale - { - get - { - Values.TryGetValue("locale", out object result); - return result as string; - } - set => Values["locale"] = value; - } + public string Locale { get; set; } /// /// An object containing additional HTTP headers to be sent with every request. /// - public Dictionary ExtraHttpHeaders - { - get - { - Values.TryGetValue("extraHTTPHeaders", out object result); - return result as Dictionary; - } - set => Values["extraHTTPHeaders"] = value; - } - - internal Dictionary Values { get; } = new Dictionary(); + public Dictionary ExtraHttpHeaders { get; set; } /// /// Clones the . @@ -243,6 +105,96 @@ public BrowserContextOptions Clone() return copy; } - internal Dictionary ToChannelDictionary() => Values; + internal Dictionary ToChannelDictionary() + { + var args = new Dictionary(); + + if (Viewport == null || !Viewport.Equals(ViewportSize.None)) + { + args["viewport"] = Viewport; + } + + if (!string.IsNullOrEmpty(UserAgent)) + { + args["userAgent"] = UserAgent; + } + + if (BypassCSP != null) + { + args["bypassCSP"] = BypassCSP; + } + + if (JavaScriptEnabled != null) + { + args["javaScriptEnabled"] = JavaScriptEnabled; + } + + if (IgnoreHTTPSErrors != null) + { + args["ignoreHTTPSErrors"] = IgnoreHTTPSErrors; + } + + if (!string.IsNullOrEmpty(TimezoneId)) + { + args["timezoneId"] = TimezoneId; + } + + if (Geolocation != null) + { + args["geolocation"] = Geolocation; + } + + if (Permissions != null) + { + args["permissions"] = Permissions; + } + + if (IsMobile != null) + { + args["isMobile"] = IsMobile; + } + + if (Offline != null) + { + args["offline"] = Offline; + } + + if (DeviceScaleFactor != null) + { + args["deviceScaleFactor"] = DeviceScaleFactor; + } + + if (HttpCredentials != null) + { + args["httpCredentials"] = HttpCredentials; + } + + if (HasTouch != null) + { + args["hasTouch"] = HasTouch; + } + + if (AcceptDownloads != null) + { + args["acceptDownloads"] = AcceptDownloads; + } + + if (ColorScheme != null) + { + args["colorScheme"] = ColorScheme; + } + + if (Locale != null) + { + args["locale"] = Locale; + } + + if (ExtraHttpHeaders != null) + { + args["extraHTTPHeaders"] = ExtraHttpHeaders; + } + + return args; + } } } diff --git a/src/PlaywrightSharp/BrowserType.cs b/src/PlaywrightSharp/BrowserType.cs index 9df3f9933e..9e458c1945 100644 --- a/src/PlaywrightSharp/BrowserType.cs +++ b/src/PlaywrightSharp/BrowserType.cs @@ -51,17 +51,231 @@ internal BrowserType(ConnectionScope scope, string guid, BrowserTypeInitializer /// public string Name => _initializer.Name; + /// + public Task LaunchAsync( + bool? headless = null, + string[] args = null, + string userDataDir = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null) + => LaunchAsync(new LaunchOptions + { + Headless = headless, + Args = args, + UserDataDir = userDataDir, + Devtools = devtools, + ExecutablePath = executablePath, + DownloadsPath = downloadsPath, + IgnoreHTTPSErrors = ignoreHTTPSErrors, + Timeout = timeout, + DumpIO = dumpIO, + SlowMo = slowMo, + IgnoreDefaultArgs = ignoreHTTPSErrors, + IgnoredDefaultArgs = ignoredDefaultArgs, + Env = env, + FirefoxUserPrefs = firefoxUserPrefs, + Proxy = proxy, + }); + /// public async Task LaunchAsync(LaunchOptions options = null) - => (await _channel.LaunchAsync(options).ConfigureAwait(false)).Object; + => (await _channel.LaunchAsync(options ?? new LaunchOptions()).ConfigureAwait(false)).Object; /// public async Task LaunchServerAsync(LaunchOptions options = null) => (await _channel.LaunchServerAsync(options).ConfigureAwait(false)).Object; + /// + public Task LaunchServerAsync( + bool? headless = null, + string[] args = null, + string userDataDir = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null) + => LaunchServerAsync(new LaunchOptions + { + Headless = headless, + Args = args, + UserDataDir = userDataDir, + Devtools = devtools, + ExecutablePath = executablePath, + DownloadsPath = downloadsPath, + IgnoreHTTPSErrors = ignoreHTTPSErrors, + Timeout = timeout, + DumpIO = dumpIO, + SlowMo = slowMo, + IgnoreDefaultArgs = ignoreHTTPSErrors, + IgnoredDefaultArgs = ignoredDefaultArgs, + Env = env, + FirefoxUserPrefs = firefoxUserPrefs, + Proxy = proxy, + }); + + /// + public Task LaunchPersistenContextAsync( + string userDataDir, + ViewportSize viewport, + bool? headless = null, + string[] args = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => LaunchPersistenContextAsync( + userAgent, + new LaunchPersistentOptions + { + Headless = headless, + Args = args, + UserDataDir = userDataDir, + Devtools = devtools, + ExecutablePath = executablePath, + DownloadsPath = downloadsPath, + IgnoreHTTPSErrors = ignoreHTTPSErrors, + Timeout = timeout, + DumpIO = dumpIO, + SlowMo = slowMo, + IgnoreDefaultArgs = ignoreHTTPSErrors, + IgnoredDefaultArgs = ignoredDefaultArgs, + Env = env, + FirefoxUserPrefs = firefoxUserPrefs, + Proxy = proxy, + Viewport = viewport, + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public Task LaunchPersistenContextAsync( + string userDataDir, + bool? headless = null, + string[] args = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null) + => LaunchPersistenContextAsync( + userAgent, + new LaunchPersistentOptions + { + Headless = headless, + Args = args, + UserDataDir = userDataDir, + Devtools = devtools, + ExecutablePath = executablePath, + DownloadsPath = downloadsPath, + IgnoreHTTPSErrors = ignoreHTTPSErrors, + Timeout = timeout, + DumpIO = dumpIO, + SlowMo = slowMo, + IgnoreDefaultArgs = ignoreHTTPSErrors, + IgnoredDefaultArgs = ignoredDefaultArgs, + Env = env, + FirefoxUserPrefs = firefoxUserPrefs, + Proxy = proxy, + UserAgent = userAgent, + BypassCSP = bypassCSP, + JavaScriptEnabled = javaScriptEnabled, + TimezoneId = timezoneId, + Geolocation = geolocation, + Permissions = permissions, + IsMobile = isMobile, + Offline = offline, + DeviceScaleFactor = deviceScaleFactor, + HttpCredentials = httpCredentials, + HasTouch = hasTouch, + AcceptDownloads = acceptDownloads, + ColorScheme = colorScheme, + Locale = locale, + ExtraHttpHeaders = extraHttpHeaders, + }); + + /// + public Task LaunchPersistenContextAsync(string userDataDir, LaunchOptions options) + => LaunchPersistenContextAsync(userDataDir, options?.ToPersistentOptions() ?? new LaunchPersistentOptions()); + /// public async Task LaunchPersistenContextAsync(string userDataDir, LaunchPersistentOptions options) - => (await _channel.LaunchPersistenContextAsync(userDataDir, options).ConfigureAwait(false)).Object; + => (await _channel.LaunchPersistenContextAsync(userDataDir, options ?? new LaunchPersistentOptions()).ConfigureAwait(false)).Object; /// public async Task ConnectAsync(string wsEndpoint, int? timeout = null, int? slowMo = null) diff --git a/src/PlaywrightSharp/IBrowser.cs b/src/PlaywrightSharp/IBrowser.cs index dc78de74a8..15ce59b4bd 100644 --- a/src/PlaywrightSharp/IBrowser.cs +++ b/src/PlaywrightSharp/IBrowser.cs @@ -58,6 +58,100 @@ public interface IBrowser : IAsyncDisposable /// A that completes when the browser is closed. Task CloseAsync(); + /// + /// Creates a new browser context. It won't share cookies/cache with other browser contexts. + /// + /// Sets a consistent viewport for each page. Defaults to an 800x600 viewport. null disables the default viewport. + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// . + /// + /// + /// + /// + /// A that completes when a new is created. + Task NewContextAsync( + ViewportSize viewport, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); + + /// + /// Creates a new browser context. It won't share cookies/cache with other browser contexts. + /// + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// . + /// + /// + /// + /// + /// A that completes when a new is created. + Task NewContextAsync( + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); + /// /// Creates a new browser context. It won't share cookies/cache with other browser contexts. /// @@ -73,14 +167,108 @@ public interface IBrowser : IAsyncDisposable /// /// /// A that completes when a new is created. - Task NewContextAsync(BrowserContextOptions options = null); + Task NewContextAsync(BrowserContextOptions options); + + /// + /// Creates a new page in a new browser context. Closing this page will close the context as well. + /// + /// Sets a consistent viewport for each page. Defaults to an 800x600 viewport. null disables the default viewport. + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// . + /// + /// + /// + /// + /// A that completes when a new is created. + Task NewPageAsync( + ViewportSize viewport, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); + + /// + /// Creates a new page in a new browser context. Closing this page will close the context as well. + /// + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// . + /// + /// + /// + /// + /// A that completes when a new is created. + Task NewPageAsync( + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); /// /// Creates a new page in a new browser context. Closing this page will close the context as well. /// /// Context options. /// A that completes when a new is created. - Task NewPageAsync(BrowserContextOptions options = null); + Task NewPageAsync(BrowserContextOptions options); /// /// Creates a new browser session. diff --git a/src/PlaywrightSharp/IBrowserContext.cs b/src/PlaywrightSharp/IBrowserContext.cs index d3839406b6..221a21bda0 100644 --- a/src/PlaywrightSharp/IBrowserContext.cs +++ b/src/PlaywrightSharp/IBrowserContext.cs @@ -8,7 +8,7 @@ namespace PlaywrightSharp /// /// BrowserContexts provide a way to operate multiple independent browser sessions. /// If a opens another page, e.g.with a window.open call, the popup will belong to the parent page's browser context. - /// PlaywrightSharp allows creation of "incognito" browser contexts with method. "Incognito" browser contexts don't write any browsing data to disk. + /// PlaywrightSharp allows creation of "incognito" browser contexts with method. "Incognito" browser contexts don't write any browsing data to disk. /// /// /// diff --git a/src/PlaywrightSharp/IBrowserType.cs b/src/PlaywrightSharp/IBrowserType.cs index e92a1e8764..89de7b8507 100644 --- a/src/PlaywrightSharp/IBrowserType.cs +++ b/src/PlaywrightSharp/IBrowserType.cs @@ -24,7 +24,44 @@ public interface IBrowserType /// /// Launch options. /// A that completes when the browser is launched, yielding the browser. - Task LaunchAsync(LaunchOptions options = null); + Task LaunchAsync(LaunchOptions options); + + /// + /// Launches a new browser. + /// + /// Whether to run browser in headless mode. Defaults to true unless the devtools option is true. + /// Additional arguments to pass to the browser instance. + /// Path to a User Data Directory. + /// Whether to auto-open DevTools panel for each tab. If this option is true, the headless option will be set false. + /// Path to a browser executable to run instead of the bundled one. + /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. + /// Whether to ignore HTTPS errors during navigation. Defaults to false. + /// Maximum time in milliseconds to wait for the browser instance to start. + /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. + /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. + /// If true, Playwright does not pass its own configurations args and only uses the ones from args. + /// Dangerous option; use with care. Defaults to false. + /// if is set to false this list will be used to filter default arguments. + /// Specify environment variables that will be visible to browser. Defaults to Environment variables. + /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. + /// Network proxy settings. + /// A that completes when the browser is launched, yielding the browser. + Task LaunchAsync( + bool? headless = null, + string[] args = null, + string userDataDir = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null); /// /// Launches browser server that client can connect to. @@ -33,6 +70,187 @@ public interface IBrowserType /// A that completes when the browser is launched, yielding the browser server. Task LaunchServerAsync(LaunchOptions options); + /// + /// Launches browser server that client can connect to. + /// + /// Whether to run browser in headless mode. Defaults to true unless the devtools option is true. + /// Additional arguments to pass to the browser instance. + /// Path to a User Data Directory. + /// Whether to auto-open DevTools panel for each tab. If this option is true, the headless option will be set false. + /// Path to a browser executable to run instead of the bundled one. + /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. + /// Whether to ignore HTTPS errors during navigation. Defaults to false. + /// Maximum time in milliseconds to wait for the browser instance to start. + /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. + /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. + /// If true, Playwright does not pass its own configurations args and only uses the ones from args. + /// Dangerous option; use with care. Defaults to false. + /// if is set to false this list will be used to filter default arguments. + /// Specify environment variables that will be visible to browser. Defaults to Environment variables. + /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. + /// Network proxy settings. + /// A that completes when the browser is launched, yielding the browser server. + Task LaunchServerAsync( + bool? headless = null, + string[] args = null, + string userDataDir = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null); + + /// + /// Launches browser that uses persistent storage located at userDataDir and returns the only context. Closing this context will automatically close the browser. + /// + /// Path to a User Data Directory, which stores browser session data like cookies and local storage. + /// Launch options. + /// A that completes when the browser is launched, yielding the browser server. + Task LaunchPersistenContextAsync(string userDataDir, LaunchOptions options); + + /// + /// Launches browser that uses persistent storage located at userDataDir and returns the only context. Closing this context will automatically close the browser. + /// + /// Path to a User Data Directory, which stores browser session data like cookies and local storage. + /// Sets a consistent viewport for each page. Defaults to an 800x600 viewport. null disables the default viewport. + /// Whether to run browser in headless mode. Defaults to true unless the devtools option is true. + /// Additional arguments to pass to the browser instance. + /// Whether to auto-open DevTools panel for each tab. If this option is true, the headless option will be set false. + /// Path to a browser executable to run instead of the bundled one. + /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. + /// Whether to ignore HTTPS errors during navigation. Defaults to false. + /// Maximum time in milliseconds to wait for the browser instance to start. + /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. + /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. + /// If true, Playwright does not pass its own configurations args and only uses the ones from args. + /// Dangerous option; use with care. Defaults to false. + /// if is set to false this list will be used to filter default arguments. + /// Specify environment variables that will be visible to browser. Defaults to Environment variables. + /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. + /// Network proxy settings. + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// A that completes when the browser is launched, yielding the browser server. + Task LaunchPersistenContextAsync( + string userDataDir, + ViewportSize viewport, + bool? headless = null, + string[] args = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); + + /// + /// Launches browser that uses persistent storage located at userDataDir and returns the only context. Closing this context will automatically close the browser. + /// + /// Path to a User Data Directory, which stores browser session data like cookies and local storage. + /// Whether to run browser in headless mode. Defaults to true unless the devtools option is true. + /// Additional arguments to pass to the browser instance. + /// Whether to auto-open DevTools panel for each tab. If this option is true, the headless option will be set false. + /// Path to a browser executable to run instead of the bundled one. + /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. + /// Whether to ignore HTTPS errors during navigation. Defaults to false. + /// Maximum time in milliseconds to wait for the browser instance to start. + /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. + /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. + /// If true, Playwright does not pass its own configurations args and only uses the ones from args. + /// Dangerous option; use with care. Defaults to false. + /// if is set to false this list will be used to filter default arguments. + /// Specify environment variables that will be visible to browser. Defaults to Environment variables. + /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. + /// Network proxy settings. + /// Specific user agent to use in this context. + /// Toggles bypassing page's Content-Security-Policy. + /// Whether or not to enable or disable JavaScript in the context. Defaults to true. + /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. + /// Changes the Geolocation of the context. + /// A from origin keys to permissions values. See for more details. + /// Gets or sets whether the meta viewport tag is taken into account. + /// Whether to emulate network being offline. Defaults to `false`. + /// Gets or sets the device scale factor. + /// Credentials for HTTP authentication. + /// Specifies if viewport supports touch events. Defaults to false. + /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. + /// Emulates 'prefers-colors-scheme' media feature. + /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. + /// An object containing additional HTTP headers to be sent with every request. + /// A that completes when the browser is launched, yielding the browser server. + Task LaunchPersistenContextAsync( + string userDataDir, + bool? headless = null, + string[] args = null, + bool? devtools = null, + string executablePath = null, + string downloadsPath = null, + bool? ignoreHTTPSErrors = null, + int? timeout = null, + bool? dumpIO = null, + int? slowMo = null, + bool? ignoreDefaultArgs = null, + string[] ignoredDefaultArgs = null, + IDictionary env = null, + IDictionary firefoxUserPrefs = null, + ProxySettings proxy = null, + string userAgent = null, + bool? bypassCSP = null, + bool? javaScriptEnabled = null, + string timezoneId = null, + Geolocation geolocation = null, + ContextPermission[] permissions = null, + bool? isMobile = null, + bool? offline = null, + decimal? deviceScaleFactor = null, + Credentials httpCredentials = null, + bool? hasTouch = null, + bool? acceptDownloads = null, + ColorScheme? colorScheme = null, + string locale = null, + Dictionary extraHttpHeaders = null); + /// /// Launches browser that uses persistent storage located at userDataDir and returns the only context. Closing this context will automatically close the browser. /// diff --git a/src/PlaywrightSharp/LaunchOptions.cs b/src/PlaywrightSharp/LaunchOptions.cs index 95999d91f8..d54f08b505 100644 --- a/src/PlaywrightSharp/LaunchOptions.cs +++ b/src/PlaywrightSharp/LaunchOptions.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace PlaywrightSharp @@ -10,240 +11,183 @@ public class LaunchOptions /// /// Whether to run browser in headless mode. Defaults to true unless the devtools option is true. /// - public bool? Headless - { - get - { - Values.TryGetValue("headless", out object result); - return result as bool?; - } - set => Values["headless"] = value; - } + public bool? Headless { get; set; } /// /// Additional arguments to pass to the browser instance. /// - public string[] Args - { - get - { - Values.TryGetValue("args", out object result); - return result as string[]; - } - set => Values["args"] = value; - } + public string[] Args { get; set; } /// /// Path to a User Data Directory. /// - public string UserDataDir - { - get - { - Values.TryGetValue("userDataDir", out object result); - return result as string; - } - set => Values["userDataDir"] = value; - } + public string UserDataDir { get; set; } /// /// Whether to auto-open DevTools panel for each tab. If this option is true, the headless option will be set false. /// - public bool? Devtools - { - get - { - Values.TryGetValue("devtools", out object result); - return result as bool?; - } - set => Values["devtools"] = value; - } + public bool? Devtools { get; set; } /// /// Path to a browser executable to run instead of the bundled one. /// - public string ExecutablePath - { - get - { - Values.TryGetValue("executablePath", out object result); - return result as string; - } - set => Values["executablePath"] = value; - } + public string ExecutablePath { get; set; } /// /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. /// - public string DownloadsPath - { - get - { - Values.TryGetValue("downloadsPath", out object result); - return result as string; - } - set => Values["downloadsPath"] = value; - } + public string DownloadsPath { get; set; } /// /// Whether to ignore HTTPS errors during navigation. Defaults to false. /// - public bool? IgnoreHTTPSErrors - { - get - { - Values.TryGetValue("ignoreHTTPSErrors", out object result); - return result as bool?; - } - set => Values["ignoreHTTPSErrors"] = value; - } + public bool? IgnoreHTTPSErrors { get; set; } /// /// Maximum time in milliseconds to wait for the browser instance to start. /// - public int? Timeout - { - get - { - Values.TryGetValue("timeout", out object result); - return result as int?; - } - set => Values["timeout"] = value; - } + public int? Timeout { get; set; } /// /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. /// - public bool? DumpIO - { - get - { - Values.TryGetValue("dumpIO", out object result); - return result as bool?; - } - set => Values["dumpIO"] = value; - } + public bool? DumpIO { get; set; } /// /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. /// - public int? SlowMo - { - get - { - Values.TryGetValue("slowMo", out object result); - return result as int?; - } - set => Values["slowmMo"] = value; - } - - /// - /// Logs process counts after launching the browser and after exiting. - /// - public bool? LogProcess - { - get - { - Values.TryGetValue("logProgress", out object result); - return result as bool?; - } - set => Values["logProgress"] = value; - } + public int? SlowMo { get; set; } /// /// If true, Playwright does not pass its own configurations args and only uses the ones from args. /// Dangerous option; use with care. Defaults to false. /// - public bool? IgnoreDefaultArgs - { - get - { - Values.TryGetValue("ignoreDefaultAR", out object result); - return result as bool?; - } - set => Values["headless"] = value; - } + public bool? IgnoreDefaultArgs { get; set; } /// /// if is set to false this list will be used to filter default arguments. /// - public string[] IgnoredDefaultArgs - { - get - { - Values.TryGetValue("ignoredDefaultArgs", out object result); - return result as string[]; - } - set => Values["ignoredDefaultArgs"] = value; - } + public string[] IgnoredDefaultArgs { get; set; } /// /// Specify environment variables that will be visible to browser. Defaults to Environment variables. /// - public IDictionary Env - { - get - { - Values.TryGetValue("env", out object result); - return result as Dictionary; - } - set => Values["env"] = value; - } + public IDictionary Env { get; set; } /// /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. /// - public IDictionary FirefoxUserPrefs - { - get - { - Values.TryGetValue("firefoxUserPrefs", out object result); - return result as Dictionary; - } - set => Values["firefoxUserPrefs"] = value; - } + public IDictionary FirefoxUserPrefs { get; set; } /// /// Network proxy settings. /// - public ProxySettings Proxy - { - get - { - Values.TryGetValue("proxy", out object result); - return result as ProxySettings; - } - set => Values["proxy"] = value; - } - - internal Dictionary Values { get; } = new Dictionary(); + public ProxySettings Proxy { get; set; } /// /// Converts the to . /// - /// Option to convert. - public static implicit operator LaunchPersistentOptions(LaunchOptions options) + /// The object converted to . + public LaunchPersistentOptions ToPersistentOptions() + => new LaunchPersistentOptions + { + Headless = Headless, + Args = Args, + UserDataDir = UserDataDir, + Devtools = Devtools, + ExecutablePath = ExecutablePath, + DownloadsPath = DownloadsPath, + IgnoreHTTPSErrors = IgnoreHTTPSErrors, + Timeout = Timeout, + DumpIO = DumpIO, + SlowMo = SlowMo, + IgnoreDefaultArgs = IgnoreDefaultArgs, + IgnoredDefaultArgs = IgnoredDefaultArgs, + Env = Env, + FirefoxUserPrefs = FirefoxUserPrefs, + Proxy = Proxy, + }; + + internal virtual Dictionary ToChannelDictionary() { - if (options == null) + var args = new Dictionary(); + + if (Headless != null) { - return null; + args["headless"] = Headless; } - var result = new LaunchPersistentOptions(); - foreach (var kv in options.Values) + if (Args != null) { - result.Values[kv.Key] = kv.Value; + args["args"] = Args; } - return result; - } + if (!string.IsNullOrEmpty(UserDataDir)) + { + args["userDataDir"] = UserDataDir; + } - /// - /// Converts the to . - /// - /// A with the same information as the . - public LaunchPersistentOptions ToLaunchPersistentOptions() => this; + if (Devtools != null) + { + args["devTools"] = Devtools; + } + + if (ExecutablePath != null) + { + args["executablePath"] = ExecutablePath; + } + + if (DownloadsPath != null) + { + args["downloadsPath"] = DownloadsPath; + } - internal Dictionary ToChannelDictionary() => Values; + if (IgnoreHTTPSErrors != null) + { + args["ignoreHTTPSErrors"] = IgnoreHTTPSErrors; + } + + if (Timeout != null) + { + args["timeout"] = Timeout; + } + + if (DumpIO != null) + { + args["dumpIO"] = DumpIO; + } + + if (SlowMo != null) + { + args["slowMo"] = SlowMo; + } + + if (IgnoreDefaultArgs != null) + { + args["ignoreDefaultArgs"] = IgnoreDefaultArgs; + } + + if (IgnoredDefaultArgs != null) + { + args["ignoredDefaultArgs"] = IgnoredDefaultArgs; + } + + if (Env != null) + { + args["env"] = Env; + } + + if (FirefoxUserPrefs != null) + { + args["firefoxUserPrefs"] = FirefoxUserPrefs; + } + + if (Proxy != null) + { + args["proxy"] = Proxy; + } + + return args; + } } } diff --git a/src/PlaywrightSharp/LaunchPersistentOptions.cs b/src/PlaywrightSharp/LaunchPersistentOptions.cs index aa0bb8ea49..459f9039e7 100644 --- a/src/PlaywrightSharp/LaunchPersistentOptions.cs +++ b/src/PlaywrightSharp/LaunchPersistentOptions.cs @@ -6,361 +6,87 @@ namespace PlaywrightSharp /// /// Options for . /// - public class LaunchPersistentOptions + public class LaunchPersistentOptions : LaunchOptions { - /// - /// Path to a browser executable to run instead of the bundled one. - /// - public string ExecutablePath - { - get - { - Values.TryGetValue("executablePath", out object result); - return result as string; - } - set => Values["executablePath"] = value; - } - - /// - /// If specified, accepted downloads are downloaded into this folder. Otherwise, temporary folder is created and is deleted when browser is closed. - /// - public string DownloadsPath - { - get - { - Values.TryGetValue("downloadsPath", out object result); - return result as string; - } - set => Values["downloadsPath"] = value; - } - - /// - /// Whether to ignore HTTPS errors during navigation. Defaults to false. - /// - public bool? IgnoreHTTPSErrors - { - get - { - Values.TryGetValue("ignoreHTTPSErrors", out object result); - return result as bool?; - } - set => Values["ignoreHTTPSErrors"] = value; - } - - /// - /// Maximum time in milliseconds to wait for the browser instance to start. - /// - public int? Timeout - { - get - { - Values.TryGetValue("timeout", out object result); - return result as int?; - } - set => Values["timeout"] = value; - } - - /// - /// Whether to pipe browser process stdout and stderr into process.stdout and process.stderr. Defaults to false. - /// - public bool? DumpIO - { - get - { - Values.TryGetValue("dumpIO", out object result); - return result as bool?; - } - set => Values["dumpIO"] = value; - } - - /// - /// Slows down PlaywrightSharp operations by the specified amount of milliseconds. Useful so that you can see what is going on. - /// - public int? SlowMo - { - get - { - Values.TryGetValue("slowmo", out object result); - return result as int?; - } - set => Values["slowmo"] = value; - } - - /// - /// If true, Playwright does not pass its own configurations args and only uses the ones from args. - /// Dangerous option; use with care. Defaults to false. - /// - public bool? IgnoreDefaultArgs - { - get - { - Values.TryGetValue("ignoreDefaultAR", out object result); - return result as bool?; - } - set => Values["headless"] = value; - } - - /// - /// if is set to false this list will be used to filter default arguments. - /// - public string[] IgnoredDefaultArgs - { - get - { - Values.TryGetValue("ignoredDefaultArgs", out object result); - return result as string[]; - } - set => Values["ignoredDefaultArgs"] = value; - } - - /// - /// Specify environment variables that will be visible to browser. Defaults to Environment variables. - /// - public IDictionary Env - { - get - { - Values.TryGetValue("env", out object result); - return result as Dictionary; - } - set => Values["env"] = value; - } - - /// - /// Firefox user preferences. Learn more about the Firefox user preferences at about:config. - /// - public IDictionary FirefoxUserPrefs - { - get - { - Values.TryGetValue("firefoxUserPrefs", out object result); - return result as Dictionary; - } - set => Values["firefoxUserPrefs"] = value; - } - /// /// Sets a consistent viewport for each page. Defaults to an 800x600 viewport. null disables the default viewport. /// - public ViewportSize Viewport - { - get - { - Values.TryGetValue("viewport", out object result); - return result as ViewportSize; - } - set => Values["viewport"] = value; - } + public ViewportSize Viewport { get; set; } /// /// Specific user agent to use in this context. /// - public string UserAgent - { - get - { - Values.TryGetValue("userAgent", out object result); - return result as string; - } - set => Values["userAgent"] = value; - } + public string UserAgent { get; set; } /// /// Toggles bypassing page's Content-Security-Policy. /// - public bool? BypassCSP - { - get - { - Values.TryGetValue("bypassCSP", out object result); - return result as bool?; - } - set => Values["bypassCSP"] = value; - } + public bool? BypassCSP { get; set; } /// /// Whether or not to enable or disable JavaScript in the context. Defaults to true. /// - public bool? JavaScriptEnabled - { - get - { - Values.TryGetValue("javaScriptEnabled", out object result); - return result as bool?; - } - set => Values["javaScriptEnabled"] = value; - } + public bool? JavaScriptEnabled { get; set; } /// /// Changes the timezone of the context. See ICU’s metaZones.txt for a list of supported timezone IDs. /// - public string TimezoneId - { - get - { - Values.TryGetValue("timezoneId", out object result); - return result as string; - } - set => Values["timezoneId"] = value; - } + public string TimezoneId { get; set; } /// /// Changes the Geolocation of the context. /// - public Geolocation Geolocation - { - get - { - Values.TryGetValue("geolocation", out object result); - return result as Geolocation; - } - set => Values["geolocation"] = value; - } + public Geolocation Geolocation { get; set; } /// /// A from origin keys to permissions values. See for more details. /// - public ContextPermission[] Permissions - { - get - { - Values.TryGetValue("permissions", out object result); - return result as ContextPermission[]; - } - set => Values["permissions"] = value; - } + public ContextPermission[] Permissions { get; set; } /// /// Gets or sets whether the meta viewport tag is taken into account. /// - public bool? IsMobile - { - get - { - Values.TryGetValue("isMobile", out object result); - return result as bool?; - } - set => Values["isMobile"] = value; - } + public bool? IsMobile { get; set; } /// /// Whether to emulate network being offline. Defaults to `false`. /// - public bool? Offline - { - get - { - Values.TryGetValue("offline", out object result); - return result as bool?; - } - set => Values["offline"] = value; - } + public bool? Offline { get; set; } /// /// Gets or sets the device scale factor. /// - public double? DeviceScaleFactor - { - get - { - Values.TryGetValue("deviceScaleFactor", out object result); - return result as double?; - } - set => Values["deviceScaleFactor"] = value; - } + public decimal? DeviceScaleFactor { get; set; } /// /// Credentials for HTTP authentication. /// - public Credentials HttpCredentials - { - get - { - Values.TryGetValue("httpCredentials", out object result); - return result as Credentials; - } - set => Values["httpCredentials"] = value; - } + public Credentials HttpCredentials { get; set; } /// /// Specifies if viewport supports touch events. Defaults to false. /// - public bool? HasTouch - { - get - { - Values.TryGetValue("hasTouch", out object result); - return result as bool?; - } - set => Values["hasTouch"] = value; - } + public bool? HasTouch { get; set; } /// /// Whether to automatically download all the attachments. Defaults to false where all the downloads are canceled. /// - public bool? AcceptDownloads - { - get - { - Values.TryGetValue("acceptDownloads", out object result); - return result as bool?; - } - set => Values["acceptDownloads"] = value; - } + public bool? AcceptDownloads { get; set; } /// /// Emulates 'prefers-colors-scheme' media feature. /// - public ColorScheme? ColorScheme - { - get - { - Values.TryGetValue("colorScheme", out object result); - return result as ColorScheme?; - } - set => Values["acceptDownloads"] = value; - } + public ColorScheme? ColorScheme { get; set; } /// /// Specify user locale, for example en-GB, de-DE, etc. Locale will affect navigator.language value, Accept-Language request header value as well as number and date formatting rules. /// - public string Locale - { - get - { - Values.TryGetValue("locale", out object result); - return result as string; - } - set => Values["locale"] = value; - } + public string Locale { get; set; } /// /// An object containing additional HTTP headers to be sent with every request. /// - public Dictionary ExtraHttpHeaders - { - get - { - Values.TryGetValue("extraHTTPHeaders", out object result); - return result as Dictionary; - } - set => Values["extraHTTPHeaders"] = value; - } - - /// - /// Network proxy settings. - /// - public ProxySettings Proxy - { - get - { - Values.TryGetValue("proxy", out object result); - return result as ProxySettings; - } - set => Values["proxy"] = value; - } - - internal Dictionary Values { get; } = new Dictionary(); + public Dictionary ExtraHttpHeaders { get; set; } /// /// Adds all the values set int into . @@ -375,10 +101,23 @@ public ProxySettings Proxy return null; } - foreach (var kv in right.Values) - { - left.Values[kv.Key] = kv.Value; - } + left.Viewport = right.Viewport ?? left.Viewport; + left.UserAgent = right.UserAgent ?? left.UserAgent; + left.BypassCSP = right.BypassCSP ?? left.BypassCSP; + left.JavaScriptEnabled = right.JavaScriptEnabled ?? left.JavaScriptEnabled; + left.IgnoreHTTPSErrors = right.IgnoreHTTPSErrors ?? left.IgnoreHTTPSErrors; + left.TimezoneId = right.TimezoneId ?? left.TimezoneId; + left.Geolocation = right.Geolocation ?? left.Geolocation; + left.Permissions = right.Permissions ?? left.Permissions; + left.IsMobile = right.IsMobile ?? left.IsMobile; + left.Offline = right.Offline ?? left.Offline; + left.DeviceScaleFactor = right.DeviceScaleFactor ?? left.DeviceScaleFactor; + left.HttpCredentials = right.HttpCredentials ?? left.HttpCredentials; + left.HasTouch = right.HasTouch ?? left.HasTouch; + left.AcceptDownloads = right.AcceptDownloads ?? left.AcceptDownloads; + left.ColorScheme = right.ColorScheme ?? left.ColorScheme; + left.Locale = right.Locale ?? left.Locale; + left.ExtraHttpHeaders = right.ExtraHttpHeaders ?? left.ExtraHttpHeaders; return left; } @@ -403,6 +142,96 @@ public BrowserContextOptions Clone() return copy; } - internal Dictionary ToChannelDictionary() => Values; + internal override Dictionary ToChannelDictionary() + { + var args = base.ToChannelDictionary(); + + if (Viewport == null || !Viewport.Equals(ViewportSize.None)) + { + args["viewport"] = Viewport; + } + + if (!string.IsNullOrEmpty(UserAgent)) + { + args["userAgent"] = UserAgent; + } + + if (BypassCSP != null) + { + args["bypassCSP"] = BypassCSP; + } + + if (JavaScriptEnabled != null) + { + args["javaScriptEnabled"] = JavaScriptEnabled; + } + + if (IgnoreHTTPSErrors != null) + { + args["ignoreHTTPSErrors"] = IgnoreHTTPSErrors; + } + + if (!string.IsNullOrEmpty(TimezoneId)) + { + args["timezoneId"] = TimezoneId; + } + + if (Geolocation != null) + { + args["geolocation"] = Geolocation; + } + + if (Permissions != null) + { + args["permissions"] = Permissions; + } + + if (IsMobile != null) + { + args["isMobile"] = IsMobile; + } + + if (Offline != null) + { + args["offline"] = Offline; + } + + if (DeviceScaleFactor != null) + { + args["deviceScaleFactor"] = DeviceScaleFactor; + } + + if (HttpCredentials != null) + { + args["httpCredentials"] = HttpCredentials; + } + + if (HasTouch != null) + { + args["hasTouch"] = HasTouch; + } + + if (AcceptDownloads != null) + { + args["acceptDownloads"] = AcceptDownloads; + } + + if (ColorScheme != null) + { + args["colorScheme"] = ColorScheme; + } + + if (Locale != null) + { + args["locale"] = Locale; + } + + if (ExtraHttpHeaders != null) + { + args["extraHTTPHeaders"] = ExtraHttpHeaders; + } + + return args; + } } } diff --git a/src/PlaywrightSharp/PlaywrightSharp.csproj b/src/PlaywrightSharp/PlaywrightSharp.csproj index 847fd75463..42633366b7 100644 --- a/src/PlaywrightSharp/PlaywrightSharp.csproj +++ b/src/PlaywrightSharp/PlaywrightSharp.csproj @@ -11,6 +11,10 @@ netstandard2.0;netstandard2.1 8.0 + embedded + true + https://github.com/hardkoded/playwright-sharp + true bin\$(Configuration)\netstandard2.0\PlaywrightSharp.xml true false @@ -45,6 +49,7 @@ + diff --git a/src/PlaywrightSharp/Transport/Channels/BrowserChannel.cs b/src/PlaywrightSharp/Transport/Channels/BrowserChannel.cs index 665fc98dd9..7e9c6c2bd5 100644 --- a/src/PlaywrightSharp/Transport/Channels/BrowserChannel.cs +++ b/src/PlaywrightSharp/Transport/Channels/BrowserChannel.cs @@ -28,7 +28,7 @@ internal Task NewContextAsync(BrowserContextOptions optio => Scope.SendMessageToServer( Guid, "newContext", - (options ?? new BrowserContextOptions()).ToChannelDictionary()); + options.ToChannelDictionary()); internal Task CloseAsync() => Scope.SendMessageToServer(Guid, "close", null); diff --git a/src/PlaywrightSharp/Transport/Channels/BrowserTypeChannel.cs b/src/PlaywrightSharp/Transport/Channels/BrowserTypeChannel.cs index 88309119de..d62829137b 100644 --- a/src/PlaywrightSharp/Transport/Channels/BrowserTypeChannel.cs +++ b/src/PlaywrightSharp/Transport/Channels/BrowserTypeChannel.cs @@ -11,10 +11,12 @@ public BrowserTypeChannel(string guid, ConnectionScope scope, BrowserType owner) } public Task LaunchAsync(LaunchOptions options) - => Scope.SendMessageToServer( + { + return Scope.SendMessageToServer( Guid, "launch", - (options ?? new LaunchOptions()).ToChannelDictionary()); + options.ToChannelDictionary()); + } public Task LaunchServerAsync(LaunchOptions options) => Scope.SendMessageToServer( @@ -35,7 +37,7 @@ internal Task ConnectAsync(string wsEndpoint, int? timeout = nul internal Task LaunchPersistenContextAsync(string userDataDir, LaunchPersistentOptions options) { - var args = (options ?? new LaunchPersistentOptions()).ToChannelDictionary(); + var args = options.ToChannelDictionary(); args["userDataDir"] = userDataDir; return Scope.SendMessageToServer(Guid, "launchPersistentContext", args); diff --git a/src/PlaywrightSharp/ViewportSize.cs b/src/PlaywrightSharp/ViewportSize.cs index 1773b69550..6cac83508b 100644 --- a/src/PlaywrightSharp/ViewportSize.cs +++ b/src/PlaywrightSharp/ViewportSize.cs @@ -7,6 +7,11 @@ namespace PlaywrightSharp /// public class ViewportSize : IEquatable { + /// + /// ViewportSize used to determine if the a Viewport was set or not. + /// + public static ViewportSize None => new ViewportSize { Height = -1, Width = -1 }; + /// /// Viewport width. ///