Skip to content

Commit 37f80f3

Browse files
feat: [feat]: add ignoreSelectors to observe()
1 parent 8b3d6b0 commit 37f80f3

3 files changed

Lines changed: 58 additions & 2 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 8
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-49b40c7425adba9e67fc102838c5216c45ca1f7ef4c10823c5665fd413538504.yml
3-
openapi_spec_hash: 6880dc029df2e88dfe8943c0dec5a3a5
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-eae8400fade7b2c8329c4148f56de92e147c34c0feecb420c015aab6544a9acc.yml
3+
openapi_spec_hash: 0a9eff1ac1d464e89cbd9db64709b08a
44
config_hash: 1fb12ae9b478488bc1e56bfbdc210b01

src/Stagehand.Tests/Models/Sessions/SessionObserveParamsTest.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public void FieldRoundtrip_Works()
2020
Instruction = "Find all clickable navigation links",
2121
Options = new()
2222
{
23+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
2324
Model = new ModelConfig()
2425
{
2526
ModelName = "openai/gpt-5.4-mini",
@@ -51,6 +52,7 @@ public void FieldRoundtrip_Works()
5152
string expectedInstruction = "Find all clickable navigation links";
5253
SessionObserveParamsOptions expectedOptions = new()
5354
{
55+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
5456
Model = new ModelConfig()
5557
{
5658
ModelName = "openai/gpt-5.4-mini",
@@ -132,6 +134,7 @@ public void OptionalNullableParamsUnsetAreNotSet_Works()
132134
Instruction = "Find all clickable navigation links",
133135
Options = new()
134136
{
137+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
135138
Model = new ModelConfig()
136139
{
137140
ModelName = "openai/gpt-5.4-mini",
@@ -171,6 +174,7 @@ public void OptionalNullableParamsSetToNullAreSetToNull_Works()
171174
Instruction = "Find all clickable navigation links",
172175
Options = new()
173176
{
177+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
174178
Model = new ModelConfig()
175179
{
176180
ModelName = "openai/gpt-5.4-mini",
@@ -260,6 +264,7 @@ public void CopyConstructor_Works()
260264
Instruction = "Find all clickable navigation links",
261265
Options = new()
262266
{
267+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
263268
Model = new ModelConfig()
264269
{
265270
ModelName = "openai/gpt-5.4-mini",
@@ -299,6 +304,7 @@ public void FieldRoundtrip_Works()
299304
{
300305
var model = new SessionObserveParamsOptions
301306
{
307+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
302308
Model = new ModelConfig()
303309
{
304310
ModelName = "openai/gpt-5.4-mini",
@@ -323,6 +329,7 @@ public void FieldRoundtrip_Works()
323329
},
324330
};
325331

332+
List<string> expectedIgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"];
326333
SessionObserveParamsOptionsModel expectedModel = new ModelConfig()
327334
{
328335
ModelName = "openai/gpt-5.4-mini",
@@ -346,6 +353,12 @@ public void FieldRoundtrip_Works()
346353
{ "rememberMe", true },
347354
};
348355

356+
Assert.NotNull(model.IgnoreSelectors);
357+
Assert.Equal(expectedIgnoreSelectors.Count, model.IgnoreSelectors.Count);
358+
for (int i = 0; i < expectedIgnoreSelectors.Count; i++)
359+
{
360+
Assert.Equal(expectedIgnoreSelectors[i], model.IgnoreSelectors[i]);
361+
}
349362
Assert.Equal(expectedModel, model.Model);
350363
Assert.Equal(expectedSelector, model.Selector);
351364
Assert.Equal(expectedTimeout, model.Timeout);
@@ -364,6 +377,7 @@ public void SerializationRoundtrip_Works()
364377
{
365378
var model = new SessionObserveParamsOptions
366379
{
380+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
367381
Model = new ModelConfig()
368382
{
369383
ModelName = "openai/gpt-5.4-mini",
@@ -402,6 +416,7 @@ public void FieldRoundtripThroughSerialization_Works()
402416
{
403417
var model = new SessionObserveParamsOptions
404418
{
419+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
405420
Model = new ModelConfig()
406421
{
407422
ModelName = "openai/gpt-5.4-mini",
@@ -433,6 +448,7 @@ public void FieldRoundtripThroughSerialization_Works()
433448
);
434449
Assert.NotNull(deserialized);
435450

451+
List<string> expectedIgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"];
436452
SessionObserveParamsOptionsModel expectedModel = new ModelConfig()
437453
{
438454
ModelName = "openai/gpt-5.4-mini",
@@ -456,6 +472,12 @@ public void FieldRoundtripThroughSerialization_Works()
456472
{ "rememberMe", true },
457473
};
458474

475+
Assert.NotNull(deserialized.IgnoreSelectors);
476+
Assert.Equal(expectedIgnoreSelectors.Count, deserialized.IgnoreSelectors.Count);
477+
for (int i = 0; i < expectedIgnoreSelectors.Count; i++)
478+
{
479+
Assert.Equal(expectedIgnoreSelectors[i], deserialized.IgnoreSelectors[i]);
480+
}
459481
Assert.Equal(expectedModel, deserialized.Model);
460482
Assert.Equal(expectedSelector, deserialized.Selector);
461483
Assert.Equal(expectedTimeout, deserialized.Timeout);
@@ -474,6 +496,7 @@ public void Validation_Works()
474496
{
475497
var model = new SessionObserveParamsOptions
476498
{
499+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
477500
Model = new ModelConfig()
478501
{
479502
ModelName = "openai/gpt-5.4-mini",
@@ -506,6 +529,8 @@ public void OptionalNonNullablePropertiesUnsetAreNotSet_Works()
506529
{
507530
var model = new SessionObserveParamsOptions { };
508531

532+
Assert.Null(model.IgnoreSelectors);
533+
Assert.False(model.RawData.ContainsKey("ignoreSelectors"));
509534
Assert.Null(model.Model);
510535
Assert.False(model.RawData.ContainsKey("model"));
511536
Assert.Null(model.Selector);
@@ -530,12 +555,15 @@ public void OptionalNonNullablePropertiesSetToNullAreNotSet_Works()
530555
var model = new SessionObserveParamsOptions
531556
{
532557
// Null should be interpreted as omitted for these properties
558+
IgnoreSelectors = null,
533559
Model = null,
534560
Selector = null,
535561
Timeout = null,
536562
Variables = null,
537563
};
538564

565+
Assert.Null(model.IgnoreSelectors);
566+
Assert.False(model.RawData.ContainsKey("ignoreSelectors"));
539567
Assert.Null(model.Model);
540568
Assert.False(model.RawData.ContainsKey("model"));
541569
Assert.Null(model.Selector);
@@ -552,6 +580,7 @@ public void OptionalNonNullablePropertiesSetToNullValidation_Works()
552580
var model = new SessionObserveParamsOptions
553581
{
554582
// Null should be interpreted as omitted for these properties
583+
IgnoreSelectors = null,
555584
Model = null,
556585
Selector = null,
557586
Timeout = null,
@@ -566,6 +595,7 @@ public void CopyConstructor_Works()
566595
{
567596
var model = new SessionObserveParamsOptions
568597
{
598+
IgnoreSelectors = ["nav", ".cookie-banner", "#sidebar-ads"],
569599
Model = new ModelConfig()
570600
{
571601
ModelName = "openai/gpt-5.4-mini",

src/Stagehand/Models/Sessions/SessionObserveParams.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Frozen;
22
using System.Collections.Generic;
3+
using System.Collections.Immutable;
34
using System.Diagnostics.CodeAnalysis;
45
using System.Net.Http;
56
using System.Text;
@@ -229,6 +230,30 @@ public override int GetHashCode()
229230
)]
230231
public sealed record class SessionObserveParamsOptions : JsonModel
231232
{
233+
/// <summary>
234+
/// Selectors for elements and subtrees that should be excluded from observation
235+
/// </summary>
236+
public IReadOnlyList<string>? IgnoreSelectors
237+
{
238+
get
239+
{
240+
this._rawData.Freeze();
241+
return this._rawData.GetNullableStruct<ImmutableArray<string>>("ignoreSelectors");
242+
}
243+
init
244+
{
245+
if (value == null)
246+
{
247+
return;
248+
}
249+
250+
this._rawData.Set<ImmutableArray<string>?>(
251+
"ignoreSelectors",
252+
value == null ? null : ImmutableArray.ToImmutableArray(value)
253+
);
254+
}
255+
}
256+
232257
/// <summary>
233258
/// Model configuration object or model name string (e.g., 'openai/gpt-5-nano')
234259
/// </summary>
@@ -323,6 +348,7 @@ public IReadOnlyDictionary<string, SessionObserveParamsOptionsVariable>? Variabl
323348
/// <inheritdoc/>
324349
public override void Validate()
325350
{
351+
_ = this.IgnoreSelectors;
326352
this.Model?.Validate();
327353
_ = this.Selector;
328354
_ = this.Timeout;

0 commit comments

Comments
 (0)