Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[🐛 Bug]: [dotnet]: RemoteSessionSettings should allow JsonNode metadata settings #14725

Closed
RenderMichael opened this issue Nov 7, 2024 · 4 comments · Fixed by #14726
Closed
Labels
A-needs-triaging A Selenium member will evaluate this soon! C-dotnet .NET Bindings I-defect Something is not working as intended

Comments

@RenderMichael
Copy link
Contributor

What happened?

Selenium should accept System.Text.Json types, since that's what is used internally to serialize the request.

(It would also be nice to add explicit overloads to RemoteSessionSettings.AddMetadataSetting so it's clear what types are accepted and what types aren't.)

How can we reproduce the issue?

using OpenQA.Selenium;
using System.Text.Json.Nodes;

var remoteSessionSettings = new RemoteSessionSettings();
remoteSessionSettings.AddMetadataSetting("example", JsonNode.Parse("true"));

Relevant log output

System.ArgumentException: 'Metadata setting value must be JSON serializable. (Parameter 'settingValue')'

Operating System

Windows 11

Selenium version

.NET Selenium.WebDriver 4.26.1

What are the browser(s) and version(s) where you see this issue?

N/A (didn't get that far)

What are the browser driver(s) and version(s) where you see this issue?

N/A

Are you using Selenium Grid?

No

@RenderMichael RenderMichael added I-defect Something is not working as intended A-needs-triaging A Selenium member will evaluate this soon! labels Nov 7, 2024
Copy link

github-actions bot commented Nov 7, 2024

@RenderMichael, thank you for creating this issue. We will troubleshoot it as soon as we can.


Info for maintainers

Triage this issue by using labels.

If information is missing, add a helpful comment and then I-issue-template label.

If the issue is a question, add the I-question label.

If the issue is valid but there is no time to troubleshoot it, consider adding the help wanted label.

If the issue requires changes or fixes from an external project (e.g., ChromeDriver, GeckoDriver, MSEdgeDriver, W3C), add the applicable G-* label, and it will provide the correct link and auto-close the issue.

After troubleshooting the issue, please add the R-awaiting answer label.

Thank you!

@nvborisenko
Copy link
Member

Oh no! Many years ago (20 years?), I didn't know what was happing in the world of json serialization (I was yang, and didn't know about selenium). Today, we are on the road to be AOT compatible, and you are bringing great value in this area. To be AOT compatible we should refactor existing json serialization, which is object based, to be ... just AOT compatible. To archive this goal we started from the easiest way: just add all well-known (read it as very popular) types to the serialization context. You know that adding absolutely all types into serialization context is "way to hell". If user has issue, then we will:

  • or add known type into context
  • or ask user to use any another available known primitive type (like in this particular case it would be bool)

We cannot add more and more infinitely. The next big step will be making commands/responses strongly typed.

@RenderMichael
Copy link
Contributor Author

I understand the potential trap of trying to add each and every type to the serialization context. Refactoring away from the object-based approach is a good approach.

In my opinion, this is a special case, because there is an internal method IsJsonSerializable that checks all the types for "serializability" (which doesn't make sense to me, models should be accepted) and the operation throws an exception.

The problem happens with the migration from Newtonsoft to System.Text.Json. The following will have strange results:

var jToken = JToken.Parse("\"abc\"");
var jsonNode = JsonNode.Parse("\"abc\"");

var remoteSessionSettings = new RemoteSessionSettings();
remoteSessionSettings.AddMetadataSetting("example", jToken); // works
remoteSessionSettings.AddMetadataSetting("example", jsonNode); // throws

This is because Newtonsoft is very loose with type restrictions, and will do its best to make things work, especially when the token is typed as object. In contrast, STJ is very "by the rules" and strongly encourages strongly-typed coding (in general this is a good approach, as we see with the AOT migration).

Copy link

This issue has been automatically locked since there has not been any recent activity since it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked and limited conversation to collaborators Dec 10, 2024
@RenderMichael RenderMichael added the C-dotnet .NET Bindings label Feb 25, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
A-needs-triaging A Selenium member will evaluate this soon! C-dotnet .NET Bindings I-defect Something is not working as intended
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants