diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 911c623..d11c8fc 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "3.19.3"
+ ".": "3.20.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index ac9e78a..d8428d4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 8
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-b969ce378479c79ee64c05127c0ed6c6ce2edbee017ecd037242fb618a5ebc9f.yml
-openapi_spec_hash: a24aabaa5214effb679808b7f2be0ad4
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml
+openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab
config_hash: a962ae71493deb11a1c903256fb25386
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c3ce73..c9dd528 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
# Changelog
+## 3.20.0 (2026-04-09)
+
+Full Changelog: [v3.19.3...v3.20.0](https://github.com/browserbase/stagehand-java/compare/v3.19.3...v3.20.0)
+
+### Features
+
+* [STG-1798] feat: support Browserbase verified sessions ([59ee151](https://github.com/browserbase/stagehand-java/commit/59ee1516eb17d6b8474b12d2722ff4627fa2557c))
+* Bedrock auth passthrough ([7d5037a](https://github.com/browserbase/stagehand-java/commit/7d5037abacedbee829f0fe238565ed81c211eba9))
+* Revert "[STG-1573] Add providerOptions for extensible model auth ([#1822](https://github.com/browserbase/stagehand-java/issues/1822))" ([c337e61](https://github.com/browserbase/stagehand-java/commit/c337e61dd9b2cc366bceec0e7119874acdc3b069))
+
## 3.19.3 (2026-04-03)
Full Changelog: [v3.18.0...v3.19.3](https://github.com/browserbase/stagehand-java/compare/v3.18.0...v3.19.3)
diff --git a/README.md b/README.md
index 7179a61..5a108ce 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
-[](https://central.sonatype.com/artifact/com.browserbase.api/stagehand-java/3.19.3)
-[](https://javadoc.io/doc/com.browserbase.api/stagehand-java/3.19.3)
+[](https://central.sonatype.com/artifact/com.browserbase.api/stagehand-java/3.20.0)
+[](https://javadoc.io/doc/com.browserbase.api/stagehand-java/3.20.0)
@@ -85,7 +85,7 @@ Most existing browser automation tools either require you to write low-level cod
### Gradle
```kotlin
-implementation("com.browserbase.api:stagehand-java:3.19.3")
+implementation("com.browserbase.api:stagehand-java:3.20.0")
```
### Maven
@@ -94,7 +94,7 @@ implementation("com.browserbase.api:stagehand-java:3.19.3")
com.browserbase.api
stagehand-java
- 3.19.3
+ 3.20.0
```
diff --git a/build.gradle.kts b/build.gradle.kts
index 7d91da7..2fc0dbb 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -8,7 +8,7 @@ repositories {
allprojects {
group = "com.browserbase.api"
- version = "3.19.3" // x-release-please-version
+ version = "3.20.0" // x-release-please-version
}
subprojects {
diff --git a/stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionStartParams.kt b/stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionStartParams.kt
index 5e09071..994401f 100644
--- a/stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionStartParams.kt
+++ b/stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionStartParams.kt
@@ -3614,12 +3614,16 @@ private constructor(
private constructor(
private val advancedStealth: JsonField,
private val blockAds: JsonField,
+ private val captchaImageSelector: JsonField,
+ private val captchaInputSelector: JsonField,
private val context: JsonField,
private val extensionId: JsonField,
private val fingerprint: JsonField,
private val logSession: JsonField,
+ private val os: JsonField,
private val recordSession: JsonField,
private val solveCaptchas: JsonField,
+ private val verified: JsonField,
private val viewport: JsonField,
private val additionalProperties: MutableMap,
) {
@@ -3632,6 +3636,12 @@ private constructor(
@JsonProperty("blockAds")
@ExcludeMissing
blockAds: JsonField = JsonMissing.of(),
+ @JsonProperty("captchaImageSelector")
+ @ExcludeMissing
+ captchaImageSelector: JsonField = JsonMissing.of(),
+ @JsonProperty("captchaInputSelector")
+ @ExcludeMissing
+ captchaInputSelector: JsonField = JsonMissing.of(),
@JsonProperty("context")
@ExcludeMissing
context: JsonField = JsonMissing.of(),
@@ -3644,24 +3654,32 @@ private constructor(
@JsonProperty("logSession")
@ExcludeMissing
logSession: JsonField = JsonMissing.of(),
+ @JsonProperty("os") @ExcludeMissing os: JsonField = JsonMissing.of(),
@JsonProperty("recordSession")
@ExcludeMissing
recordSession: JsonField = JsonMissing.of(),
@JsonProperty("solveCaptchas")
@ExcludeMissing
solveCaptchas: JsonField = JsonMissing.of(),
+ @JsonProperty("verified")
+ @ExcludeMissing
+ verified: JsonField = JsonMissing.of(),
@JsonProperty("viewport")
@ExcludeMissing
viewport: JsonField = JsonMissing.of(),
) : this(
advancedStealth,
blockAds,
+ captchaImageSelector,
+ captchaInputSelector,
context,
extensionId,
fingerprint,
logSession,
+ os,
recordSession,
solveCaptchas,
+ verified,
viewport,
mutableMapOf(),
)
@@ -3679,6 +3697,20 @@ private constructor(
*/
fun blockAds(): Optional = blockAds.getOptional("blockAds")
+ /**
+ * @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
+ * if the server responded with an unexpected value).
+ */
+ fun captchaImageSelector(): Optional =
+ captchaImageSelector.getOptional("captchaImageSelector")
+
+ /**
+ * @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
+ * if the server responded with an unexpected value).
+ */
+ fun captchaInputSelector(): Optional =
+ captchaInputSelector.getOptional("captchaInputSelector")
+
/**
* @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
* if the server responded with an unexpected value).
@@ -3703,6 +3735,12 @@ private constructor(
*/
fun logSession(): Optional = logSession.getOptional("logSession")
+ /**
+ * @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
+ * if the server responded with an unexpected value).
+ */
+ fun os(): Optional = os.getOptional("os")
+
/**
* @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
* if the server responded with an unexpected value).
@@ -3715,6 +3753,12 @@ private constructor(
*/
fun solveCaptchas(): Optional = solveCaptchas.getOptional("solveCaptchas")
+ /**
+ * @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
+ * if the server responded with an unexpected value).
+ */
+ fun verified(): Optional = verified.getOptional("verified")
+
/**
* @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g.
* if the server responded with an unexpected value).
@@ -3739,6 +3783,26 @@ private constructor(
*/
@JsonProperty("blockAds") @ExcludeMissing fun _blockAds(): JsonField = blockAds
+ /**
+ * Returns the raw JSON value of [captchaImageSelector].
+ *
+ * Unlike [captchaImageSelector], this method doesn't throw if the JSON field has an
+ * unexpected type.
+ */
+ @JsonProperty("captchaImageSelector")
+ @ExcludeMissing
+ fun _captchaImageSelector(): JsonField = captchaImageSelector
+
+ /**
+ * Returns the raw JSON value of [captchaInputSelector].
+ *
+ * Unlike [captchaInputSelector], this method doesn't throw if the JSON field has an
+ * unexpected type.
+ */
+ @JsonProperty("captchaInputSelector")
+ @ExcludeMissing
+ fun _captchaInputSelector(): JsonField = captchaInputSelector
+
/**
* Returns the raw JSON value of [context].
*
@@ -3776,6 +3840,13 @@ private constructor(
@ExcludeMissing
fun _logSession(): JsonField = logSession
+ /**
+ * Returns the raw JSON value of [os].
+ *
+ * Unlike [os], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("os") @ExcludeMissing fun _os(): JsonField = os
+
/**
* Returns the raw JSON value of [recordSession].
*
@@ -3796,6 +3867,14 @@ private constructor(
@ExcludeMissing
fun _solveCaptchas(): JsonField = solveCaptchas
+ /**
+ * Returns the raw JSON value of [verified].
+ *
+ * Unlike [verified], this method doesn't throw if the JSON field has an unexpected
+ * type.
+ */
+ @JsonProperty("verified") @ExcludeMissing fun _verified(): JsonField = verified
+
/**
* Returns the raw JSON value of [viewport].
*
@@ -3829,12 +3908,16 @@ private constructor(
private var advancedStealth: JsonField = JsonMissing.of()
private var blockAds: JsonField = JsonMissing.of()
+ private var captchaImageSelector: JsonField = JsonMissing.of()
+ private var captchaInputSelector: JsonField = JsonMissing.of()
private var context: JsonField = JsonMissing.of()
private var extensionId: JsonField = JsonMissing.of()
private var fingerprint: JsonField = JsonMissing.of()
private var logSession: JsonField = JsonMissing.of()
+ private var os: JsonField = JsonMissing.of()
private var recordSession: JsonField = JsonMissing.of()
private var solveCaptchas: JsonField = JsonMissing.of()
+ private var verified: JsonField = JsonMissing.of()
private var viewport: JsonField = JsonMissing.of()
private var additionalProperties: MutableMap = mutableMapOf()
@@ -3842,12 +3925,16 @@ private constructor(
internal fun from(browserSettings: BrowserSettings) = apply {
advancedStealth = browserSettings.advancedStealth
blockAds = browserSettings.blockAds
+ captchaImageSelector = browserSettings.captchaImageSelector
+ captchaInputSelector = browserSettings.captchaInputSelector
context = browserSettings.context
extensionId = browserSettings.extensionId
fingerprint = browserSettings.fingerprint
logSession = browserSettings.logSession
+ os = browserSettings.os
recordSession = browserSettings.recordSession
solveCaptchas = browserSettings.solveCaptchas
+ verified = browserSettings.verified
viewport = browserSettings.viewport
additionalProperties = browserSettings.additionalProperties.toMutableMap()
}
@@ -3877,6 +3964,34 @@ private constructor(
*/
fun blockAds(blockAds: JsonField) = apply { this.blockAds = blockAds }
+ fun captchaImageSelector(captchaImageSelector: String) =
+ captchaImageSelector(JsonField.of(captchaImageSelector))
+
+ /**
+ * Sets [Builder.captchaImageSelector] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.captchaImageSelector] with a well-typed [String]
+ * value instead. This method is primarily for setting the field to an undocumented
+ * or not yet supported value.
+ */
+ fun captchaImageSelector(captchaImageSelector: JsonField) = apply {
+ this.captchaImageSelector = captchaImageSelector
+ }
+
+ fun captchaInputSelector(captchaInputSelector: String) =
+ captchaInputSelector(JsonField.of(captchaInputSelector))
+
+ /**
+ * Sets [Builder.captchaInputSelector] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.captchaInputSelector] with a well-typed [String]
+ * value instead. This method is primarily for setting the field to an undocumented
+ * or not yet supported value.
+ */
+ fun captchaInputSelector(captchaInputSelector: JsonField) = apply {
+ this.captchaInputSelector = captchaInputSelector
+ }
+
fun context(context: Context) = context(JsonField.of(context))
/**
@@ -3927,6 +4042,17 @@ private constructor(
this.logSession = logSession
}
+ fun os(os: Os) = os(JsonField.of(os))
+
+ /**
+ * Sets [Builder.os] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.os] with a well-typed [Os] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun os(os: JsonField) = apply { this.os = os }
+
fun recordSession(recordSession: Boolean) =
recordSession(JsonField.of(recordSession))
@@ -3955,6 +4081,17 @@ private constructor(
this.solveCaptchas = solveCaptchas
}
+ fun verified(verified: Boolean) = verified(JsonField.of(verified))
+
+ /**
+ * Sets [Builder.verified] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.verified] with a well-typed [Boolean] value
+ * instead. This method is primarily for setting the field to an undocumented or not
+ * yet supported value.
+ */
+ fun verified(verified: JsonField) = apply { this.verified = verified }
+
fun viewport(viewport: Viewport) = viewport(JsonField.of(viewport))
/**
@@ -3997,12 +4134,16 @@ private constructor(
BrowserSettings(
advancedStealth,
blockAds,
+ captchaImageSelector,
+ captchaInputSelector,
context,
extensionId,
fingerprint,
logSession,
+ os,
recordSession,
solveCaptchas,
+ verified,
viewport,
additionalProperties.toMutableMap(),
)
@@ -4017,12 +4158,16 @@ private constructor(
advancedStealth()
blockAds()
+ captchaImageSelector()
+ captchaInputSelector()
context().ifPresent { it.validate() }
extensionId()
fingerprint().ifPresent { it.validate() }
logSession()
+ os().ifPresent { it.validate() }
recordSession()
solveCaptchas()
+ verified()
viewport().ifPresent { it.validate() }
validated = true
}
@@ -4045,12 +4190,16 @@ private constructor(
internal fun validity(): Int =
(if (advancedStealth.asKnown().isPresent) 1 else 0) +
(if (blockAds.asKnown().isPresent) 1 else 0) +
+ (if (captchaImageSelector.asKnown().isPresent) 1 else 0) +
+ (if (captchaInputSelector.asKnown().isPresent) 1 else 0) +
(context.asKnown().getOrNull()?.validity() ?: 0) +
(if (extensionId.asKnown().isPresent) 1 else 0) +
(fingerprint.asKnown().getOrNull()?.validity() ?: 0) +
(if (logSession.asKnown().isPresent) 1 else 0) +
+ (os.asKnown().getOrNull()?.validity() ?: 0) +
(if (recordSession.asKnown().isPresent) 1 else 0) +
(if (solveCaptchas.asKnown().isPresent) 1 else 0) +
+ (if (verified.asKnown().isPresent) 1 else 0) +
(viewport.asKnown().getOrNull()?.validity() ?: 0)
class Context
@@ -5518,6 +5667,153 @@ private constructor(
"Fingerprint{browsers=$browsers, devices=$devices, httpVersion=$httpVersion, locales=$locales, operatingSystems=$operatingSystems, screen=$screen, additionalProperties=$additionalProperties}"
}
+ class Os @JsonCreator private constructor(private val value: JsonField) : Enum {
+
+ /**
+ * Returns this class instance's raw value.
+ *
+ * This is usually only useful if this instance was deserialized from data that
+ * doesn't match any known member, and you want to know that value. For example, if
+ * the SDK is on an older version than the API, then the API may respond with new
+ * members that the SDK is unaware of.
+ */
+ @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value
+
+ companion object {
+
+ @JvmField val WINDOWS = of("windows")
+
+ @JvmField val MAC = of("mac")
+
+ @JvmField val LINUX = of("linux")
+
+ @JvmField val MOBILE = of("mobile")
+
+ @JvmField val TABLET = of("tablet")
+
+ @JvmStatic fun of(value: String) = Os(JsonField.of(value))
+ }
+
+ /** An enum containing [Os]'s known values. */
+ enum class Known {
+ WINDOWS,
+ MAC,
+ LINUX,
+ MOBILE,
+ TABLET,
+ }
+
+ /**
+ * An enum containing [Os]'s known values, as well as an [_UNKNOWN] member.
+ *
+ * An instance of [Os] can contain an unknown value in a couple of cases:
+ * - It was deserialized from data that doesn't match any known member. For example,
+ * if the SDK is on an older version than the API, then the API may respond with
+ * new members that the SDK is unaware of.
+ * - It was constructed with an arbitrary value using the [of] method.
+ */
+ enum class Value {
+ WINDOWS,
+ MAC,
+ LINUX,
+ MOBILE,
+ TABLET,
+ /**
+ * An enum member indicating that [Os] was instantiated with an unknown value.
+ */
+ _UNKNOWN,
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value, or
+ * [Value._UNKNOWN] if the class was instantiated with an unknown value.
+ *
+ * Use the [known] method instead if you're certain the value is always known or if
+ * you want to throw for the unknown case.
+ */
+ fun value(): Value =
+ when (this) {
+ WINDOWS -> Value.WINDOWS
+ MAC -> Value.MAC
+ LINUX -> Value.LINUX
+ MOBILE -> Value.MOBILE
+ TABLET -> Value.TABLET
+ else -> Value._UNKNOWN
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value.
+ *
+ * Use the [value] method instead if you're uncertain the value is always known and
+ * don't want to throw for the unknown case.
+ *
+ * @throws StagehandInvalidDataException if this class instance's value is a not a
+ * known member.
+ */
+ fun known(): Known =
+ when (this) {
+ WINDOWS -> Known.WINDOWS
+ MAC -> Known.MAC
+ LINUX -> Known.LINUX
+ MOBILE -> Known.MOBILE
+ TABLET -> Known.TABLET
+ else -> throw StagehandInvalidDataException("Unknown Os: $value")
+ }
+
+ /**
+ * Returns this class instance's primitive wire representation.
+ *
+ * This differs from the [toString] method because that method is primarily for
+ * debugging and generally doesn't throw.
+ *
+ * @throws StagehandInvalidDataException if this class instance's value does not
+ * have the expected primitive type.
+ */
+ fun asString(): String =
+ _value().asString().orElseThrow {
+ StagehandInvalidDataException("Value is not a String")
+ }
+
+ private var validated: Boolean = false
+
+ fun validate(): Os = apply {
+ if (validated) {
+ return@apply
+ }
+
+ known()
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: StagehandInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object
+ * recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is Os && value == other.value
+ }
+
+ override fun hashCode() = value.hashCode()
+
+ override fun toString() = value.toString()
+ }
+
class Viewport
@JsonCreator(mode = JsonCreator.Mode.DISABLED)
private constructor(
@@ -5709,12 +6005,16 @@ private constructor(
return other is BrowserSettings &&
advancedStealth == other.advancedStealth &&
blockAds == other.blockAds &&
+ captchaImageSelector == other.captchaImageSelector &&
+ captchaInputSelector == other.captchaInputSelector &&
context == other.context &&
extensionId == other.extensionId &&
fingerprint == other.fingerprint &&
logSession == other.logSession &&
+ os == other.os &&
recordSession == other.recordSession &&
solveCaptchas == other.solveCaptchas &&
+ verified == other.verified &&
viewport == other.viewport &&
additionalProperties == other.additionalProperties
}
@@ -5723,12 +6023,16 @@ private constructor(
Objects.hash(
advancedStealth,
blockAds,
+ captchaImageSelector,
+ captchaInputSelector,
context,
extensionId,
fingerprint,
logSession,
+ os,
recordSession,
solveCaptchas,
+ verified,
viewport,
additionalProperties,
)
@@ -5737,7 +6041,7 @@ private constructor(
override fun hashCode(): Int = hashCode
override fun toString() =
- "BrowserSettings{advancedStealth=$advancedStealth, blockAds=$blockAds, context=$context, extensionId=$extensionId, fingerprint=$fingerprint, logSession=$logSession, recordSession=$recordSession, solveCaptchas=$solveCaptchas, viewport=$viewport, additionalProperties=$additionalProperties}"
+ "BrowserSettings{advancedStealth=$advancedStealth, blockAds=$blockAds, captchaImageSelector=$captchaImageSelector, captchaInputSelector=$captchaInputSelector, context=$context, extensionId=$extensionId, fingerprint=$fingerprint, logSession=$logSession, os=$os, recordSession=$recordSession, solveCaptchas=$solveCaptchas, verified=$verified, viewport=$viewport, additionalProperties=$additionalProperties}"
}
@JsonDeserialize(using = Proxies.Deserializer::class)
diff --git a/stagehand-java-core/src/test/kotlin/com/browserbase/api/models/sessions/SessionStartParamsTest.kt b/stagehand-java-core/src/test/kotlin/com/browserbase/api/models/sessions/SessionStartParamsTest.kt
index 7ebe44e..0a8dffc 100644
--- a/stagehand-java-core/src/test/kotlin/com/browserbase/api/models/sessions/SessionStartParamsTest.kt
+++ b/stagehand-java-core/src/test/kotlin/com/browserbase/api/models/sessions/SessionStartParamsTest.kt
@@ -67,6 +67,8 @@ internal class SessionStartParamsTest {
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings
.Context
@@ -124,8 +126,13 @@ internal class SessionStartParamsTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings.Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings
.Viewport
@@ -219,6 +226,8 @@ internal class SessionStartParamsTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -278,8 +287,15 @@ internal class SessionStartParamsTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -387,6 +403,8 @@ internal class SessionStartParamsTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -446,8 +464,15 @@ internal class SessionStartParamsTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -539,6 +564,8 @@ internal class SessionStartParamsTest {
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings
.Context
@@ -596,8 +623,13 @@ internal class SessionStartParamsTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings.Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams.BrowserSettings
.Viewport
diff --git a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ErrorHandlingTest.kt b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ErrorHandlingTest.kt
index a3bc8a0..6941c36 100644
--- a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ErrorHandlingTest.kt
+++ b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ErrorHandlingTest.kt
@@ -136,6 +136,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -200,8 +202,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -322,6 +331,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -386,8 +397,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -508,6 +526,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -572,8 +592,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -694,6 +721,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -758,8 +787,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -880,6 +916,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -944,8 +982,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1066,6 +1111,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1130,8 +1177,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1252,6 +1306,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1316,8 +1372,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1438,6 +1501,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1502,8 +1567,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1624,6 +1696,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1688,8 +1762,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1810,6 +1891,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1874,8 +1957,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -1996,6 +2086,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2060,8 +2152,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2182,6 +2281,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2246,8 +2347,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2368,6 +2476,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2432,8 +2542,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2554,6 +2671,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2618,8 +2737,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2740,6 +2866,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2804,8 +2932,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2926,6 +3061,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -2990,8 +3127,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -3110,6 +3254,8 @@ internal class ErrorHandlingTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -3174,8 +3320,15 @@ internal class ErrorHandlingTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
diff --git a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ServiceParamsTest.kt b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ServiceParamsTest.kt
index f423bd2..392cc05 100644
--- a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ServiceParamsTest.kt
+++ b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/ServiceParamsTest.kt
@@ -104,6 +104,8 @@ internal class ServiceParamsTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -163,8 +165,15 @@ internal class ServiceParamsTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
diff --git a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/async/SessionServiceAsyncTest.kt b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/async/SessionServiceAsyncTest.kt
index 3635e44..a21bd07 100644
--- a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/async/SessionServiceAsyncTest.kt
+++ b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/async/SessionServiceAsyncTest.kt
@@ -640,6 +640,8 @@ internal class SessionServiceAsyncTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -699,8 +701,15 @@ internal class SessionServiceAsyncTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
diff --git a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/blocking/SessionServiceTest.kt b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/blocking/SessionServiceTest.kt
index 15ae6c4..7923bb5 100644
--- a/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/blocking/SessionServiceTest.kt
+++ b/stagehand-java-core/src/test/kotlin/com/browserbase/api/services/blocking/SessionServiceTest.kt
@@ -633,6 +633,8 @@ internal class SessionServiceTest {
.builder()
.advancedStealth(true)
.blockAds(true)
+ .captchaImageSelector("captchaImageSelector")
+ .captchaInputSelector("captchaInputSelector")
.context(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings
@@ -692,8 +694,15 @@ internal class SessionServiceTest {
.build()
)
.logSession(true)
+ .os(
+ SessionStartParams.BrowserbaseSessionCreateParams
+ .BrowserSettings
+ .Os
+ .WINDOWS
+ )
.recordSession(true)
.solveCaptchas(true)
+ .verified(true)
.viewport(
SessionStartParams.BrowserbaseSessionCreateParams
.BrowserSettings