1616# ./node_modules/.bin/playwright install chromium
1717#
1818# Run:
19- # bundle exec ruby examples/remote_playwright_example .rb
19+ # bundle exec ruby examples/remote_browser_playwright_example .rb
2020
2121begin
2222 require ( "playwright" )
@@ -62,6 +62,36 @@ def resolve_page_target_id(cdp_session, page_url)
6262 target && target [ "targetId" ]
6363end
6464
65+ def print_stream_event ( label , event )
66+ case event . type
67+ when :log
68+ puts ( "[#{ label } ] log: #{ event . data . message } " )
69+ when :system
70+ status = event . data . status
71+ if event . data . respond_to? ( :error ) && event . data . error
72+ puts ( "[#{ label } ] system #{ status } : #{ event . data . error } " )
73+ elsif event . data . respond_to? ( :result ) && !event . data . result . nil?
74+ puts ( "[#{ label } ] system #{ status } : #{ event . data . result } " )
75+ else
76+ puts ( "[#{ label } ] system #{ status } " )
77+ end
78+ else
79+ puts ( "[#{ label } ] event: #{ event . inspect } " )
80+ end
81+ end
82+
83+ def stream_with_result ( label , stream )
84+ puts ( "#{ label } stream:" )
85+ result = nil
86+ stream . each do |event |
87+ print_stream_event ( label , event )
88+ if event . type == :system && event . data . respond_to? ( :result ) && !event . data . result . nil?
89+ result = event . data . result
90+ end
91+ end
92+ result
93+ end
94+
6595client = Stagehand ::Client . new (
6696 browserbase_api_key : browserbase_api_key ,
6797 browserbase_project_id : browserbase_project_id ,
@@ -102,23 +132,43 @@ def resolve_page_target_id(cdp_session, page_url)
102132 raise "Page target id not found for page target"
103133 end
104134
105- observe_response = client . sessions . observe (
135+ observe_stream = client . sessions . observe_streaming (
106136 session_id ,
107137 frame_id : page_target_id ,
108138 instruction : "Find all clickable links on this page"
109139 )
110- puts ( "Found #{ observe_response . data . result . length } possible actions" )
140+ observe_result = stream_with_result ( "Observe" , observe_stream )
141+ if observe_result . nil?
142+ observe_response = client . sessions . observe (
143+ session_id ,
144+ frame_id : page_target_id ,
145+ instruction : "Find all clickable links on this page"
146+ )
147+ observe_result = observe_response . data . result
148+ end
149+ puts ( "Found #{ observe_result . length } possible actions" )
111150
112- action = observe_response . data . result . first
151+ action = observe_result . first
113152 act_input = action ? action . to_h . merge ( method : "click" ) : "Click the 'Learn more' link"
114- act_response = client . sessions . act (
153+
154+ act_stream = client . sessions . act_streaming (
115155 session_id ,
116156 frame_id : page_target_id ,
117157 input : act_input
118158 )
119- puts ( "Act completed: #{ act_response . data . result [ :message ] } " )
159+ act_result = stream_with_result ( "Act" , act_stream )
160+ if act_result . nil?
161+ act_response = client . sessions . act (
162+ session_id ,
163+ frame_id : page_target_id ,
164+ input : act_input
165+ )
166+ act_result = act_response . data . result
167+ end
168+ act_message = act_result . is_a? ( Hash ) ? ( act_result [ :message ] || act_result [ "message" ] ) : act_result
169+ puts ( "Act completed: #{ act_message } " )
120170
121- extract_response = client . sessions . extract (
171+ extract_stream = client . sessions . extract_streaming (
122172 session_id ,
123173 frame_id : page_target_id ,
124174 instruction : "Extract the main heading and any links on this page" ,
@@ -130,9 +180,25 @@ def resolve_page_target_id(cdp_session, page_url)
130180 }
131181 }
132182 )
133- puts ( "Extracted: #{ extract_response . data . result } " )
183+ extract_result = stream_with_result ( "Extract" , extract_stream )
184+ if extract_result . nil?
185+ extract_response = client . sessions . extract (
186+ session_id ,
187+ frame_id : page_target_id ,
188+ instruction : "Extract the main heading and any links on this page" ,
189+ schema : {
190+ type : "object" ,
191+ properties : {
192+ heading : { type : "string" } ,
193+ links : { type : "array" , items : { type : "string" } }
194+ }
195+ }
196+ )
197+ extract_result = extract_response . data . result
198+ end
199+ puts ( "Extracted: #{ extract_result } " )
134200
135- execute_response = client . sessions . execute (
201+ execute_stream = client . sessions . execute_streaming (
136202 session_id ,
137203 frame_id : page_target_id ,
138204 execute_options : {
@@ -147,12 +213,34 @@ def resolve_page_target_id(cdp_session, page_url)
147213 cua : false
148214 }
149215 )
150- puts ( "Agent completed: #{ execute_response . data . result [ :message ] } " )
151- puts ( "Agent success: #{ execute_response . data . result [ :success ] } " )
216+ execute_result = stream_with_result ( "Agent" , execute_stream )
217+ if execute_result . nil?
218+ execute_response = client . sessions . execute (
219+ session_id ,
220+ frame_id : page_target_id ,
221+ execute_options : {
222+ instruction : "Click on the 'Learn more' link if available" ,
223+ max_steps : 3
224+ } ,
225+ agent_config : {
226+ model : Stagehand ::ModelConfig . new (
227+ model_name : "openai/gpt-5-nano" ,
228+ api_key : model_key
229+ ) ,
230+ cua : false
231+ }
232+ )
233+ execute_result = execute_response . data . result
234+ end
235+ agent_message =
236+ execute_result . is_a? ( Hash ) ? ( execute_result [ :message ] || execute_result [ "message" ] ) : execute_result
237+ agent_success = execute_result . is_a? ( Hash ) ? ( execute_result [ :success ] || execute_result [ "success" ] ) : nil
238+ puts ( "Agent completed: #{ agent_message } " )
239+ puts ( "Agent success: #{ agent_success } " )
152240
153241 page . wait_for_load_state ( state : "domcontentloaded" )
154- page . screenshot ( path : "screenshot_remote_playwright .png" , fullPage : true )
155- puts ( "Screenshot saved to: screenshot_remote_playwright .png" )
242+ page . screenshot ( path : "screenshot_remote_browser_playwright .png" , fullPage : true )
243+ puts ( "Screenshot saved to: screenshot_remote_browser_playwright .png" )
156244 ensure
157245 browser . close
158246 end
0 commit comments