Skip to content

Commit 1ec1a62

Browse files
feat: add name parameter to browser_session() and SessionConfiguration (aws#326)
1 parent 2afa155 commit 1ec1a62

4 files changed

Lines changed: 105 additions & 0 deletions

File tree

src/bedrock_agentcore/tools/browser_client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,7 @@ def browser_session(
629629
region: str,
630630
viewport: Optional[Union[ViewportConfiguration, Dict[str, int]]] = None,
631631
identifier: Optional[str] = None,
632+
name: Optional[str] = None,
632633
proxy_configuration: Optional[Union[ProxyConfiguration, Dict[str, Any]]] = None,
633634
extensions: Optional[List[Union[BrowserExtension, Dict[str, Any]]]] = None,
634635
profile_configuration: Optional[Union[ProfileConfiguration, Dict[str, Any]]] = None,
@@ -640,6 +641,7 @@ def browser_session(
640641
viewport (Optional[Union[ViewportConfiguration, Dict[str, int]]]): Viewport dimensions.
641642
Can be a ViewportConfiguration dataclass or a plain dict.
642643
identifier (Optional[str]): Browser identifier (system or custom).
644+
name (Optional[str]): A name for this session.
643645
proxy_configuration (Optional[Union[ProxyConfiguration, Dict[str, Any]]]): Proxy
644646
configuration. Can be a ProxyConfiguration dataclass or a plain dict.
645647
extensions (Optional[List[Union[BrowserExtension, Dict[str, Any]]]]): Browser
@@ -660,6 +662,10 @@ def browser_session(
660662
... # Automation with reduced CAPTCHA friction
661663
... pass
662664
...
665+
>>> # Use named session
666+
>>> with browser_session('us-west-2', name='my-research-session') as client:
667+
... ws_url, headers = client.generate_ws_headers()
668+
...
663669
>>> # Use proxy configuration
664670
>>> with browser_session('us-west-2', proxy_configuration={
665671
... "proxies": [{"externalProxy": {"server": "proxy.corp.com", "port": 8080}}],
@@ -673,6 +679,8 @@ def browser_session(
673679
start_kwargs["viewport"] = viewport
674680
if identifier is not None:
675681
start_kwargs["identifier"] = identifier
682+
if name is not None:
683+
start_kwargs["name"] = name
676684
if proxy_configuration is not None:
677685
start_kwargs["proxy_configuration"] = proxy_configuration
678686
if extensions is not None:

src/bedrock_agentcore/tools/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,14 @@ class SessionConfiguration:
341341
Usage: client.start(**session_config.to_dict())
342342
343343
Attributes:
344+
name: Optional name for the session
344345
viewport: Viewport dimensions for the browser session
345346
proxy: Proxy configuration for routing browser traffic
346347
extensions: Browser extensions to load into the session
347348
profile: Profile configuration for persisting browser state
348349
"""
349350

351+
name: Optional[str] = None
350352
viewport: Optional[ViewportConfiguration] = None
351353
proxy: Optional[ProxyConfiguration] = None
352354
extensions: Optional[List[BrowserExtension]] = None
@@ -355,6 +357,8 @@ class SessionConfiguration:
355357
def to_dict(self) -> Dict:
356358
"""Convert to API-compatible dictionary."""
357359
config = {}
360+
if self.name is not None:
361+
config["name"] = self.name
358362
if self.viewport:
359363
config["viewport"] = self.viewport.to_dict()
360364
if self.proxy:

tests/bedrock_agentcore/tools/test_browser_client.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ProfileConfiguration,
1717
ProxyConfiguration,
1818
ProxyCredentials,
19+
SessionConfiguration,
1920
ViewportConfiguration,
2021
)
2122

@@ -1359,3 +1360,87 @@ def test_browser_session_accepts_dataclass_params(self, mock_client_class):
13591360
profile_configuration=profile,
13601361
)
13611362
mock_client.stop.assert_called_once()
1363+
1364+
@patch("bedrock_agentcore.tools.browser_client.BrowserClient")
1365+
def test_browser_session_context_manager_with_name(self, mock_client_class):
1366+
# Arrange
1367+
mock_client = MagicMock()
1368+
mock_client_class.return_value = mock_client
1369+
1370+
# Act
1371+
with browser_session("us-west-2", name="my-session"):
1372+
pass
1373+
1374+
# Assert
1375+
mock_client_class.assert_called_once_with("us-west-2")
1376+
mock_client.start.assert_called_once_with(name="my-session")
1377+
mock_client.stop.assert_called_once()
1378+
1379+
@patch("bedrock_agentcore.tools.browser_client.BrowserClient")
1380+
def test_browser_session_context_manager_with_name_and_all_params(self, mock_client_class):
1381+
# Arrange
1382+
mock_client = MagicMock()
1383+
mock_client_class.return_value = mock_client
1384+
viewport = {"width": 1280, "height": 720}
1385+
proxy_config = {
1386+
"proxies": [
1387+
{
1388+
"externalProxy": {
1389+
"server": "proxy.example.com",
1390+
"port": 8080,
1391+
}
1392+
}
1393+
],
1394+
}
1395+
extensions = [{"location": {"s3": {"bucket": "my-bucket", "prefix": "extensions/my-ext"}}}]
1396+
profile_config = {"profileIdentifier": "my-profile-id"}
1397+
1398+
# Act
1399+
with browser_session(
1400+
"us-west-2",
1401+
viewport=viewport,
1402+
identifier="custom-browser",
1403+
name="my-named-session",
1404+
proxy_configuration=proxy_config,
1405+
extensions=extensions,
1406+
profile_configuration=profile_config,
1407+
):
1408+
pass
1409+
1410+
# Assert
1411+
mock_client_class.assert_called_once_with("us-west-2")
1412+
mock_client.start.assert_called_once_with(
1413+
viewport=viewport,
1414+
identifier="custom-browser",
1415+
name="my-named-session",
1416+
proxy_configuration=proxy_config,
1417+
extensions=extensions,
1418+
profile_configuration=profile_config,
1419+
)
1420+
mock_client.stop.assert_called_once()
1421+
1422+
def test_session_configuration_with_name(self):
1423+
# Arrange
1424+
config = SessionConfiguration(name="test")
1425+
1426+
# Act
1427+
result = config.to_dict()
1428+
1429+
# Assert
1430+
assert result == {"name": "test"}
1431+
1432+
def test_session_configuration_with_name_and_viewport(self):
1433+
# Arrange
1434+
config = SessionConfiguration(
1435+
name="test-session",
1436+
viewport=ViewportConfiguration(width=1920, height=1080),
1437+
)
1438+
1439+
# Act
1440+
result = config.to_dict()
1441+
1442+
# Assert
1443+
assert result == {
1444+
"name": "test-session",
1445+
"viewport": {"width": 1920, "height": 1080},
1446+
}

tests_integ/tools/test_browser.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,11 @@
2727
url, headers = client.generate_ws_headers()
2828
assert url.startswith("wss")
2929
print("✅ Test 2 passed")
30+
31+
# Test 3: Browser session with custom name
32+
print("\nTest 3: Browser session with custom name")
33+
with browser_session("us-west-2", name="sdk-integ-test-session") as client:
34+
assert client.session_id is not None
35+
session_info = client.get_session()
36+
assert session_info.get("name") == "sdk-integ-test-session"
37+
print("✅ Test 3 passed")

0 commit comments

Comments
 (0)