Skip to content

[dotnet] Support UnhandledPromptBehavior option as string and map (breaking change) - #16557

Merged
RenderMichael merged 30 commits into
SeleniumHQ:trunkfrom
nvborisenko:dotnet-prompt-behavior-dict
Apr 25, 2026
Merged

RenderMichael merged 30 commits into
SeleniumHQ:trunkfrom
nvborisenko:dotnet-prompt-behavior-dict

Conversation

@nvborisenko

@nvborisenko nvborisenko commented Nov 6, 2025 •

Copy link
Copy Markdown
Member

User description

🔗 Related Issues

Fixes #16102

💥 What does this PR do?

This PR changes UnhandledPromptBehavior property return type to custom type, supporting both string and map representation at serialization phase.

// Same handler for every prompt
options.UnhandledPromptBehavior = UnhandledPromptBehavior.Accept;

// Per prompt type (only set what you need)
options.UnhandledPromptBehavior = new UserPromptHandler.PerPromptType
{
    Alert = UnhandledPromptBehavior.Accept,
    Confirm = UnhandledPromptBehavior.Dismiss,
    File = UnhandledPromptBehavior.Dismiss,    // BiDi only
    Default = UnhandledPromptBehavior.DismissAndNotify, // fallback
};

// Leave unset (driver picks spec default = "dismiss and notify")
options.UnhandledPromptBehavior = null;
options.UnhandledPromptBehavior = default;

🔧 Implementation Notes

It is not a breaking change at compilation level! One file change to emphasize that users are not affected.

💡 Additional Considerations

I intentionally didn't introduce new property in Options class, it would lead to a mess in my opinion.

🔄 Types of changes

  • New feature (non-breaking change for 99% users)
  • Breaking change, binary

PR Type

Enhancement


Description

  • Support UnhandledPromptBehavior as both string and dictionary representations

  • Introduce abstract record hierarchy for flexible prompt behavior configuration

  • Enable per-prompt-type behavior specification via UnhandledPromptBehaviorMultiOption

  • Maintain backward compatibility with existing enum-based API


Diagram Walkthrough

flowchart LR
  A["UnhandledPromptBehavior enum"] -->|implicit conversion| B["UnhandledPromptBehaviorOption"]
  B -->|Single| C["UnhandledPromptBehaviorSingleOption"]
  B -->|Multi| D["UnhandledPromptBehaviorMultiOption"]
  C -->|serializes to| E["string capability"]
  D -->|serializes to| F["dictionary capability"]
Loading

File Walkthrough

Relevant files
Enhancement
DriverOptions.cs
Add flexible prompt behavior option types with dual serialization

dotnet/src/webdriver/DriverOptions.cs

  • Introduced abstract record UnhandledPromptBehaviorOption with two
    sealed implementations: UnhandledPromptBehaviorSingleOption (for
    string representation) and UnhandledPromptBehaviorMultiOption (for
    dictionary representation with per-prompt-type settings)
  • Added implicit operator and factory methods (Single(), Multi()) for
    convenient instantiation
  • Changed UnhandledPromptBehavior property type from enum to nullable
    UnhandledPromptBehaviorOption
  • Refactored serialization logic in GenerateDesiredCapabilities() to
    handle both single and multi-option cases, converting to appropriate
    capability format
  • Updated merge conflict detection to use null checks instead of enum
    comparison
  • Extracted enum-to-string conversion into local helper function
    UnhandledPromptBehaviorToString()
+79/-18 

@selenium-ci selenium-ci added the C-dotnet .NET Bindings label Nov 6, 2025
@qodo-code-review

qodo-code-review Bot commented Nov 6, 2025 •

Copy link
Copy Markdown
Contributor

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
🟢
No security concerns identified No security vulnerabilities detected by AI analysis. Human verification advised for critical code.
Ticket Compliance
🟡
🎫 #16102
🟢 Allow setting unhandledPromptBehavior as a dictionary/map per spec for BiDi/Chrome 137+.
Preserve ability to set unhandledPromptBehavior as a single value (legacy enum) for
backward compatibility.
Ensure options serialization outputs correct wire values (strings or map) for
capabilities.
Avoid requiring users to use AdditionalOption workaround or internal DesiredCapabilities.
Behavior should work in .NET bindings (C#) without breaking compilation for existing
users.
⚪ Validate in real Chrome 137+ with BiDi that alerts behave per provided map
(runtime/browser check).
Codebase Duplication Compliance
⚪
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status: Passed

⚪
Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status:
No auditing: The new serialization logic for UnhandledPromptBehavior does not include any audit logging
of critical actions, but this may be out of scope for a client options class.

Referred Code
[return: NotNullIfNotNull(nameof(behavior))]
static string? UnhandledPromptBehaviorToString(UnhandledPromptBehavior? behavior) => behavior switch
{
    Selenium.UnhandledPromptBehavior.Ignore => "ignore",
    Selenium.UnhandledPromptBehavior.Accept => "accept",
    Selenium.UnhandledPromptBehavior.Dismiss => "dismiss",
    Selenium.UnhandledPromptBehavior.AcceptAndNotify => "accept and notify",
    Selenium.UnhandledPromptBehavior.DismissAndNotify => "dismiss and notify",
    _ => null
};

if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption)
{
    var stringValue = UnhandledPromptBehaviorToString(singleOption.Value);

    if (stringValue is not null)
    {
        capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
    }
}
else if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorMultiOption multiOption)


 ... (clipped 33 lines)
Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
Missing validation: Mapping functions accept nullable behaviors and silently skip invalid/unknown values
without error or logging, which could hide misconfigurations.

