Replace non-waiting Assert.True(await locator.IsVisibleAsync()) checks with auto-retrying Assertions.Expect(locator).ToBeVisibleAsync()/ToBeHiddenAsync() to remove flakiness against Blazor's async rendering. Table-row/field page objects (Metadata/Roles/Users/Profile) now expose ILocator helpers instead of Task<bool>, so deletion checks wait for the element to disappear. Also: rename ScreenshotHelper.CaptureIfFailedAsync to CaptureAsync (xUnit v2 cannot expose the test outcome to DisposeAsync, so it always captures the final page state), drop the unused TestConstants.ServerPort/BaseUrl now that ports bind dynamically, and fix IClassFixture doc comments to ICollectionFixture. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 lines
1.1 KiB
C#
37 lines
1.1 KiB
C#
using Microsoft.Playwright;
|
|
|
|
namespace LANCommander.Server.UI.Tests;
|
|
|
|
/// <summary>
|
|
/// Shared Playwright fixture that manages browser lifetime across all tests in the collection.
|
|
/// Starts the server process and initializes Playwright once per test run.
|
|
/// </summary>
|
|
public class PlaywrightFixture : IAsyncLifetime
|
|
{
|
|
public IPlaywright Playwright { get; private set; } = null!;
|
|
public IBrowser Browser { get; private set; } = null!;
|
|
|
|
public async Task InitializeAsync()
|
|
{
|
|
Playwright = await Microsoft.Playwright.Playwright.CreateAsync();
|
|
Browser = await Playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
|
|
{
|
|
Headless = true,
|
|
});
|
|
}
|
|
|
|
public async Task DisposeAsync()
|
|
{
|
|
await Browser.DisposeAsync();
|
|
Playwright.Dispose();
|
|
}
|
|
|
|
public async Task<IBrowserContext> NewContextAsync(string baseUrl)
|
|
{
|
|
return await Browser.NewContextAsync(new BrowserNewContextOptions
|
|
{
|
|
IgnoreHTTPSErrors = true,
|
|
BaseURL = baseUrl,
|
|
});
|
|
}
|
|
}
|