Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions src/Microsoft.TryDotNet.IntegrationTests/EditorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public async Task can_load_monaco_editor()
{
var page = await NewPageAsync();
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
var isVisible = await page.Locator("div[role = \"code\"]").IsVisibleAsync();

await page.TestScreenShotAsync();
Expand All @@ -52,7 +52,7 @@ await page.RouteAsync("**/*", async route =>
});

await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.Locator("div[role = \"code\"]").IsVisibleAsync();

await page.TestScreenShotAsync();
Expand All @@ -66,7 +66,7 @@ public async Task wasm_runner_is_not_visible_to_screenReaders()
var page = await NewPageAsync();

await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.Locator("div[role = \"code\"]").IsVisibleAsync();

await page.TestScreenShotAsync();
Expand All @@ -83,7 +83,7 @@ public async Task wasm_runner_is_not_part_of_tab_navigation()
var page = await NewPageAsync();

await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.Locator("div[role = \"code\"]").IsVisibleAsync();

await page.TestScreenShotAsync();
Expand All @@ -105,7 +105,7 @@ public async Task notifies_when_editor_is_ready()
var readyAwaiter = interceptor.AwaitForMessage("HostEditorReady");

await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
var found = await readyAwaiter;

await page.TestScreenShotAsync();
Expand All @@ -120,7 +120,7 @@ public async Task can_open_project()
await interceptor.InstallAsync(page);

await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");

Expand Down Expand Up @@ -151,7 +151,7 @@ public async Task can_open_document()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var randomValue = Guid.NewGuid().ToString("N");
Expand Down Expand Up @@ -195,7 +195,7 @@ public async Task can_open_document_and_populate_editor_from_region()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");

Expand Down Expand Up @@ -239,7 +239,7 @@ public async Task minimap_is_not_visible()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.TestScreenShotAsync();
var minimap = page.Locator("div.minimap");
var isHidden = await minimap.IsHiddenAsync();
Expand All @@ -253,7 +253,7 @@ public async Task can_show_minimap()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.DispatchMessage(new
{
type = "ConfigureMonacoEditor",
Expand All @@ -278,7 +278,7 @@ public async Task can_configure_theme()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
await page.DispatchMessage(new
{
type = "ConfigureMonacoEditor",
Expand All @@ -299,7 +299,7 @@ public async Task when_user_code_in_editor_diagnostics_are_produced()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -367,7 +367,7 @@ public async Task when_user_code_in_editor_is_executed_display_events_are_produc
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -425,7 +425,7 @@ public async Task user_typing_code_gets_completion()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -483,7 +483,7 @@ public async Task user_typing_code_gets_signatureHelp()
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -547,7 +547,7 @@ public async Task when_user_code_in_editor_is_executed_it_produces_runResult_eve
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -604,7 +604,7 @@ public async Task when_user_code_in_editor_is_executed_it_produces_runResult_eve
var interceptor = new MessageInterceptor();
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();

var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");
Expand Down Expand Up @@ -664,7 +664,7 @@ public async Task user_code_in_editor_is_executed()
await interceptor.InstallAsync(page);
await page.GotoAsync((await Services.GetTryDotNetServerAsync()).Url + "editor?enableLogging=true");

await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForEditorLoadedAsync();
var projectLoadedAwaiter = interceptor.AwaitForMessage("ProjectOpened");
var documentOpenedAwaiter = interceptor.AwaitForMessage("DocumentOpened");

Expand Down
16 changes: 16 additions & 0 deletions src/Microsoft.TryDotNet.IntegrationTests/PageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,22 @@ public static async Task<string> GetEditorContentAsync(this IFrameLocator iframe
return text;
}

/// <summary>
/// Waits for the Monaco editor page to be fully interactive.
/// Uses <see cref="LoadState.Load"/> (reliable on all browsers) followed by an explicit
/// wait for the Monaco editor container, avoiding the <see cref="LoadState.NetworkIdle"/>
/// state that Firefox never reaches when Blazor WASM keeps background connections open.
/// </summary>
public static async Task WaitForEditorLoadedAsync(this IPage page)
{
await page.WaitForLoadStateAsync(LoadState.Load);
await page.Locator(@"div[role=""code""]").WaitForAsync(new LocatorWaitForOptions
{
State = WaitForSelectorState.Visible,
Timeout = 90_000f
});
}

public static async Task ClearMonacoEditor(this IPage page)
{
var editor = page.Locator(@"textarea[role = ""textbox""]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected async Task<IPage> NewPageAsync()
{
var playwright = await Services.GetPlaywrightAsync();
var page = await playwright.Browser.NewPageAsync();
// Firefox needs more time to reach NetworkIdle due to Blazor WASM loading.
// Give Firefox extra time for GotoAsync and other navigation operations.
page.SetDefaultNavigationTimeout(90_000f);
return page;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public async Task loads_trydotnet_editor()

var pageUri = new Uri(QueryHelpers.AddQueryString(new Uri(learnRoot,"DocsHost.html").ToString(), param!));
await page.GotoAsync(pageUri.ToString());
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForLoadStateAsync(LoadState.Load);

await page.FindEditor();
}
Expand All @@ -62,7 +62,7 @@ public async Task can_load_code()

var pageUri = new Uri(QueryHelpers.AddQueryString(new Uri(learnRoot, "DocsHost.html").ToString(), param!));
await page.GotoAsync(pageUri.ToString());
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForLoadStateAsync(LoadState.Load);

var dotnetOnline = new DotNetOnline(page);

Expand Down Expand Up @@ -93,7 +93,7 @@ public async Task outputs_are_rendered()

var pageUri = new Uri(QueryHelpers.AddQueryString(new Uri(learnRoot, "DocsHost.html").ToString(), param!));
await page.GotoAsync(pageUri.ToString());
await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await page.WaitForLoadStateAsync(LoadState.Load);

var dotnetOnline = new DotNetOnline(page);

Expand Down
Loading