Referred Code
[return: NotNullIfNotNull(nameof(behavior))]
static string? UnhandledPromptBehaviorToString(UnhandledPromptBehavior? behavior) => behavior switch
{
    Selenium.UnhandledPromptBehavior.Ignore => "ignore",
    Selenium.UnhandledPromptBehavior.Accept => "accept",
    Selenium.UnhandledPromptBehavior.Dismiss => "dismiss",
    Selenium.UnhandledPromptBehavior.AcceptAndNotify => "accept and notify",
    Selenium.UnhandledPromptBehavior.DismissAndNotify => "dismiss and notify",
    _ => null
};

if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption)
{
    var stringValue = UnhandledPromptBehaviorToString(singleOption.Value);

    if (stringValue is not null)
    {
        capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
    }
}
else if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorMultiOption multiOption)


 ... (clipped 33 lines)
Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status:
Input validation: The new API accepts nullable option values and constructs a dictionary without explicit
validation of keys/values, potentially allowing unsupported configurations to pass
silently.

Referred Code
{
    Dictionary<string, string> multiOptionDictionary = [];

    if (multiOption.Alert is not null)
    {
        multiOptionDictionary["alert"] = UnhandledPromptBehaviorToString(multiOption.Alert);
    }

    if (multiOption.Confirm is not null)
    {
        multiOptionDictionary["confirm"] = UnhandledPromptBehaviorToString(multiOption.Confirm);
    }

    if (multiOption.Prompt is not null)
    {
        multiOptionDictionary["prompt"] = UnhandledPromptBehaviorToString(multiOption.Prompt);
    }

    if (multiOption.BeforeUnload is not null)
    {
        multiOptionDictionary["beforeUnload"] = UnhandledPromptBehaviorToString(multiOption.BeforeUnload);


 ... (clipped 12 lines)
  • Update
Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
@qodo-code-review

qodo-code-review Bot commented Nov 6, 2025 •

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
✅ The solution introduces a breaking change
Suggestion Impact:The commit adjusts the new UnhandledPromptBehaviorOption approach to be more backward-friendly by setting a default value (Default) and tightening handling to non-null enum values, reducing source-breaking risk for readers. It retains the Option type but mitigates the breaking change concerns, reflecting responsiveness to the suggestion.

code diff:

@@ -195,7 +126,7 @@
     /// Gets or sets the value for describing how unexpected alerts are to be handled in the browser.
     /// Defaults to .
     /// 
-    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; }
+    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; } = Selenium.UnhandledPromptBehavior.Default;
 
     /// 
     /// Gets or sets the value for describing how the browser is to wait for pages to load in the browser.
@@ -334,7 +265,7 @@
             return result;
         }
 
-        if (this.UnhandledPromptBehavior is not null && other.UnhandledPromptBehavior is not null)
+        if (this.UnhandledPromptBehavior != other.UnhandledPromptBehavior)
         {
             result.IsMergeConflict = true;
             result.MergeConflictOptionName = "UnhandledPromptBehavior";
@@ -539,51 +470,47 @@
             capabilities.SetCapability(CapabilityType.PageLoadStrategy, pageLoadStrategySetting);
         }
 
-        [return: NotNullIfNotNull(nameof(behavior))]
-        static string? UnhandledPromptBehaviorToString(UnhandledPromptBehavior? behavior) => behavior switch
+        static string UnhandledPromptBehaviorToString(UnhandledPromptBehavior behavior) => behavior switch
         {
             Selenium.UnhandledPromptBehavior.Ignore => "ignore",
             Selenium.UnhandledPromptBehavior.Accept => "accept",
             Selenium.UnhandledPromptBehavior.Dismiss => "dismiss",
             Selenium.UnhandledPromptBehavior.AcceptAndNotify => "accept and notify",
             Selenium.UnhandledPromptBehavior.DismissAndNotify => "dismiss and notify",
-            _ => null
+            _ => throw new ArgumentOutOfRangeException(nameof(behavior), $"UnhandledPromptBehavior value '{behavior}' is not recognized."),
         };
 
-        if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption)
+        if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption && singleOption.Value != Selenium.UnhandledPromptBehavior.Default)
         {
             var stringValue = UnhandledPromptBehaviorToString(singleOption.Value);
 
-            if (stringValue is not null)
-            {
-                capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
-            }
+            capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
         }
         else if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorMultiOption multiOption)
         {
             Dictionary multiOptionDictionary = [];
 
-            if (multiOption.Alert is not null)
+            if (multiOption.Alert is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["alert"] = UnhandledPromptBehaviorToString(multiOption.Alert);
             }
 
-            if (multiOption.Confirm is not null)
+            if (multiOption.Confirm is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["confirm"] = UnhandledPromptBehaviorToString(multiOption.Confirm);
             }
 
-            if (multiOption.Prompt is not null)
+            if (multiOption.Prompt is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["prompt"] = UnhandledPromptBehaviorToString(multiOption.Prompt);
             }
 
-            if (multiOption.BeforeUnload is not null)
+            if (multiOption.BeforeUnload is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["beforeUnload"] = UnhandledPromptBehaviorToString(multiOption.BeforeUnload);
             }
 
-            if (multiOption.Default is not null)
+            if (multiOption.Default is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["default"] = UnhandledPromptBehaviorToString(multiOption.Default);
             }

The suggestion highlights that changing the UnhandledPromptBehavior property's
type is a breaking change for users who read its value. It recommends adding a
new property for the dictionary-based functionality to ensure backward
compatibility.

Examples:

dotnet/src/webdriver/DriverOptions.cs [198]
    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; }

