Skip to content

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

Description

@RenderMichael

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

Activity

  1. added
    I-defectSomething is not working as intended
    A-needs-triagingA Selenium member will evaluate this soon!
    on Nov 7, 2024
  2. github-actions commented on Nov 7, 2024

    @github-actions
    Contributor

    @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!

  3. added a commit that references this issue on Nov 7, 2024
    e260b5b
  4. nvborisenko commented on Nov 7, 2024

    @nvborisenko
    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.

  5. RenderMichael commented on Nov 8, 2024

    @RenderMichael
    ContributorAuthor

    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).

  6. github-actions commented on Dec 10, 2024

    @github-actions
    Contributor

    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.

  7. locked and limited conversation to collaborators on Dec 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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