diff --git a/src/Microsoft.TryDotNet.IntegrationTests/EditorTests.cs b/src/Microsoft.TryDotNet.IntegrationTests/EditorTests.cs index 299f673a7..5f64f1ae5 100644 --- a/src/Microsoft.TryDotNet.IntegrationTests/EditorTests.cs +++ b/src/Microsoft.TryDotNet.IntegrationTests/EditorTests.cs @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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"); @@ -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"); @@ -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"); @@ -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(); @@ -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", @@ -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", @@ -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"); @@ -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"); @@ -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"); @@ -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"); @@ -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"); @@ -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"); @@ -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"); diff --git a/src/Microsoft.TryDotNet.IntegrationTests/PageExtensions.cs b/src/Microsoft.TryDotNet.IntegrationTests/PageExtensions.cs index 46a04e597..816e30a63 100644 --- a/src/Microsoft.TryDotNet.IntegrationTests/PageExtensions.cs +++ b/src/Microsoft.TryDotNet.IntegrationTests/PageExtensions.cs @@ -91,6 +91,22 @@ public static async Task GetEditorContentAsync(this IFrameLocator iframe return text; } + /// + /// Waits for the Monaco editor page to be fully interactive. + /// Uses (reliable on all browsers) followed by an explicit + /// wait for the Monaco editor container, avoiding the + /// state that Firefox never reaches when Blazor WASM keeps background connections open. + /// + 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""]"); diff --git a/src/Microsoft.TryDotNet.IntegrationTests/PlaywrightTestBase.cs b/src/Microsoft.TryDotNet.IntegrationTests/PlaywrightTestBase.cs index f295c9909..fdd878333 100644 --- a/src/Microsoft.TryDotNet.IntegrationTests/PlaywrightTestBase.cs +++ b/src/Microsoft.TryDotNet.IntegrationTests/PlaywrightTestBase.cs @@ -33,7 +33,7 @@ protected async Task 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; } diff --git a/src/Microsoft.TryDotNet.IntegrationTests/TryDotNetJsIntegrationTests.cs b/src/Microsoft.TryDotNet.IntegrationTests/TryDotNetJsIntegrationTests.cs index c85d64775..28bbfae53 100644 --- a/src/Microsoft.TryDotNet.IntegrationTests/TryDotNetJsIntegrationTests.cs +++ b/src/Microsoft.TryDotNet.IntegrationTests/TryDotNetJsIntegrationTests.cs @@ -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(); } @@ -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); @@ -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); diff --git a/src/Microsoft.TryDotNet.IntegrationTests/WasmRunnerTests.cs b/src/Microsoft.TryDotNet.IntegrationTests/WasmRunnerTests.cs index 81d4f4c6c..64f5a3c9c 100644 --- a/src/Microsoft.TryDotNet.IntegrationTests/WasmRunnerTests.cs +++ b/src/Microsoft.TryDotNet.IntegrationTests/WasmRunnerTests.cs @@ -25,8 +25,8 @@ public async Task can_load_wasmrunner() { var page = await NewPageAsync(); await page.GotoAsync(await TryDotNetUrlAsync() + "wasmrunner"); - await page.WaitForLoadStateAsync(LoadState.NetworkIdle); - await page.Locator(@"id=wasmRunner-sentinel").IsHiddenAsync(); + await page.WaitForLoadStateAsync(LoadState.Load); + await page.Locator(@"id=wasmRunner-sentinel").WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Attached, Timeout = 90_000f }); await page.TestScreenShotAsync(); } @@ -36,8 +36,8 @@ public async Task can_run_assembly() { var page = await NewPageAsync(); await page.GotoAsync(await TryDotNetUrlAsync() + "wasmrunner"); - await page.WaitForLoadStateAsync(LoadState.NetworkIdle); - await page.Locator(@"id=wasmRunner-sentinel").IsHiddenAsync(); + await page.WaitForLoadStateAsync(LoadState.Load); + await page.Locator(@"id=wasmRunner-sentinel").WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Attached, Timeout = 90_000f }); var messages = await page.ExecuteAssembly( @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAG+WAqcAAAAAAAAAAOAAIiALATAAAAYAAAACAAAAAAAAYiUAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAABAlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAD0JAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAaAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEJQAAAAAAAEgAAAACAAUAcCAAAIQEAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAcgEAAHAoCgAACgAqIgIoCwAACgAqIgIoCwAACgAqQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAhAEAACN+AADwAQAA2AEAACNTdHJpbmdzAAAAAMgDAAAcAAAAI1VTAOQDAAAQAAAAI0dVSUQAAAD0AwAAkAAAACNCbG9iAAAAAAAAAAIAAAFHFAAACQAAAAD6ATMAFgAAAQAAAAwAAAADAAAAAwAAAAsAAAAJAAAAAQAAAAEAAAAAAEoBAQAAAAAABgDaAKIBBgAsAaIBBgBNAI8BDwDCAQAABgATAXEBBgC7AHEBBgB4AHEBBgCVAHEBBgD6AHEBBgBhAHEBBgDRAWUBBgAdAGUBAAAAAAgAAAAAAAEAAQAAABAAXQGDAS0AAQABAAEAEAABADQALQABAAMAUCAAAAAAkQBsASMAAQBeIAAAAACGGIkBBgABAGcgAAAAAIYYiQEGAAEACQCJAQEAEQCJAQYAGQCJAQoAKQCJARAAMQCJARAAOQCJARAAQQCJARAASQCJARAAUQCJARAAYQBDABUAWQCJAQYALgALACcALgATADAALgAbAE8ALgAjAFgALgArAGwALgAzAHcALgA7AIQALgBDAFgALgBLAFgABIAAAAEAAAAAAAAAAAAAAAAAJQAAAAIAAAAAAAAAAAAAABoAEQAAAAAAAAAAAABDbGFzczEAPE1vZHVsZT4AbmV0c3RhbmRhcmQAQ29uc29sZQBibGF6b3ItY29uc29sZQBibGF6b3JfY29uc29sZQBXcml0ZUxpbmUARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAGJsYXpvci1jb25zb2xlLmRsbABQcm9ncmFtAFN5c3RlbQBNYWluAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAE9iamVjdAAAGUgAZQBsAGwAbwAgAFcAbwByAGwAZAAhAAAAXQ9GanmtTEuzgc0NDhYR8wAEIAEBCAMgAAEFIAEBEREEIAEBDgQAAQEOCMx7E//NLd1RAwAAAQgBAAgAAAAAAB4BAAEAVAIWV3JhcE5vbkV4Y2VwdGlvblRocm93cwEIAQAHAQAAAAATAQAOYmxhem9yLWNvbnNvbGUAAAoBAAVEZWJ1ZwAADAEABzEuMC4wLjAAAAoBAAUxLjAuMAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAA4JQAAAAAAAAAAAABSJQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCUAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAGQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" @@ -56,8 +56,8 @@ public async Task can_run_assembly_2() { var page = await NewPageAsync(); await page.GotoAsync(await TryDotNetUrlAsync() + "wasmrunner"); - await page.WaitForLoadStateAsync(LoadState.NetworkIdle); - await page.Locator(@"id=wasmRunner-sentinel").IsHiddenAsync(); + await page.WaitForLoadStateAsync(LoadState.Load); + await page.Locator(@"id=wasmRunner-sentinel").WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Attached, Timeout = 90_000f }); var messages = await page.ExecuteAssembly( @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAESGl2IAAAAAAAAAAOAAIgALATAAAAYAAAACAAAAAAAAfiUAAAAgAAAAQAAAAABAAAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAACwlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAhAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgJQAAAAAAAEgAAAACAAUAZCAAAMgEAAABAAAAAQAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAH3soCwAACgAqIgIoDAAACgAqQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAmAEAACN+AAAEAgAA8AEAACNTdHJpbmdzAAAAAPQDAAAEAAAAI1VTAPgDAAAQAAAAI0dVSUQAAAAIBAAAwAAAACNCbG9iAAAAAAAAAAIAAAFHFQAACQAAAAD6ATMAFgAAAQAAAA0AAAACAAAAAgAAAAEAAAAMAAAACgAAAAEAAAACAAAAAABQAQEAAAAAAAYA4AC1AQYAMgG1AQYAOgCiAQ8A1QEAAAYAZQBcAQYAGQGKAQYAwQCKAQYAfgCKAQYAmwCKAQYAAAGKAQYATgCKAQYA6QF+AQoAEQB+AQAAAAABAAAAAAABAAEAAAAQAHYBdgExAAEAAQBQIAAAAACRAIUBIwABAFsgAAAAAIYYnAEGAAIAAAABAOQBCQCcAQEAEQCcAQYAGQCcAQoAKQCcARAAMQCcARAAOQCcARAAQQCcARAASQCcARAAUQCcARAAWQCcARAAaQAwABUAYQCcAQYALgALACkALgATADIALgAbAFEALgAjAFoALgArAJAALgAzAJ0ALgA7AKgALgBDALUALgBLAJAALgBTAJAABIAAAAEAAAAAAAAAAAAAAAAAGQAAAAYAAAAAAAAAAAAAABoAIQAAAAAABgAAAAAAAAAAAAAAGgAKAAAAAAAAAAAAADxNb2R1bGU+AFN5c3RlbS5Db25zb2xlAGNvbnNvbGUAU3lzdGVtLlJ1bnRpbWUAV3JpdGVMaW5lAERlYnVnZ2FibGVBdHRyaWJ1dGUAQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZQBUYXJnZXRGcmFtZXdvcmtBdHRyaWJ1dGUAQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUluZm9ybWF0aW9uYWxWZXJzaW9uQXR0cmlidXRlAEFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZQBDb21waWxhdGlvblJlbGF4YXRpb25zQXR0cmlidXRlAEFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZQBBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGUAUnVudGltZUNvbXBhdGliaWxpdHlBdHRyaWJ1dGUAY29uc29sZS5leGUAU3lzdGVtLlJ1bnRpbWUuVmVyc2lvbmluZwBQcm9ncmFtAFN5c3RlbQBNYWluAFN5c3RlbS5SZWZsZWN0aW9uAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAGFyZ3MAT2JqZWN0AAAAAADDjLfZIkfuSa5Es1ckswwxAAQgAQEIAyAAAQUgAQEREQQgAQEOBAABAQgIsD9ffxHVCjoFAAEBHQ4IAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCAEABwEAAAAANQEAGC5ORVRDb3JlQXBwLFZlcnNpb249djYuMAEAVA4URnJhbWV3b3JrRGlzcGxheU5hbWUADAEAB2NvbnNvbGUAAAoBAAVEZWJ1ZwAADAEABzEuMC4wLjAAAAoBAAUxLjAuMAAAVCUAAAAAAAAAAAAAbiUAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAlAAAAAAAAAAAAAAAAX0NvckV4ZU1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAIA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" @@ -76,8 +76,8 @@ public async Task can_run_assembly_and_produce_output() { var page = await NewPageAsync(); await page.GotoAsync(await TryDotNetUrlAsync() + "wasmrunner"); - await page.WaitForLoadStateAsync(LoadState.NetworkIdle); - await page.Locator(@"id=wasmRunner-sentinel").IsHiddenAsync(); + await page.WaitForLoadStateAsync(LoadState.Load); + await page.Locator(@"id=wasmRunner-sentinel").WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Attached, Timeout = 90_000f }); var messages = await page.ExecuteAssembly( @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAG+WAqcAAAAAAAAAAOAAIiALATAAAAYAAAACAAAAAAAAYiUAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAABAlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAD0JAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAaAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEJQAAAAAAAEgAAAACAAUAcCAAAIQEAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAcgEAAHAoCgAACgAqIgIoCwAACgAqIgIoCwAACgAqQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAhAEAACN+AADwAQAA2AEAACNTdHJpbmdzAAAAAMgDAAAcAAAAI1VTAOQDAAAQAAAAI0dVSUQAAAD0AwAAkAAAACNCbG9iAAAAAAAAAAIAAAFHFAAACQAAAAD6ATMAFgAAAQAAAAwAAAADAAAAAwAAAAsAAAAJAAAAAQAAAAEAAAAAAEoBAQAAAAAABgDaAKIBBgAsAaIBBgBNAI8BDwDCAQAABgATAXEBBgC7AHEBBgB4AHEBBgCVAHEBBgD6AHEBBgBhAHEBBgDRAWUBBgAdAGUBAAAAAAgAAAAAAAEAAQAAABAAXQGDAS0AAQABAAEAEAABADQALQABAAMAUCAAAAAAkQBsASMAAQBeIAAAAACGGIkBBgABAGcgAAAAAIYYiQEGAAEACQCJAQEAEQCJAQYAGQCJAQoAKQCJARAAMQCJARAAOQCJARAAQQCJARAASQCJARAAUQCJARAAYQBDABUAWQCJAQYALgALACcALgATADAALgAbAE8ALgAjAFgALgArAGwALgAzAHcALgA7AIQALgBDAFgALgBLAFgABIAAAAEAAAAAAAAAAAAAAAAAJQAAAAIAAAAAAAAAAAAAABoAEQAAAAAAAAAAAABDbGFzczEAPE1vZHVsZT4AbmV0c3RhbmRhcmQAQ29uc29sZQBibGF6b3ItY29uc29sZQBibGF6b3JfY29uc29sZQBXcml0ZUxpbmUARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAGJsYXpvci1jb25zb2xlLmRsbABQcm9ncmFtAFN5c3RlbQBNYWluAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAE9iamVjdAAAGUgAZQBsAGwAbwAgAFcAbwByAGwAZAAhAAAAXQ9GanmtTEuzgc0NDhYR8wAEIAEBCAMgAAEFIAEBEREEIAEBDgQAAQEOCMx7E//NLd1RAwAAAQgBAAgAAAAAAB4BAAEAVAIWV3JhcE5vbkV4Y2VwdGlvblRocm93cwEIAQAHAQAAAAATAQAOYmxhem9yLWNvbnNvbGUAAAoBAAVEZWJ1ZwAADAEABzEuMC4wLjAAAAoBAAUxLjAuMAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAA4JQAAAAAAAAAAAABSJQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCUAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAGQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="