Solution Walkthrough:

Before:

// In DriverOptions.cs
public class DriverOptions
{
    public UnhandledPromptBehavior UnhandledPromptBehavior { get; set; } = UnhandledPromptBehavior.Default;
    // ...
}

// Example user code (compiles)
public void ConfigureDriver(DriverOptions options)
{
    // Reading the property is straightforward
    UnhandledPromptBehavior behavior = options.UnhandledPromptBehavior;
    if (behavior == UnhandledPromptBehavior.Ignore)
    {
        // ...
    }
}

After:

// In DriverOptions.cs
public class DriverOptions
{
    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; }
    // ...
}

// Example user code (breaks compilation)
public void ConfigureDriver(DriverOptions options)
{
    // This line no longer compiles due to type mismatch
    // UnhandledPromptBehavior behavior = options.UnhandledPromptBehavior;

    // User must now add type checking and casting
    if (options.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption single)
    {
        UnhandledPromptBehavior? behavior = single.Value;
        // ...
    }
}
Suggestion importance[1-10]: 9

__

Why: The suggestion correctly identifies a critical source-breaking change in the public API by altering the type of the UnhandledPromptBehavior property, which contradicts the PR's claim of being non-breaking.

High
Learned
best practice
✅ Validate mapped capability values
Suggestion Impact:The commit changed UnhandledPromptBehavior handling to be non-nullable with defaults and made the mapping function throw on unknown values, and it only adds entries when not Default. This achieves the validation intent, though it didn't introduce the exact TryAdd helper.

code diff:

-        [return: NotNullIfNotNull(nameof(behavior))]
-        static string? UnhandledPromptBehaviorToString(UnhandledPromptBehavior? behavior) => behavior switch
+        static string UnhandledPromptBehaviorToString(UnhandledPromptBehavior behavior) => behavior switch
         {
             Selenium.UnhandledPromptBehavior.Ignore => "ignore",
             Selenium.UnhandledPromptBehavior.Accept => "accept",
             Selenium.UnhandledPromptBehavior.Dismiss => "dismiss",
             Selenium.UnhandledPromptBehavior.AcceptAndNotify => "accept and notify",
             Selenium.UnhandledPromptBehavior.DismissAndNotify => "dismiss and notify",
-            _ => null
+            _ => throw new ArgumentOutOfRangeException(nameof(behavior), $"UnhandledPromptBehavior value '{behavior}' is not recognized."),
         };
 
