1
+ """
2
+ Regression test for ionwave functionality.
3
+
4
+ This test verifies that navigation actions work correctly by clicking on links,
5
+ based on the TypeScript ionwave evaluation.
6
+ """
7
+
8
+ import os
9
+ import pytest
10
+ import pytest_asyncio
11
+
12
+ from stagehand import Stagehand , StagehandConfig
13
+
14
+
15
+ class TestIonwave :
16
+ """Regression test for ionwave functionality"""
17
+
18
+ @pytest .fixture (scope = "class" )
19
+ def local_config (self ):
20
+ """Configuration for LOCAL mode testing"""
21
+ return StagehandConfig (
22
+ env = "LOCAL" ,
23
+ model_name = "gpt-4o-mini" ,
24
+ headless = True ,
25
+ verbose = 1 ,
26
+ dom_settle_timeout_ms = 2000 ,
27
+ model_client_options = {"apiKey" : os .getenv ("MODEL_API_KEY" ) or os .getenv ("OPENAI_API_KEY" )},
28
+ )
29
+
30
+ @pytest .fixture (scope = "class" )
31
+ def browserbase_config (self ):
32
+ """Configuration for BROWSERBASE mode testing"""
33
+ return StagehandConfig (
34
+ env = "BROWSERBASE" ,
35
+ api_key = os .getenv ("BROWSERBASE_API_KEY" ),
36
+ project_id = os .getenv ("BROWSERBASE_PROJECT_ID" ),
37
+ model_name = "gpt-4o" ,
38
+ headless = False ,
39
+ verbose = 2 ,
40
+ model_client_options = {"apiKey" : os .getenv ("MODEL_API_KEY" ) or os .getenv ("OPENAI_API_KEY" )},
41
+ )
42
+
43
+ @pytest_asyncio .fixture
44
+ async def local_stagehand (self , local_config ):
45
+ """Create a Stagehand instance for LOCAL testing"""
46
+ stagehand = Stagehand (config = local_config )
47
+ await stagehand .init ()
48
+ yield stagehand
49
+ await stagehand .close ()
50
+
51
+ @pytest_asyncio .fixture
52
+ async def browserbase_stagehand (self , browserbase_config ):
53
+ """Create a Stagehand instance for BROWSERBASE testing"""
54
+ if not (os .getenv ("BROWSERBASE_API_KEY" ) and os .getenv ("BROWSERBASE_PROJECT_ID" )):
55
+ pytest .skip ("Browserbase credentials not available" )
56
+
57
+ stagehand = Stagehand (config = browserbase_config )
58
+ await stagehand .init ()
59
+ yield stagehand
60
+ await stagehand .close ()
61
+
62
+ @pytest .mark .asyncio
63
+ @pytest .mark .regression
64
+ @pytest .mark .local
65
+ async def test_ionwave_local (self , local_stagehand ):
66
+ """
67
+ Regression test: ionwave
68
+
69
+ Mirrors the TypeScript ionwave evaluation:
70
+ - Navigate to ionwave test site
71
+ - Click on "Closed Bids" link
72
+ - Verify navigation to closed-bids.html page
73
+ """
74
+ stagehand = local_stagehand
75
+
76
+ await stagehand .page .goto ("https://browserbase.github.io/stagehand-eval-sites/sites/ionwave/" )
77
+
78
+ result = await stagehand .page .act ('Click on "Closed Bids"' )
79
+
80
+ current_url = stagehand .page .url
81
+ expected_url = "https://browserbase.github.io/stagehand-eval-sites/sites/ionwave/closed-bids.html"
82
+
83
+ # Test passes if we successfully navigated to the expected URL
84
+ assert current_url .startswith (expected_url ), f"Expected URL to start with { expected_url } , but got { current_url } "
85
+
86
+ @pytest .mark .asyncio
87
+ @pytest .mark .regression
88
+ @pytest .mark .api
89
+ @pytest .mark .skipif (
90
+ not (os .getenv ("BROWSERBASE_API_KEY" ) and os .getenv ("BROWSERBASE_PROJECT_ID" )),
91
+ reason = "Browserbase credentials not available"
92
+ )
93
+ async def test_ionwave_browserbase (self , browserbase_stagehand ):
94
+ """
95
+ Regression test: ionwave (Browserbase)
96
+
97
+ Same test as local but running in Browserbase environment.
98
+ """
99
+ stagehand = browserbase_stagehand
100
+
101
+ await stagehand .page .goto ("https://browserbase.github.io/stagehand-eval-sites/sites/ionwave/" )
102
+
103
+ result = await stagehand .page .act ('Click on "Closed Bids"' )
104
+
105
+ current_url = stagehand .page .url
106
+ expected_url = "https://browserbase.github.io/stagehand-eval-sites/sites/ionwave/closed-bids.html"
107
+
108
+ # Test passes if we successfully navigated to the expected URL
109
+ assert current_url .startswith (expected_url ), f"Expected URL to start with { expected_url } , but got { current_url } "
0 commit comments