Skip to content

Commit 04568ec

Browse files
authored
Merge pull request #62 from stainless-sdks/STG-1296
STG-1296
2 parents 3eb6444 + d6c2d22 commit 04568ec

2 files changed

Lines changed: 102 additions & 14 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ npm install playwright
168168
export BROWSERBASE_API_KEY="your-browserbase-api-key"
169169
export BROWSERBASE_PROJECT_ID="your-browserbase-project-id"
170170
export MODEL_API_KEY="your-openai-api-key"
171-
bundle exec ruby examples/remote_playwright_example.rb
171+
bundle exec ruby examples/remote_browser_playwright_example.rb
172172
```
173173

174174
Watir local example:

examples/remote_playwright_example.rb renamed to examples/remote_browser_playwright_example.rb

Lines changed: 101 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
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

2121
begin
2222
require("playwright")
@@ -62,6 +62,36 @@ def resolve_page_target_id(cdp_session, page_url)
6262
target && target["targetId"]
6363
end
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+
6595
client = 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

Comments
 (0)