Skip to content

Commit cd3c5c3

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

File tree

6 files changed

+84
-10
lines changed

6 files changed

+84
-10
lines changed

src/Playwright.MSTest/WorkerAwareTest.cs

Lines changed: 17 additions & 0 deletions
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

Lines changed: 18 additions & 0 deletions
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);
Lines changed: 8 additions & 0 deletions
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+
}
Lines changed: 10 additions & 0 deletions
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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ namespace Microsoft.Playwright.TestAdapter;
3535
public class PlaywrightSettingsProvider : ISettingsProvider
3636
{
3737
private static PlaywrightSettingsXml? _settings = null!;
38+
private static PlaywrightSettings? _playwrightSettings;
3839

3940
public static void LoadViaEnvIfNeeded()
4041
{
@@ -56,6 +57,12 @@ public static string BrowserName
5657
{
5758
get
5859
{
60+
if (_playwrightSettings != null)
61+
{
62+
var browser = _playwrightSettings.Browser.ToString().ToLowerInvariant();
63+
ValidateBrowserName(browser, "PlaywrightSettings.Browser property", string.Empty);
64+
return browser;
65+
}
5966
var browserFromEnv = Environment.GetEnvironmentVariable("BROWSER")?.ToLowerInvariant();
6067
// GitHub Codespaces and DevContainers sets the BROWSER environment variable, ignore it if its bogus.
6168
if (!string.IsNullOrEmpty(browserFromEnv) && !browserFromEnv!.StartsWith("/vscode/"))
@@ -77,23 +84,16 @@ public static float? ExpectTimeout
7784
{
7885
get
7986
{
80-
if (_settings == null)
81-
{
82-
return null;
83-
}
84-
if (_settings.ExpectTimeout.HasValue)
85-
{
86-
return _settings.ExpectTimeout.Value;
87-
}
88-
return null;
87+
var expectTimeout = _playwrightSettings?.ExpectTimeout?.TotalMilliseconds;
88+
return expectTimeout.HasValue ? Convert.ToSingle(expectTimeout.Value) : _settings?.ExpectTimeout;
8989
}
9090
}
9191

9292
public static BrowserTypeLaunchOptions LaunchOptions
9393
{
9494
get
9595
{
96-
var launchOptions = _settings?.LaunchOptions ?? new BrowserTypeLaunchOptions();
96+
var launchOptions = _playwrightSettings?.LaunchOptions ?? _settings?.LaunchOptions ?? new BrowserTypeLaunchOptions();
9797
if (Environment.GetEnvironmentVariable("HEADED") == "1")
9898
{
9999
launchOptions.Headless = false;
@@ -124,5 +124,8 @@ public void Load(XmlReader reader)
124124
_settings = new PlaywrightSettingsXml(reader);
125125
Environment.SetEnvironmentVariable("PW_INTERNAL_ADAPTER_SETTINGS", JsonSerializer.Serialize(_settings));
126126
}
127+
128+
public static void Load(PlaywrightSettings settings)
129+
=> _playwrightSettings = settings;
127130
}
128131

src/Playwright.Xunit/WorkerAwareTest.cs

Lines changed: 18 additions & 0 deletions
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)