Skip to content

Commit b29c80f

Browse files
committed
[dotnet] [bidi] Do not throw when CallFunction or Evaluate return exceptional results
1 parent 8f09638 commit b29c80f

File tree

10 files changed

+189
-196
lines changed

10 files changed

+189
-196
lines changed

dotnet/src/webdriver/BiDi/Modules/BrowsingContext/BrowsingContextScriptModule.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public async Task<IReadOnlyList<RealmInfo>> GetRealmsAsync(GetRealmsOptions? opt
4444
return await scriptModule.GetRealmsAsync(options).ConfigureAwait(false);
4545
}
4646

47-
public Task<EvaluateResultSuccess> EvaluateAsync(string expression, bool awaitPromise, EvaluateOptions? options = null, ContextTargetOptions? targetOptions = null)
47+
public Task<EvaluateResult> EvaluateAsync(string expression, bool awaitPromise, EvaluateOptions? options = null, ContextTargetOptions? targetOptions = null)
4848
{
4949
var contextTarget = new ContextTarget(context);
5050

@@ -60,10 +60,10 @@ public Task<EvaluateResultSuccess> EvaluateAsync(string expression, bool awaitPr
6060
{
6161
var result = await EvaluateAsync(expression, awaitPromise, options, targetOptions).ConfigureAwait(false);
6262

63-
return result.Result.ConvertTo<TResult>();
63+
return result.ThrowOnError().Result.ConvertTo<TResult>();
6464
}
6565

66-
public Task<EvaluateResultSuccess> CallFunctionAsync(string functionDeclaration, bool awaitPromise, CallFunctionOptions? options = null, ContextTargetOptions? targetOptions = null)
66+
public Task<EvaluateResult> CallFunctionAsync(string functionDeclaration, bool awaitPromise, CallFunctionOptions? options = null, ContextTargetOptions? targetOptions = null)
6767
{
6868
var contextTarget = new ContextTarget(context);
6969

@@ -79,6 +79,6 @@ public Task<EvaluateResultSuccess> CallFunctionAsync(string functionDeclaration,
7979
{
8080
var result = await CallFunctionAsync(functionDeclaration, awaitPromise, options, targetOptions).ConfigureAwait(false);
8181

82-
return result.Result.ConvertTo<TResult>();
82+
return result.ThrowOnError().Result.ConvertTo<TResult>();
8383
}
8484
}

dotnet/src/webdriver/BiDi/Modules/Script/EvaluateCommand.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,18 @@ public record EvaluateOptions : CommandOptions
3939
//[JsonPolymorphic(TypeDiscriminatorPropertyName = "type")]
4040
//[JsonDerivedType(typeof(EvaluateResultSuccess), "success")]
4141
//[JsonDerivedType(typeof(EvaluateResultException), "exception")]
42-
public abstract record EvaluateResult;
42+
public abstract record EvaluateResult
43+
{
44+
public EvaluateResultSuccess ThrowOnError()
45+
{
46+
if (this is EvaluateResultSuccess success)
47+
{
48+
return success;
49+
}
50+
51+
throw new ScriptEvaluateException((EvaluateResultException)this);
52+
}
53+
}
4354

4455
public record EvaluateResultSuccess(RemoteValue Result, Realm Realm) : EvaluateResult
4556
{

dotnet/src/webdriver/BiDi/Modules/Script/LocalValue.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,10 @@ public record BigIntLocalValue(string Value) : PrimitiveProtocolLocalValue;
9292

9393
public record ChannelLocalValue(ChannelProperties Value) : LocalValue
9494
{
95-
// TODO: Revise why we need it
95+
// AddPreloadScript takes arguments typed as ChannelLocalValue but still requires "type":"channel"
9696
[JsonInclude]
97-
internal string type = "channel";
97+
[JsonPropertyName("type")]
98+
internal string Type => "channel";
9899
}
99100

100101
public record ArrayLocalValue(IEnumerable<LocalValue> Value) : LocalValue;

dotnet/src/webdriver/BiDi/Modules/Script/ScriptEvaluateException.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ public class ScriptEvaluateException(EvaluateResultException evaluateResultExcep
2929

3030
public long ColumNumber => _evaluateResultException.ExceptionDetails.ColumnNumber;
3131

32-
public override string Message => $"{Text}{Environment.NewLine}{_evaluateResultException.ExceptionDetails.StackTrace}";
32+
public override string Message => $"{Text}{Environment.NewLine}{string.Join(Environment.NewLine, _evaluateResultException.ExceptionDetails.StackTrace.CallFrames)}";
3333
}

dotnet/src/webdriver/BiDi/Modules/Script/ScriptModule.cs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,53 +18,44 @@
1818
// </copyright>
1919

2020
using OpenQA.Selenium.BiDi.Communication;
21+
using OpenQA.Selenium.DevTools.V132.Page;
2122
using System;
2223
using System.Threading.Tasks;
2324

2425
namespace OpenQA.Selenium.BiDi.Modules.Script;
2526

2627
public sealed class ScriptModule(Broker broker) : Module(broker)
2728
{
28-
public async Task<EvaluateResultSuccess> EvaluateAsync(string expression, bool awaitPromise, Target target, EvaluateOptions? options = null)
29+
public async Task<EvaluateResult> EvaluateAsync(string expression, bool awaitPromise, Target target, EvaluateOptions? options = null)
2930
{
3031
var @params = new EvaluateCommandParameters(expression, target, awaitPromise, options?.ResultOwnership, options?.SerializationOptions, options?.UserActivation);
3132

3233
var result = await Broker.ExecuteCommandAsync<EvaluateCommand, EvaluateResult>(new EvaluateCommand(@params), options).ConfigureAwait(false);
3334

34-
if (result is EvaluateResultException exp)
35-
{
36-
throw new ScriptEvaluateException(exp);
37-
}
38-
39-
return (EvaluateResultSuccess)result;
35+
return result;
4036
}
4137

4238
public async Task<TResult?> EvaluateAsync<TResult>(string expression, bool awaitPromise, Target target, EvaluateOptions? options = null)
4339
{
4440
var result = await EvaluateAsync(expression, awaitPromise, target, options).ConfigureAwait(false);
4541

46-
return result.Result.ConvertTo<TResult>();
42+
return result.ThrowOnError().Result.ConvertTo<TResult>();
4743
}
4844

49-
public async Task<EvaluateResultSuccess> CallFunctionAsync(string functionDeclaration, bool awaitPromise, Target target, CallFunctionOptions? options = null)
45+
public async Task<EvaluateResult> CallFunctionAsync(string functionDeclaration, bool awaitPromise, Target target, CallFunctionOptions? options = null)
5046
{
5147
var @params = new CallFunctionCommandParameters(functionDeclaration, awaitPromise, target, options?.Arguments, options?.ResultOwnership, options?.SerializationOptions, options?.This, options?.UserActivation);
5248

5349
var result = await Broker.ExecuteCommandAsync<CallFunctionCommand, EvaluateResult>(new CallFunctionCommand(@params), options).ConfigureAwait(false);
5450

55-
if (result is EvaluateResultException exp)
56-
{
57-
throw new ScriptEvaluateException(exp);
58-
}
59-
60-
return (EvaluateResultSuccess)result;
51+
return result;
6152
}
6253

6354
public async Task<TResult?> CallFunctionAsync<TResult>(string functionDeclaration, bool awaitPromise, Target target, CallFunctionOptions? options = null)
6455
{
6556
var result = await CallFunctionAsync(functionDeclaration, awaitPromise, target, options).ConfigureAwait(false);
6657

67-
return result.Result.ConvertTo<TResult>();
58+
return result.ThrowOnError().Result.ConvertTo<TResult>();
6859
}
6960

7061
public async Task<GetRealmsResult> GetRealmsAsync(GetRealmsOptions? options = null)

0 commit comments

Comments
 (0)