diff --git a/tests/Avalonia.Controls.WebView.Tests/HeadlessAdapterTests.cs b/tests/Avalonia.Controls.WebView.Tests/HeadlessAdapterTests.cs
index a8f5429f..fb591b64 100644
--- a/tests/Avalonia.Controls.WebView.Tests/HeadlessAdapterTests.cs
+++ b/tests/Avalonia.Controls.WebView.Tests/HeadlessAdapterTests.cs
@@ -67,7 +67,7 @@ public async Task NativeWebView_Navigation_And_Events()
var uri = new Uri("https://example.com");
webView.Source = uri;
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.True(navStarted);
Assert.True(navCompleted);
@@ -89,14 +89,14 @@ public async Task NativeWebView_NavigateToString_And_Refresh()
window.Show();
webView.NavigateToString("test");
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.True(navCompleted);
Assert.Equal(WebViewHelper.EmptyPage, webView.Source);
navCompleted = false;
Assert.True(webView.Refresh());
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.True(navCompleted);
}
@@ -390,7 +390,7 @@ private async Task ReattachAsync(Panel panel, NativeWebView webView)
await DoDelay();
}
- [AvaloniaFact(Skip = "Flaky test")]
+ [AvaloniaFact]
public async Task NativeWebView_NavigateToString_With_BaseUri()
{
var window = new Window();
@@ -403,7 +403,7 @@ public async Task NativeWebView_NavigateToString_With_BaseUri()
var baseUri = new Uri("https://example.com/");
webView.NavigateToString("test", baseUri);
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.True(navCompleted);
Assert.Equal(baseUri, webView.Source);
diff --git a/tests/Avalonia.Controls.WebView.Tests/HeadlessTestsBase.cs b/tests/Avalonia.Controls.WebView.Tests/HeadlessTestsBase.cs
index e3f6c73a..3ab13af2 100644
--- a/tests/Avalonia.Controls.WebView.Tests/HeadlessTestsBase.cs
+++ b/tests/Avalonia.Controls.WebView.Tests/HeadlessTestsBase.cs
@@ -1,4 +1,5 @@
using System;
+using System.Diagnostics;
using System.Threading.Tasks;
using Avalonia.Threading;
@@ -18,6 +19,23 @@ public async Task DoDelay()
Dispatcher.UIThread.RunJobs();
}
+ ///
+ /// Pumps the dispatcher until is true or the timeout runs out.
+ /// The headless adapter completes navigation on the thread pool and reports it back through the dispatcher,
+ /// so a fixed delay is not enough on a busy machine. On timeout this returns and the caller's assert fails.
+ ///
+ public async Task WaitFor(Func condition, int timeoutMs = 5000)
+ {
+ var stopwatch = Stopwatch.StartNew();
+ while (true)
+ {
+ Dispatcher.UIThread.RunJobs();
+ if (condition() || stopwatch.ElapsedMilliseconds > timeoutMs)
+ return;
+ await Task.Delay(5);
+ }
+ }
+
protected Task WaitForAdapterCreation(NativeWebView webView)
{
var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
diff --git a/tests/Avalonia.Controls.WebView.Tests/NativeWebViewTests.cs b/tests/Avalonia.Controls.WebView.Tests/NativeWebViewTests.cs
index 040f1c84..7a849ac8 100644
--- a/tests/Avalonia.Controls.WebView.Tests/NativeWebViewTests.cs
+++ b/tests/Avalonia.Controls.WebView.Tests/NativeWebViewTests.cs
@@ -86,7 +86,7 @@ public async Task Should_Navigate_If_Navigate_Called_Before_Window_Show()
webView.Navigate(uri); // before adding to window
window.Content = webView;
window.Show();
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.Equal(uri, webView.Source);
Assert.True(navCompleted);
@@ -107,7 +107,7 @@ public async Task Should_NavigateToString_If_Called_Before_Window_Show()
webView.NavigateToString("abc"); // before adding to window
window.Content = webView;
window.Show();
- await DoDelay();
+ await WaitFor(() => navCompleted);
Assert.Equal(WebViewHelper.EmptyPage, webView.Source);
Assert.True(navCompleted);