Skip to content

Commit 436c93c

Browse files
committed
feat: Add possibility to load Playwright settings programmatically
As an alternative to using a .runsettings XML file. Fixes microsoft#3081
1 parent df59854 commit 436c93c

File tree

6 files changed

+84
-10
lines changed

6 files changed

+84
-10
lines changed

src/Playwright.MSTest/WorkerAwareTest.cs

+17
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,26 @@ public async Task<T> RegisterService<T>(string name, Func<Task<T>> factory) wher
3434
return (_currentWorker.Services[name] as T)!;
3535
}
3636

37+
protected virtual PlaywrightSettings? PlaywrightSettings()
38+
{
39+
return null;
40+
}
41+
42+
private void LoadPlaywrightSettings()
43+
{
44+
var settings = PlaywrightSettings();
45+
if (settings != null)
46+
{
47+
PlaywrightSettingsProvider.Load(settings);
48+
}
49+
}
50+
3751
[TestInitialize]
3852
public void WorkerSetup()
3953
{
54+
// Must be run before accessing any static PlaywrightSettingsProvider.* properties
55+
LoadPlaywrightSettings();
56+
4057
if (PlaywrightSettingsProvider.ExpectTimeout.HasValue)
4158
{
4259
AssertionsBase.SetDefaultTimeout(PlaywrightSettingsProvider.ExpectTimeout.Value);

src/Playwright.NUnit/WorkerAwareTest.cs

+18
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ public async Task<T> RegisterService<T>(string name, Func<Task<T>> factory) wher
5858
return (_currentWorker.Services[name] as T)!;
5959
}
6060

61+
protected virtual PlaywrightSettings? PlaywrightSettings()
62+
{
63+
return null;
64+
}
65+
66+
private void LoadPlaywrightSettings()
67+
{
68+
var settings = PlaywrightSettings();
69+
if (settings != null)
70+
{
71+
PlaywrightSettingsProvider.Load(settings);
72+
}
73+
}
74+
6175
[SetUp]
6276
public void WorkerSetup()
6377
{
@@ -66,6 +80,10 @@ public void WorkerSetup()
6680
_currentWorker = new();
6781
}
6882
WorkerIndex = _currentWorker.WorkerIndex;
83+
84+
// Must be run before accessing any static PlaywrightSettingsProvider.* properties
85+
LoadPlaywrightSettings();
86+
6987
if (PlaywrightSettingsProvider.ExpectTimeout.HasValue)
7088
{
7189
AssertionsBase.SetDefaultTimeout(PlaywrightSettingsProvider.ExpectTimeout.Value);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Microsoft.Playwright.TestAdapter;
2+
3+
public enum PlaywrightBrowser
4+
{
5+
Chromium,
6+
Firefox,
7+
WebKit,
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace Microsoft.Playwright.TestAdapter;
4+
5+
public class PlaywrightSettings
6+
{
7+
public PlaywrightBrowser Browser { get; set; } = PlaywrightBrowser.Chromium;
8+
public BrowserTypeLaunchOptions? LaunchOptions { get; set; }
9+
public TimeSpan? ExpectTimeout { get; set; }
10+
}

src/Playwright.TestAdapter/PlaywrightSettingsProvider.cs

+13-10
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,18 @@ namespace Microsoft.Playwright.TestAdapter;
3434
public class PlaywrightSettingsProvider : ISettingsProvider
3535
{
3636
private static PlaywrightSettingsXml? _settings = null!;
37+
private static PlaywrightSettings? _playwrightSettings;
3738

3839
public static string BrowserName
3940
{
4041
get
4142
{
43+
if (_playwrightSettings != null)
44+
{
45+
var browser = _playwrightSettings.Browser.ToString().ToLowerInvariant();
46+
ValidateBrowserName(browser, "PlaywrightSettings.Browser property", string.Empty);
47+
return browser;
48+
}
4249
var browserFromEnv = Environment.GetEnvironmentVariable("BROWSER")?.ToLowerInvariant();
4350
// GitHub Codespaces sets the BROWSER environment variable, ignore it if its bogus.
4451
var ignoreValueFromEnv = Environment.GetEnvironmentVariable("CODESPACES") == "true" && browserFromEnv!.StartsWith("/vscode/");
@@ -61,23 +68,16 @@ public static float? ExpectTimeout
6168
{
6269
get
6370
{
64-
if (_settings == null)
65-
{
66-
return null;
67-
}
68-
if (_settings.ExpectTimeout.HasValue)
69-
{
70-
return _settings.ExpectTimeout.Value;
71-
}
72-
return null;
71+
var expectTimeout = _playwrightSettings?.ExpectTimeout?.TotalMilliseconds;
72+
return expectTimeout.HasValue ? Convert.ToSingle(expectTimeout.Value) : _settings?.ExpectTimeout;
7373
}
7474
}
7575

7676
public static BrowserTypeLaunchOptions LaunchOptions
7777
{
7878
get
7979
{
80-
var launchOptions = _settings?.LaunchOptions ?? new BrowserTypeLaunchOptions();
80+
var launchOptions = _playwrightSettings?.LaunchOptions ?? _settings?.LaunchOptions ?? new BrowserTypeLaunchOptions();
8181
if (Environment.GetEnvironmentVariable("HEADED") == "1")
8282
{
8383
launchOptions.Headless = false;
@@ -104,4 +104,7 @@ private static void ValidateBrowserName(string browserName, string fromText, str
104104

105105
public void Load(XmlReader reader)
106106
=> _settings = new PlaywrightSettingsXml(reader);
107+
108+
public static void Load(PlaywrightSettings settings)
109+
=> _playwrightSettings = settings;
107110
}

src/Playwright.Xunit/WorkerAwareTest.cs

+18
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ public async Task<T> RegisterService<T>(string name, Func<Task<T>> factory) wher
5757
return (_currentWorker.Services[name] as T)!;
5858
}
5959

60+
protected virtual PlaywrightSettings? PlaywrightSettings()
61+
{
62+
return null;
63+
}
64+
65+
private void LoadPlaywrightSettings()
66+
{
67+
var settings = PlaywrightSettings();
68+
if (settings != null)
69+
{
70+
PlaywrightSettingsProvider.Load(settings);
71+
}
72+
}
73+
6074
async public override Task InitializeAsync()
6175
{
6276
await base.InitializeAsync().ConfigureAwait(false);
@@ -65,6 +79,10 @@ async public override Task InitializeAsync()
6579
_currentWorker = new();
6680
}
6781
WorkerIndex = _currentWorker.WorkerIndex;
82+
83+
// Must be run before accessing any static PlaywrightSettingsProvider.* properties
84+
LoadPlaywrightSettings();
85+
6886
if (PlaywrightSettingsProvider.ExpectTimeout.HasValue)
6987
{
7088
AssertionsBase.SetDefaultTimeout(PlaywrightSettingsProvider.ExpectTimeout.Value);

0 commit comments

Comments
 (0)