Skip to content

[🐛 Bug]: [dotnet] [bidi] Event handlers are blocked logically #16750

@nvborisenko

Description

@nvborisenko

Description

Currently all events came from remote end are processed ordered and synchronously. It is good approach following well-known experience by users, according "classic events".

The following code represents self-blocking situation: e.Context.NavigateAsync("https://www.selenium.dev") wants to execute a method which depends on another event handler (e.ContinueAsync()). It is logical dead lock.

Reproducible Code

using var driver = new FirefoxDriver(new FirefoxOptions { UseWebSocketUrl = true });

await using var bidi = await driver.AsBiDiAsync();

var context = new BrowsingContext(bidi, driver.CurrentWindowHandle);

Console.WriteLine(await bidi.StatusAsync());

await bidi.Network.InterceptRequestAsync(async e =>
{
    await e.ContinueAsync();
});

await context.NavigateAsync("https://www.selenium.dev", new() { Wait = ReadinessState.Complete });

await bidi.BrowsingContext.OnContextCreatedAsync(async e => await e.Context.NavigateAsync("https://www.selenium.dev"));

Debugging Logs

23:15:07.621 TRACE WebSocketTransport: BiDi SND --> {"id":31,"method":"browsingContext.navigate","params":{"context":"cb5faabc-d9fd-448a-8697-6a3ec7710473","url":"https://www.selenium.dev"}}
23:15:07.686 TRACE WebSocketTransport: BiDi RCV <-- {"type":"event","method":"network.beforeRequestSent","params":{"context":"cb5faabc-d9fd-448a-8697-6a3ec7710473","isBlocked":true,"navigation":"8be3d577-078f-49ee-8527-bd54ae120d64","redirectCount":0,"request":{"request":"83-00fe42f3-e49a-4f10-8fcc-db6d26b81b4b","url":"https://www.selenium.dev/","method":"GET","bodySize":0,"headersSize":0,"headers":[{"name":"Host","value":{"type":"string","value":"www.selenium.dev"}},{"name":"User-Agent","value":{"type":"string","value":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0"}},{"name":"Accept","value":{"type":"string","value":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}},{"name":"Accept-Language","value":{"type":"string","value":"en-US,en;q=0.5"}},{"name":"Accept-Encoding","value":{"type":"string","value":"gzip, deflate, br, zstd"}},{"name":"Connection","value":{"type":"string","value":"keep-alive"}},{"name":"Upgrade-Insecure-Requests","value":{"type":"string","value":"1"}},{"name":"Sec-Fetch-Dest","value":{"type":"string","value":"document"}},{"name":"Sec-Fetch-Mode","value":{"type":"string","value":"navigate"}},{"name":"Sec-Fetch-Site","value":{"type":"string","value":"none"}},{"name":"Sec-Fetch-User","value":{"type":"string","value":"?1"}}],"cookies":[],"destination":"document","initiatorType":null,"timings":{"timeOrigin":0,"requestTime":1766088907679.986,"redirectStart":0,"redirectEnd":0,"fetchStart":0,"dnsStart":0,"dnsEnd":0,"connectStart":0,"connectEnd":0,"tlsStart":0,"tlsEnd":0,"requestStart":0,"responseStart":0,"responseEnd":0}},"timestamp":1766088907685,"intercepts":["ecf8ca39-ca52-4823-bb4f-4d4aa87c5c2c"],"initiator":{"type":"other"}}}
23:15:37.645 ERROR Broker: Unhandled error processing BiDi event handler: System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at OpenQA.Selenium.BiDi.Broker.ExecuteCommandAsync[TCommand,TResult](TCommand command, CommandOptions options, JsonTypeInfo`1 jsonCommandTypeInfo, JsonTypeInfo`1 jsonResultTypeInfo)
   at OpenQA.Selenium.BiDi.BrowsingContext.BrowsingContextModule.NavigateAsync(BrowsingContext context, String url, NavigateOptions options)
   at Program.<>c.<<<Main>$>b__0_1>d.MoveNext() in E:\Temp\ConsoleApp79\ConsoleApp79\Program.cs:line 26
--- End of stack trace from previous location ---
   at OpenQA.Selenium.BiDi.AsyncEventHandler`1.InvokeAsync(EventArgs args)
   at OpenQA.Selenium.BiDi.Broker.ProcessEventsAwaiterAsync()
23:15:37.645 TRACE WebSocketTransport: BiDi SND --> {"id":32,"method":"network.continueRequest","params":{"request":"83-00fe42f3-e49a-4f10-8fcc-db6d26b81b4b"}}
23:15:37.647 TRACE WebSocketTransport: BiDi RCV <-- {"type":"success","id":32,"result":{}}
23:15:37.673 TRACE WebSocketTransport: BiDi RCV <-- {"type":"success","id":31,"result":{"navigation":"8be3d577-078f-49ee-8527-bd54ae120d64","url":"https://www.selenium.dev/"}}
23:15:37.674 ERROR Broker: Unhandled error occured while processing remote message: System.InvalidOperationException: An attempt was made to transition a task to a final state when it had already completed.
   at System.Threading.Tasks.TaskCompletionSource`1.SetException(Exception exception)
   at OpenQA.Selenium.BiDi.Broker.ProcessReceivedMessage(Byte[] data)
   at OpenQA.Selenium.BiDi.Broker.ReceiveMessagesAsync(CancellationToken cancellationToken)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-needs-triagingA Selenium member will evaluate this soon!C-dotnet.NET BindingsI-defectSomething is not working as intended

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions