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

[dotnet] Support UnhandledPromptBehavior option as string and map (breaking change)#16557
RenderMichael merged 30 commits into
SeleniumHQ:trunkfrom
nvborisenko:dotnet-prompt-behavior-dict

Conversation

@nvborisenko
Copy link
Copy Markdown
Member

@nvborisenko nvborisenko commented Nov 6, 2025

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
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented Nov 6, 2025

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
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented Nov 6, 2025

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 <see cref="UnhandledPromptBehavior.Default"/>.
     /// </summary>
-    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; }
+    public UnhandledPromptBehaviorOption? UnhandledPromptBehavior { get; set; } = Selenium.UnhandledPromptBehavior.Default;
 
     /// <summary>
     /// 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<string, string> 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<string, string> 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<string, string> 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
Copy link
Copy Markdown
Contributor

@RenderMichael RenderMichael left a comment

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
Copy link
Copy Markdown
Member Author

nvborisenko commented Nov 6, 2025

@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
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a new .NET representation for the W3C unhandledPromptBehavior capability so it can serialize either as a single string value or as a per-prompt-type dictionary, addressing BiDi/Chrome 137+ requirements.

Changes:

  • Introduces OpenQA.Selenium.UserPromptHandler (with Uniform and PerPromptType) and moves/updates UnhandledPromptBehavior enum (with Default marked obsolete).
  • Updates DriverOptions.UnhandledPromptBehavior to use the new handler type and serializes via ToCapabilities().
  • Updates alert-related tests to cover null and per-type handler usage; minor whitespace cleanup.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

File Description
dotnet/src/webdriver/DriverOptions.cs Switches UnhandledPromptBehavior to the new handler type and updates capability serialization + merge-conflict logic.
dotnet/src/webdriver/UserPromptHandler.cs Adds the new handler model and serialization (string vs map) for unhandledPromptBehavior.
dotnet/test/webdriver/UnexpectedAlertBehaviorTests.cs Updates tests to use null and per-type handler variants.
dotnet/test/webdriver/AlertsTests.cs Removes trailing whitespace at EOF.
Comments suppressed due to low confidence (1)

dotnet/src/webdriver/DriverOptions.cs:267

  • GetMergeResult currently flags a merge conflict whenever the two UnhandledPromptBehavior values are not equal. This is stricter than the previous behavior and will incorrectly reject scenarios where only one options object sets the capability (e.g., must-match leaves it unset/null and first-match sets it). It will also treat null and new UserPromptHandler.Uniform(UnhandledPromptBehavior.Default) as conflicting even though both serialize to “unset”. Consider only reporting a conflict when both sides specify a non-null capability value (ideally based on the serialized capability via ToCapabilities()).
        if (this.UnhandledPromptBehavior != other.UnhandledPromptBehavior)
        {
            result.IsMergeConflict = true;
            result.MergeConflictOptionName = "UnhandledPromptBehavior";
            return result;

Comment thread dotnet/test/webdriver/UnexpectedAlertBehaviorTests.cs
Comment thread dotnet/test/webdriver/UnexpectedAlertBehaviorTests.cs
Comment thread dotnet/src/webdriver/UserPromptHandler.cs
Comment thread dotnet/src/webdriver/UserPromptHandler.cs
@RenderMichael RenderMichael merged commit 9dca613 into SeleniumHQ:trunk Apr 25, 2026
22 of 23 checks passed
@nvborisenko nvborisenko deleted the dotnet-prompt-behavior-dict branch April 25, 2026 08:35
This was referenced May 13, 2026
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.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.AspNetCore.Http.Abstractions](https://github.com/dotnet/aspnetcore)
from 2.3.9 to 2.3.10.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.AspNetCore.OpenApi](https://github.com/dotnet/aspnetcore)
from 8.0.26 to 8.0.27.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) from
9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.EntityFrameworkCore.InMemory](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.EntityFrameworkCore.Relational](https://github.com/dotnet/efcore)
from 9.0.15 to 9.0.16.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.Extensions.Caching.Abstractions](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.Extensions.Configuration](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.Extensions.Configuration.Binder](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated [Microsoft.Extensions.Hosting](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated [Microsoft.Extensions.Http](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated
[Microsoft.Extensions.Options.DataAnnotations](https://github.com/dotnet/dotnet)
from 10.0.7 to 10.0.8.

<details>
<summary>Release notes</summary>

_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).
</details>

Updated [Selenium.Support](https://github.com/SeleniumHQ/selenium) from
4.43.0 to 4.44.0.

<details>
<summary>Release notes</summary>

_Sourced from [Selenium.Support's
releases](https://github.com/SeleniumHQ/selenium/releases)._

## 4.44.0

## Detailed Changelogs by Component

<img src="https://www.selenium.dev/images/programming/java.svg"
width="20" height="20">
**[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/python.svg" width="20"
height="20">
**[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/dotnet.svg" width="20"
height="20">
**[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/ruby.svg" width="20"
height="20">
**[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="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)**
<br>


<!-- Release notes generated using configuration in .github/release.yml
at da2039bd1456a161d0c284de16f9f4f179f1e8ca -->

## What's Changed
<details>
<summary>Click to see all the changes included in this release</summary>

* 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).
</details>

Updated [Selenium.WebDriver](https://github.com/SeleniumHQ/selenium)
from 4.43.0 to 4.44.0.

<details>
<summary>Release notes</summary>

_Sourced from [Selenium.WebDriver's
releases](https://github.com/SeleniumHQ/selenium/releases)._

## 4.44.0

## Detailed Changelogs by Component

<img src="https://www.selenium.dev/images/programming/java.svg"
width="20" height="20">
**[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/python.svg" width="20"
height="20">
**[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/dotnet.svg" width="20"
height="20">
**[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="https://www.selenium.dev/images/programming/ruby.svg" width="20"
height="20">
**[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**
&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;<img
src="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)**
<br>


<!-- Release notes generated using configuration in .github/release.yml
at da2039bd1456a161d0c284de16f9f4f179f1e8ca -->

## What's Changed
<details>
<summary>Click to see all the changes included in this release</summary>

* 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).
</details>

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)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

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 <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> 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 <dependency name> 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 <dependency name>` 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 <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
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