run script with browser session (#3368)

This commit is contained in:
Shuchang Zheng
2025-09-04 21:24:51 -07:00
committed by GitHub
parent 2c607037aa
commit 0fceaac8c8
4 changed files with 37 additions and 11 deletions

View File

@@ -9,13 +9,16 @@ from skyvern.forge.sdk.workflow.models.parameter import WorkflowParameterType
async def setup(
parameters: dict[str, Any], generated_parameter_cls: type[BaseModel] | None = None
parameters: dict[str, Any],
generated_parameter_cls: type[BaseModel] | None = None,
browser_session_id: str | None = None,
) -> tuple[SkyvernPage, RunContext]:
# transform any secrets/credential parameters. For example, if there's only one credential in the parameters: {"cred_12345": "cred_12345"},
# it should be transformed to {"cred_12345": {"username": "secret_5fBoa_username", "password": "secret_5fBoa_password"}}
# context comes from app.WORKFLOW_CONTEXT_MANAGER.get_workflow_run_context(workflow_run_id)
context = skyvern_context.current()
if context and context.organization_id and context.workflow_run_id:
browser_session_id = browser_session_id or context.browser_session_id
workflow_run_context = app.WORKFLOW_CONTEXT_MANAGER.get_workflow_run_context(context.workflow_run_id)
parameters_in_workflow_context = workflow_run_context.parameters
for key in parameters:
@@ -23,7 +26,7 @@ async def setup(
parameter = parameters_in_workflow_context[key]
if parameter.workflow_parameter_type == WorkflowParameterType.CREDENTIAL_ID:
parameters[key] = workflow_run_context.values[key]
skyvern_page = await SkyvernPage.create()
skyvern_page = await SkyvernPage.create(browser_session_id=browser_session_id)
run_context = RunContext(
parameters=parameters,
page=skyvern_page,

View File

@@ -71,7 +71,7 @@ class SkyvernPage:
self._record = recorder or (lambda ac: None)
@classmethod
async def _get_or_create_browser_state(cls) -> BrowserState:
async def _get_or_create_browser_state(cls, browser_session_id: str | None = None) -> BrowserState:
context = skyvern_context.current()
if context and context.workflow_run_id and context.organization_id:
workflow_run = await app.DATABASE.get_workflow_run(
@@ -79,12 +79,13 @@ class SkyvernPage:
)
if workflow_run:
browser_state = await app.BROWSER_MANAGER.get_or_create_for_workflow_run(
workflow_run=workflow_run, browser_session_id=None
workflow_run=workflow_run,
browser_session_id=browser_session_id,
)
else:
raise WorkflowRunNotFound(workflow_run_id=context.workflow_run_id)
else:
browser_state = await app.BROWSER_MANAGER.get_or_create_for_script()
browser_state = await app.BROWSER_MANAGER.get_or_create_for_script(browser_session_id=browser_session_id)
return browser_state
@classmethod
@@ -103,10 +104,13 @@ class SkyvernPage:
return browser_state
@classmethod
async def create(cls) -> SkyvernPage:
async def create(
cls,
browser_session_id: str | None = None,
) -> SkyvernPage:
# initialize browser state
# TODO: add workflow_run_id or eventually script_id/script_run_id
browser_state = await cls._get_or_create_browser_state()
browser_state = await cls._get_or_create_browser_state(browser_session_id=browser_session_id)
scraped_page = await scrape_website(
browser_state=browser_state,
url="",