-        if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption)
+        if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorSingleOption singleOption && singleOption.Value != Selenium.UnhandledPromptBehavior.Default)
         {
             var stringValue = UnhandledPromptBehaviorToString(singleOption.Value);
 
-            if (stringValue is not null)
-            {
-                capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
-            }
+            capabilities.SetCapability(CapabilityType.UnhandledPromptBehavior, stringValue);
         }
         else if (this.UnhandledPromptBehavior is UnhandledPromptBehaviorMultiOption multiOption)
         {
             Dictionary multiOptionDictionary = [];
 
-            if (multiOption.Alert is not null)
+            if (multiOption.Alert is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["alert"] = UnhandledPromptBehaviorToString(multiOption.Alert);
             }
 
-            if (multiOption.Confirm is not null)
+            if (multiOption.Confirm is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["confirm"] = UnhandledPromptBehaviorToString(multiOption.Confirm);
             }
 
-            if (multiOption.Prompt is not null)
+            if (multiOption.Prompt is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["prompt"] = UnhandledPromptBehaviorToString(multiOption.Prompt);
             }
 
-            if (multiOption.BeforeUnload is not null)
+            if (multiOption.BeforeUnload is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["beforeUnload"] = UnhandledPromptBehaviorToString(multiOption.BeforeUnload);
             }
 
-            if (multiOption.Default is not null)
+            if (multiOption.Default is not Selenium.UnhandledPromptBehavior.Default)
             {
                 multiOptionDictionary["default"] = UnhandledPromptBehaviorToString(multiOption.Default);
             }

Validate that mapped strings are non-null before adding to the dictionary to
prevent invalid capability values. Optionally throw a clear error for unknown
enum values.

dotnet/src/webdriver/DriverOptions.cs [566-589]

-if (multiOption.Alert is not null)
+void TryAdd(IDictionary dict, string key, UnhandledPromptBehavior? value)
 {
-    multiOptionDictionary["alert"] = UnhandledPromptBehaviorToString(multiOption.Alert);
+    var str = UnhandledPromptBehaviorToString(value);
+    if (str is null && value is not null)
+    {
+        throw new ArgumentOutOfRangeException(nameof(value), $"Unsupported UnhandledPromptBehavior value '{value}'.");
+    }
+    if (str is not null)
+    {
+        dict[key] = str;
+    }
 }
 
-if (multiOption.Confirm is not null)
-{
-    multiOptionDictionary["confirm"] = UnhandledPromptBehaviorToString(multiOption.Confirm);
-}
+TryAdd(multiOptionDictionary, "alert", multiOption.Alert);
+TryAdd(multiOptionDictionary, "confirm", multiOption.Confirm);
+TryAdd(multiOptionDictionary, "prompt", multiOption.Prompt);
+TryAdd(multiOptionDictionary, "beforeUnload", multiOption.BeforeUnload);
+TryAdd(multiOptionDictionary, "default", multiOption.Default);
 
-if (multiOption.Prompt is not null)
-{
-    multiOptionDictionary["prompt"] = UnhandledPromptBehaviorToString(multiOption.Prompt);
-}
-
-if (multiOption.BeforeUnload is not null)
-{
-    multiOptionDictionary["beforeUnload"] = UnhandledPromptBehaviorToString(multiOption.BeforeUnload);
-}
-
-if (multiOption.Default is not null)
-{
-    multiOptionDictionary["default"] = UnhandledPromptBehaviorToString(multiOption.Default);
-}
-

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why:
Relevant best practice - Guard external API-facing option mapping with validation to avoid null or invalid values leaking into capabilities.

Low
General
✅ Use init-only setters for record
Suggestion Impact:The UnhandledPromptBehaviorMultiOption record (and related option types) was removed entirely and the UnhandledPromptBehavior handling was refactored to use a different type (UserPromptHandler) with capability generation via ToCapabilities(), making the suggested init-setter change moot.

code diff:

-public abstract record UnhandledPromptBehaviorOption
-{
-    public static implicit operator UnhandledPromptBehaviorOption(UnhandledPromptBehavior? value)
-        => Single(value);
-
-    public static UnhandledPromptBehaviorOption Single(UnhandledPromptBehavior? value)
-        => new UnhandledPromptBehaviorSingleOption(value);
-
-    public static UnhandledPromptBehaviorOption Multi(UnhandledPromptBehavior? alert = null,
-        UnhandledPromptBehavior? confirm = null,
-        UnhandledPromptBehavior? prompt = null,
-        UnhandledPromptBehavior? beforeUnload = null,
-        UnhandledPromptBehavior? @default = null)
-        => new UnhandledPromptBehaviorMultiOption() with { Alert = alert, Confirm = confirm, Prompt = prompt, BeforeUnload = beforeUnload, Default = @default };
-}
-
-public sealed record UnhandledPromptBehaviorSingleOption(UnhandledPromptBehavior? Value) : UnhandledPromptBehaviorOption;
-
-public sealed record UnhandledPromptBehaviorMultiOption : UnhandledPromptBehaviorOption
-{
-    public UnhandledPromptBehavior? Alert { get; set; }
-
-    public UnhandledPromptBehavior? Confirm { get; set; }
-
-    public UnhandledPromptBehavior? Prompt { get; set; }
-
-    public UnhandledPromptBehavior? BeforeUnload { get; set; }
-
-    public UnhandledPromptBehavior? Default { get; set; }
-}
-

Replace the set accessors with init accessors in the
UnhandledPromptBehaviorMultiOption record to make its properties immutable after
initialization.

dotnet/src/webdriver/DriverOptions.cs [47-58]

 public sealed record UnhandledPromptBehaviorMultiOption : UnhandledPromptBehaviorOption
 {
-    public UnhandledPromptBehavior? Alert { get; set; }
+    public UnhandledPromptBehavior? Alert { get; init; }
 
-    public UnhandledPromptBehavior? Confirm { get; set; }
+    public UnhandledPromptBehavior? Confirm { get; init; }
 
-    public UnhandledPromptBehavior? Prompt { get; set; }
+    public UnhandledPromptBehavior? Prompt { get; init; }
 
-    public UnhandledPromptBehavior? BeforeUnload { get; set; }
+    public UnhandledPromptBehavior? BeforeUnload { get; init; }
 
-    public UnhandledPromptBehavior? Default { get; set; }
+    public UnhandledPromptBehavior? Default { get; init; }
 }

[Suggestion processed]

Suggestion importance[1-10]: 5

__

Why: The suggestion correctly points out that using init setters for a record's properties enhances immutability, which is idiomatic for records and improves code quality and maintainability.

Low
  • Update

Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated

@RenderMichael RenderMichael left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A breaking change like this should be well-tested. Could we add tests here?

@nvborisenko

Copy link
Copy Markdown
Member Author

A breaking change like this should be well-tested. Could we add tests here?

I have no capacity to test the functionality which was not indented to be tested. You can "request changes", please propose.

@RenderMichael

Copy link
Copy Markdown
Contributor

A breaking change like this should be well-tested. Could we add tests here?

I have no capacity to test the functionality which was not indented to be tested. You can "request changes", please propose.

I propose new tests for this functionality.

@nvborisenko

Copy link
Copy Markdown
Member Author

Existing tests don't satisfy you? You ask me to increase the coverage. But what is coverage?

@nvborisenko

nvborisenko commented Nov 6, 2025 •

Copy link
Copy Markdown
Member Author

@RenderMichael welcome to #15536

UPD: is it only one concern from your side?

@YevgeniyShunevych

Copy link
Copy Markdown
Contributor

Generally, looks good, @nvborisenko. What I don't like is a nullability of properties and parameters (UnhandledPromptBehaviorOption?, UnhandledPromptBehavior?). If I understand correctly, for UnhandledPromptBehavior? null and Default values are equivalent. So 2 states basically indicate the same state. So why not to make it non-nullable and use Default as a default. I would also rename UnhandledPromptBehavior.Default to None, as it is not clear what "Default" means, but "None" means no behavior is specified.

Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
Comment thread dotnet/src/webdriver/DriverOptions.cs Outdated
PhilipWoulfe pushed a commit to PhilipWoulfe/F1Competition that referenced this pull request May 19, 2026
Updated
[Microsoft.AspNetCore.Components.Authorization](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

Release notes _Sourced from [Microsoft.AspNetCore.Components.Authorization's releases](https://github.com/dotnet/aspnetcore/releases)._ ## 8.0.27 [Release](https://github.com/dotnet/core/releases/tag/v8.0.27) ## What's Changed * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/aspnetcore#66205 * [release/8.0] Update NPM dependencies by @​wtgodbe in dotnet/aspnetcore#66052 * [release/8.0] Move off of dead-lettered Windows preview helix queue by @​wtgodbe in dotnet/aspnetcore#66220 * [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to `d72f9c8` by @​dependabot[bot] in dotnet/aspnetcore#66087 * [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF service connection in mirror-within-azdo by @​missymessa in dotnet/aspnetcore#66115 * [release/8.0] Update dependencies from dotnet/source-build-externals by @​dotnet-maestro[bot] in dotnet/aspnetcore#66216 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/aspnetcore#66081 * [release/8.0] Update dependencies from dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in dotnet/aspnetcore#66131 * [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe in dotnet/aspnetcore#66236 * [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in dotnet/aspnetcore#66276 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/aspnetcore#66317 **Full Changelog**: dotnet/aspnetcore@v8.0.26...v8.0.27 Commits viewable in [compare view](dotnet/aspnetcore@v8.0.26...v8.0.27).
Updated [Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore) from 8.0.26 to 8.0.27.
Release notes _Sourced from [Microsoft.AspNetCore.Components.WebAssembly's releases](https://github.com/dotnet/aspnetcore/releases)._ ## 8.0.27 [Release](https://github.com/dotnet/core/releases/tag/v8.0.27) ## What's Changed * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/aspnetcore#66205 * [release/8.0] Update NPM dependencies by @​wtgodbe in dotnet/aspnetcore#66052 * [release/8.0] Move off of dead-lettered Windows preview helix queue by @​wtgodbe in dotnet/aspnetcore#66220 * [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to `d72f9c8` by @​dependabot[bot] in dotnet/aspnetcore#66087 * [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF service connection in mirror-within-azdo by @​missymessa in dotnet/aspnetcore#66115 * [release/8.0] Update dependencies from dotnet/source-build-externals by @​dotnet-maestro[bot] in dotnet/aspnetcore#66216 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/aspnetcore#66081 * [release/8.0] Update dependencies from dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in dotnet/aspnetcore#66131 * [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe in dotnet/aspnetcore#66236 * [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in dotnet/aspnetcore#66276 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/aspnetcore#66317 **Full Changelog**: dotnet/aspnetcore@v8.0.26...v8.0.27 Commits viewable in [compare view](dotnet/aspnetcore@v8.0.26...v8.0.27).
Updated [Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.AspNetCore.Components.WebAssembly.DevServer's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.AspNetCore.Http.Abstractions](https://github.com/dotnet/aspnetcore) from 2.3.9 to 2.3.10.
Release notes _Sourced from [Microsoft.AspNetCore.Http.Abstractions's releases](https://github.com/dotnet/aspnetcore/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/aspnetcore/commits).
Updated [Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore) from 8.0.26 to 8.0.27.
Release notes _Sourced from [Microsoft.AspNetCore.Mvc.Testing's releases](https://github.com/dotnet/aspnetcore/releases)._ ## 8.0.27 [Release](https://github.com/dotnet/core/releases/tag/v8.0.27) ## What's Changed * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/aspnetcore#66205 * [release/8.0] Update NPM dependencies by @​wtgodbe in dotnet/aspnetcore#66052 * [release/8.0] Move off of dead-lettered Windows preview helix queue by @​wtgodbe in dotnet/aspnetcore#66220 * [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to `d72f9c8` by @​dependabot[bot] in dotnet/aspnetcore#66087 * [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF service connection in mirror-within-azdo by @​missymessa in dotnet/aspnetcore#66115 * [release/8.0] Update dependencies from dotnet/source-build-externals by @​dotnet-maestro[bot] in dotnet/aspnetcore#66216 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/aspnetcore#66081 * [release/8.0] Update dependencies from dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in dotnet/aspnetcore#66131 * [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe in dotnet/aspnetcore#66236 * [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in dotnet/aspnetcore#66276 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/aspnetcore#66317 **Full Changelog**: dotnet/aspnetcore@v8.0.26...v8.0.27 Commits viewable in [compare view](dotnet/aspnetcore@v8.0.26...v8.0.27).
Updated [Microsoft.AspNetCore.OpenApi](https://github.com/dotnet/aspnetcore) from 8.0.26 to 8.0.27.
Release notes _Sourced from [Microsoft.AspNetCore.OpenApi's releases](https://github.com/dotnet/aspnetcore/releases)._ ## 8.0.27 [Release](https://github.com/dotnet/core/releases/tag/v8.0.27) ## What's Changed * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/aspnetcore#66205 * [release/8.0] Update NPM dependencies by @​wtgodbe in dotnet/aspnetcore#66052 * [release/8.0] Move off of dead-lettered Windows preview helix queue by @​wtgodbe in dotnet/aspnetcore#66220 * [release/8.0] (deps): Bump src/submodules/googletest from `73a63ea` to `d72f9c8` by @​dependabot[bot] in dotnet/aspnetcore#66087 * [release/8.0] Replace dn-bot-dnceng-build-rw-code-rw PAT with WIF service connection in mirror-within-azdo by @​missymessa in dotnet/aspnetcore#66115 * [release/8.0] Update dependencies from dotnet/source-build-externals by @​dotnet-maestro[bot] in dotnet/aspnetcore#66216 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/aspnetcore#66081 * [release/8.0] Update dependencies from dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in dotnet/aspnetcore#66131 * [release/8.0] Update @​azure/msal-browser from 2.x to 4.x by @​wtgodbe in dotnet/aspnetcore#66236 * [release/8.0] Use source-build-assets repo by @​NikolaMilosavljevic in dotnet/aspnetcore#66276 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/aspnetcore#66317 **Full Changelog**: dotnet/aspnetcore@v8.0.26...v8.0.27 Commits viewable in [compare view](dotnet/aspnetcore@v8.0.26...v8.0.27).
Updated [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) from 9.0.15 to 9.0.16.
Release notes _Sourced from [Microsoft.EntityFrameworkCore's releases](https://github.com/dotnet/efcore/releases)._ ## 9.0.16 [Release](https://github.com/dotnet/core/releases/tag/v9.0.16) ## What's Changed * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#37900 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#37969 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38034 * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/efcore#38062 * [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in dotnet/efcore#38063 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38053 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#37908 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#38099 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#38101 * Merging internal commits for release/9.0 by @​vseanreesermsft in dotnet/efcore#38098 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38170 **Full Changelog**: dotnet/efcore@v9.0.15...v9.0.16 Commits viewable in [compare view](dotnet/efcore@v9.0.15...v9.0.16).
Updated [Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore) from 9.0.15 to 9.0.16.
Release notes _Sourced from [Microsoft.EntityFrameworkCore.Design's releases](https://github.com/dotnet/efcore/releases)._ ## 9.0.16 [Release](https://github.com/dotnet/core/releases/tag/v9.0.16) ## What's Changed * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#37900 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#37969 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38034 * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/efcore#38062 * [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in dotnet/efcore#38063 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38053 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#37908 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#38099 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#38101 * Merging internal commits for release/9.0 by @​vseanreesermsft in dotnet/efcore#38098 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38170 **Full Changelog**: dotnet/efcore@v9.0.15...v9.0.16 Commits viewable in [compare view](dotnet/efcore@v9.0.15...v9.0.16).
Updated [Microsoft.EntityFrameworkCore.InMemory](https://github.com/dotnet/efcore) from 9.0.15 to 9.0.16.
Release notes _Sourced from [Microsoft.EntityFrameworkCore.InMemory's releases](https://github.com/dotnet/efcore/releases)._ ## 9.0.16 [Release](https://github.com/dotnet/core/releases/tag/v9.0.16) ## What's Changed * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#37900 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#37969 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38034 * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/efcore#38062 * [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in dotnet/efcore#38063 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38053 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#37908 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#38099 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#38101 * Merging internal commits for release/9.0 by @​vseanreesermsft in dotnet/efcore#38098 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38170 **Full Changelog**: dotnet/efcore@v9.0.15...v9.0.16 Commits viewable in [compare view](dotnet/efcore@v9.0.15...v9.0.16).
Updated [Microsoft.EntityFrameworkCore.Relational](https://github.com/dotnet/efcore) from 9.0.15 to 9.0.16.
Release notes _Sourced from [Microsoft.EntityFrameworkCore.Relational's releases](https://github.com/dotnet/efcore/releases)._ ## 9.0.16 [Release](https://github.com/dotnet/core/releases/tag/v9.0.16) ## What's Changed * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#37900 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#37969 * [release/8.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38034 * [release/8.0] Update branding to 8.0.27 by @​vseanreesermsft in dotnet/efcore#38062 * [release/9.0] Update branding to 9.0.16 by @​vseanreesermsft in dotnet/efcore#38063 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38053 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#37908 * Merging internal commits for release/8.0 by @​vseanreesermsft in dotnet/efcore#38099 * [automated] Merge branch 'release/8.0' => 'release/9.0' by @​github-actions[bot] in dotnet/efcore#38101 * Merging internal commits for release/9.0 by @​vseanreesermsft in dotnet/efcore#38098 * [release/9.0] Update dependencies from dotnet/arcade by @​dotnet-maestro[bot] in dotnet/efcore#38170 **Full Changelog**: dotnet/efcore@v9.0.15...v9.0.16 Commits viewable in [compare view](dotnet/efcore@v9.0.15...v9.0.16).
Updated [Microsoft.Extensions.Caching.Abstractions](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Caching.Abstractions's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.Extensions.Configuration](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Configuration's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.Extensions.Configuration.Binder](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Configuration.Binder's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.Extensions.Hosting](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Hosting's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.Extensions.Http](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Http's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Microsoft.Extensions.Options.DataAnnotations](https://github.com/dotnet/dotnet) from 10.0.7 to 10.0.8.
Release notes _Sourced from [Microsoft.Extensions.Options.DataAnnotations's releases](https://github.com/dotnet/dotnet/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/dotnet/dotnet/commits).
Updated [Selenium.Support](https://github.com/SeleniumHQ/selenium) from 4.43.0 to 4.44.0.
Release notes _Sourced from [Selenium.Support's releases](https://github.com/SeleniumHQ/selenium/releases)._ ## 4.44.0 ## Detailed Changelogs by Component https://www.selenium.dev/images/programming/java.svg" width="20" height="20"> **[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**     |    https://www.selenium.dev/images/programming/python.svg" width="20" height="20"> **[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**     |    https://www.selenium.dev/images/programming/dotnet.svg" width="20" height="20"> **[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**     |    https://www.selenium.dev/images/programming/ruby.svg" width="20" height="20"> **[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**     |    https://www.selenium.dev/images/programming/javascript.svg" width="20" height="20"> **[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/selenium-webdriver/CHANGES.md)**
## What's Changed
Click to see all the changes included in this release * fix(documentation): update artifact naming for generated docs by @​diemol in SeleniumHQ/selenium#17332 * fix(ruby): retrieve devtools version dynamically for package verification by @​diemol in SeleniumHQ/selenium#17335 * [dotnet] Don't truncate internal log messages at error/warn levels by @​nvborisenko in SeleniumHQ/selenium#17333 * [dotnet] Safe modifications of internal log handlers by @​nvborisenko in SeleniumHQ/selenium#17334 * [dotnet] Remove planned obsoleted members for 4.44 by @​nvborisenko in SeleniumHQ/selenium#17328 * [dotnet] [bidi] Statically declare commands by @​nvborisenko in SeleniumHQ/selenium#17330 * [dotnet] [bidi] Statically declared events by @​nvborisenko in SeleniumHQ/selenium#17331 * [dotnet] Add C# 14 extension to polyfill `ArgumentNullException.ThrowIfNull` by @​RenderMichael in SeleniumHQ/selenium#16697 * [dotnet] [bidi] Align SetDownloadBehavior command by @​nvborisenko in SeleniumHQ/selenium#17336 * [dotnet] [bidi] Align ContinueWithAuth command by @​nvborisenko in SeleniumHQ/selenium#17337 * [dotnet] [bidi] Align SetGeolocation polymorphic command by @​nvborisenko in SeleniumHQ/selenium#17338 * [dotnet] [test] In-process test webserver by @​nvborisenko in SeleniumHQ/selenium#17339 * [java] deprecate the 'native' methods inside the HttpClient interface by @​joerg1985 in SeleniumHQ/selenium#17340 * CDDL 2 Python generator by @​AutomatedTester in SeleniumHQ/selenium#16914 * Fix py:local_dev rake task by @​cgoldberg in SeleniumHQ/selenium#17342 * [grid] Accept legacy session-closed event payloads by @​VietND96 in SeleniumHQ/selenium#17343 * [java] specify nullability in package `org.openqa.selenium.remote` by @​asolntsev in SeleniumHQ/selenium#17325 * fix NPE when response status is null by @​asolntsev in SeleniumHQ/selenium#17348 * [java] fix NoSuchElementException for custom By locators by @​Chandan25sharma in SeleniumHQ/selenium#17287 * [py] Update docs with pytest example and minor formatting fixes by @​cgoldberg in SeleniumHQ/selenium#17351 * [dotnet] Fix stopping of network monitoring via DevTools by @​nvborisenko in SeleniumHQ/selenium#17352 * [dotnet] [test] Update tests to target .NET 10 by @​nvborisenko in SeleniumHQ/selenium#17353 * [build] Clean extra tools from GHA runner to free disk space by @​cgoldberg in SeleniumHQ/selenium#17360 * Initial Creation of the Selenium CLI Tool by @​AutomatedTester in SeleniumHQ/selenium#17327 * [java] fix some nullability warnings by @​asolntsev in SeleniumHQ/selenium#17362 * [py] Use generated Bidi files instead of hand curated ones by @​AutomatedTester in SeleniumHQ/selenium#17266 * [docs] Add AI-assisted contribution policy by @​titusfortner in SeleniumHQ/selenium#17043 * [Agents] Update agents to make sure do linting. by @​AutomatedTester in SeleniumHQ/selenium#17366 * [py] Bump dependencies by @​cgoldberg in SeleniumHQ/selenium#17368 * [git] update gitignore to exclude mempalace by @​AutomatedTester in SeleniumHQ/selenium#17369 * [java] remove field `ChromiumDriver.capabilities` by @​asolntsev in SeleniumHQ/selenium#17363 * [spec] Use http_file for the cddl files by @​AutomatedTester in SeleniumHQ/selenium#17372 * [dotnet] [bidi] Obsolete Type(string) method in Input module by @​nvborisenko in SeleniumHQ/selenium#17377 * Fix Network failures by @​AutomatedTester in SeleniumHQ/selenium#17381 * [java] [test] Unignore bidi network conditions tests for Firefox by @​nvborisenko in SeleniumHQ/selenium#17385 * [dotnet] [test] Unignore network conditions tests for Firefox by @​nvborisenko in SeleniumHQ/selenium#17386 * [dotnet] [test] Migrate to MTP by @​nvborisenko in SeleniumHQ/selenium#17384 * [dotnet] Support `UnhandledPromptBehavior` option as string and map (breaking change) by @​nvborisenko in SeleniumHQ/selenium#16557 ... (truncated) Commits viewable in [compare view](SeleniumHQ/selenium@selenium-4.43.0...selenium-4.44.0).
Updated [Selenium.WebDriver](https://github.com/SeleniumHQ/selenium) from 4.43.0 to 4.44.0.
Release notes _Sourced from [Selenium.WebDriver's releases](https://github.com/SeleniumHQ/selenium/releases)._ ## 4.44.0 ## Detailed Changelogs by Component https://www.selenium.dev/images/programming/java.svg" width="20" height="20"> **[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**     |    https://www.selenium.dev/images/programming/python.svg" width="20" height="20"> **[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**     |    https://www.selenium.dev/images/programming/dotnet.svg" width="20" height="20"> **[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**     |    https://www.selenium.dev/images/programming/ruby.svg" width="20" height="20"> **[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**     |    https://www.selenium.dev/images/programming/javascript.svg" width="20" height="20"> **[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/selenium-webdriver/CHANGES.md)**
## What's Changed
Click to see all the changes included in this release * fix(documentation): update artifact naming for generated docs by @​diemol in SeleniumHQ/selenium#17332 * fix(ruby): retrieve devtools version dynamically for package verification by @​diemol in SeleniumHQ/selenium#17335 * [dotnet] Don't truncate internal log messages at error/warn levels by @​nvborisenko in SeleniumHQ/selenium#17333 * [dotnet] Safe modifications of internal log handlers by @​nvborisenko in SeleniumHQ/selenium#17334 * [dotnet] Remove planned obsoleted members for 4.44 by @​nvborisenko in SeleniumHQ/selenium#17328 * [dotnet] [bidi] Statically declare commands by @​nvborisenko in SeleniumHQ/selenium#17330 * [dotnet] [bidi] Statically declared events by @​nvborisenko in SeleniumHQ/selenium#17331 * [dotnet] Add C# 14 extension to polyfill `ArgumentNullException.ThrowIfNull` by @​RenderMichael in SeleniumHQ/selenium#16697 * [dotnet] [bidi] Align SetDownloadBehavior command by @​nvborisenko in SeleniumHQ/selenium#17336 * [dotnet] [bidi] Align ContinueWithAuth command by @​nvborisenko in SeleniumHQ/selenium#17337 * [dotnet] [bidi] Align SetGeolocation polymorphic command by @​nvborisenko in SeleniumHQ/selenium#17338 * [dotnet] [test] In-process test webserver by @​nvborisenko in SeleniumHQ/selenium#17339 * [java] deprecate the 'native' methods inside the HttpClient interface by @​joerg1985 in SeleniumHQ/selenium#17340 * CDDL 2 Python generator by @​AutomatedTester in SeleniumHQ/selenium#16914 * Fix py:local_dev rake task by @​cgoldberg in SeleniumHQ/selenium#17342 * [grid] Accept legacy session-closed event payloads by @​VietND96 in SeleniumHQ/selenium#17343 * [java] specify nullability in package `org.openqa.selenium.remote` by @​asolntsev in SeleniumHQ/selenium#17325 * fix NPE when response status is null by @​asolntsev in SeleniumHQ/selenium#17348 * [java] fix NoSuchElementException for custom By locators by @​Chandan25sharma in SeleniumHQ/selenium#17287 * [py] Update docs with pytest example and minor formatting fixes by @​cgoldberg in SeleniumHQ/selenium#17351 * [dotnet] Fix stopping of network monitoring via DevTools by @​nvborisenko in SeleniumHQ/selenium#17352 * [dotnet] [test] Update tests to target .NET 10 by @​nvborisenko in SeleniumHQ/selenium#17353 * [build] Clean extra tools from GHA runner to free disk space by @​cgoldberg in SeleniumHQ/selenium#17360 * Initial Creation of the Selenium CLI Tool by @​AutomatedTester in SeleniumHQ/selenium#17327 * [java] fix some nullability warnings by @​asolntsev in SeleniumHQ/selenium#17362 * [py] Use generated Bidi files instead of hand curated ones by @​AutomatedTester in SeleniumHQ/selenium#17266 * [docs] Add AI-assisted contribution policy by @​titusfortner in SeleniumHQ/selenium#17043 * [Agents] Update agents to make sure do linting. by @​AutomatedTester in SeleniumHQ/selenium#17366 * [py] Bump dependencies by @​cgoldberg in SeleniumHQ/selenium#17368 * [git] update gitignore to exclude mempalace by @​AutomatedTester in SeleniumHQ/selenium#17369 * [java] remove field `ChromiumDriver.capabilities` by @​asolntsev in SeleniumHQ/selenium#17363 * [spec] Use http_file for the cddl files by @​AutomatedTester in SeleniumHQ/selenium#17372 * [dotnet] [bidi] Obsolete Type(string) method in Input module by @​nvborisenko in SeleniumHQ/selenium#17377 * Fix Network failures by @​AutomatedTester in SeleniumHQ/selenium#17381 * [java] [test] Unignore bidi network conditions tests for Firefox by @​nvborisenko in SeleniumHQ/selenium#17385 * [dotnet] [test] Unignore network conditions tests for Firefox by @​nvborisenko in SeleniumHQ/selenium#17386 * [dotnet] [test] Migrate to MTP by @​nvborisenko in SeleniumHQ/selenium#17384 * [dotnet] Support `UnhandledPromptBehavior` option as string and map (breaking change) by @​nvborisenko in SeleniumHQ/selenium#16557 ... (truncated) Commits viewable in [compare view](SeleniumHQ/selenium@selenium-4.43.0...selenium-4.44.0).
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[🐛 Bug]: [dotnet] Unable to set dictionary to the UnhandledPromptBehavior option

6 participants