From 5cc9ce18dd6b3d4854ad4bb29ff3ea1499a2f01e Mon Sep 17 00:00:00 2001 From: OhYee Date: Wed, 11 Mar 2026 12:00:42 +0800 Subject: [PATCH 1/6] fix(browser): change default wait_until from load to domcontentloaded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated the default wait_until parameter from 'load' to 'domcontentloaded' for browser navigation functions to improve performance and reduce waiting time for full page loads when not necessary. This change affects browser_navigate_back and browser_go_forward functions in the BrowserToolSet class to use 'domcontentloaded' as the default waiting strategy instead of 'load'. 将默认的 wait_until 参数从 'load' 更改为 'domcontentloaded' 更新了浏览器导航函数的默认 wait_until 参数,从 'load' 改为 'domcontentloaded' 以提高性能并减少不必要的完整页面加载等待时间。 此更改影响 BrowserToolSet 类中的 browser_navigate_back 和 browser_go_forward 函数,使用 'domcontentloaded' 作为默认等待策略 而不是 'load'。 fix #66 Change-Id: Ib5d4120869bfea9ea8a411b16958bf9359572b9f Signed-off-by: OhYee --- agentrun/integration/builtin/sandbox.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/agentrun/integration/builtin/sandbox.py b/agentrun/integration/builtin/sandbox.py index fc0b328..24bce64 100644 --- a/agentrun/integration/builtin/sandbox.py +++ b/agentrun/integration/builtin/sandbox.py @@ -751,20 +751,26 @@ def _get_playwright(self, sb: BrowserSandbox) -> "BrowserPlaywrightSync": Automatically recreates the connection when the thread that created it has exited, because Playwright's internal greenlet is bound to the thread that created it. """ - if self._playwright_sync is not None and self._playwright_thread is not None: + if ( + self._playwright_sync is not None + and self._playwright_thread is not None + ): current_thread = threading.current_thread() creator_thread = self._playwright_thread - if not creator_thread.is_alive() or current_thread is not creator_thread: + if ( + not creator_thread.is_alive() + or current_thread is not creator_thread + ): if not creator_thread.is_alive(): logger.debug( - "Playwright creating thread (id=%s) has exited, recreating" - " connection", + "Playwright creating thread (id=%s) has exited," + " recreating connection", creator_thread.ident, ) else: logger.debug( - "Playwright creating thread (id=%s) differs from current" - " thread (id=%s), recreating connection", + "Playwright creating thread (id=%s) differs from" + " current thread (id=%s), recreating connection", creator_thread.ident, current_thread.ident, ) @@ -970,7 +976,7 @@ def goto(self, url: str) -> Dict[str, Any]: ) def browser_navigate_back( self, - wait_until: str = "load", + wait_until: str = "domcontentloaded", timeout: Optional[float] = None, ) -> Dict[str, Any]: """返回上一页 / Go back to previous page""" @@ -996,7 +1002,7 @@ def inner(sb: Sandbox): ) def browser_go_forward( self, - wait_until: str = "load", + wait_until: str = "domcontentloaded", timeout: Optional[float] = None, ) -> Dict[str, Any]: """前进到下一页 / Go forward to next page""" From 1856f4ef309df75c914e6220f709119fa4f5d5e4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:22:43 +0000 Subject: [PATCH 2/6] Initial plan From 1c6e080ce7a61c6ba6be4e02218f4c241c0dda82 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:23:26 +0000 Subject: [PATCH 3/6] Initial plan From 7dd859752dad5b4bc18b483c150452cf99ef7177 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:34:24 +0000 Subject: [PATCH 4/6] fix(mypy): annotate input_data as Any and add wait_until default tests Co-authored-by: OhYee <13498329+OhYee@users.noreply.github.com> --- .../test_browser_toolset_error_handling.py | 30 +++++++++++++++++++ .../test_langchain_agui_integration.py | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/unittests/integration/test_browser_toolset_error_handling.py b/tests/unittests/integration/test_browser_toolset_error_handling.py index a0e3924..93ba922 100644 --- a/tests/unittests/integration/test_browser_toolset_error_handling.py +++ b/tests/unittests/integration/test_browser_toolset_error_handling.py @@ -520,3 +520,33 @@ def callback(sb): assert "error" in result toolset._reset_playwright.assert_not_called() assert toolset.sandbox is original_sandbox + + +class TestBrowserNavigationDefaults: + """测试浏览器导航函数的默认参数 / Tests for browser navigation function defaults""" + + def test_browser_navigate_back_default_wait_until_is_domcontentloaded( + self, + ): + """测试 browser_navigate_back 的 wait_until 默认值为 domcontentloaded""" + default = ( + BrowserToolSet.browser_navigate_back.args_schema.model_fields[ + "wait_until" + ].default + ) + assert default == "domcontentloaded", ( + f"Expected 'domcontentloaded' but got '{default}'" + ) + + def test_browser_go_forward_default_wait_until_is_domcontentloaded( + self, + ): + """测试 browser_go_forward 的 wait_until 默认值为 domcontentloaded""" + default = ( + BrowserToolSet.browser_go_forward.args_schema.model_fields[ + "wait_until" + ].default + ) + assert default == "domcontentloaded", ( + f"Expected 'domcontentloaded' but got '{default}'" + ) diff --git a/tests/unittests/integration/test_langchain_agui_integration.py b/tests/unittests/integration/test_langchain_agui_integration.py index 2e88c16..0f77b50 100644 --- a/tests/unittests/integration/test_langchain_agui_integration.py +++ b/tests/unittests/integration/test_langchain_agui_integration.py @@ -639,7 +639,7 @@ async def invoke_agent(request: AgentRequest): tools=tools, ) - input_data = { + input_data: Any = { "messages": [{ "role": "user", "content": ( From 9bdfdcefbec466e9d87348718291ea2a16229bef Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:36:16 +0000 Subject: [PATCH 5/6] test(browser): add tests locking in wait_until defaults for navigate_back/go_forward Co-authored-by: OhYee <13498329+OhYee@users.noreply.github.com> --- .../test_browser_toolset_error_handling.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unittests/integration/test_browser_toolset_error_handling.py b/tests/unittests/integration/test_browser_toolset_error_handling.py index a0e3924..16079c9 100644 --- a/tests/unittests/integration/test_browser_toolset_error_handling.py +++ b/tests/unittests/integration/test_browser_toolset_error_handling.py @@ -520,3 +520,27 @@ def callback(sb): assert "error" in result toolset._reset_playwright.assert_not_called() assert toolset.sandbox is original_sandbox + + +class TestBrowserNavigationDefaults: + """测试导航方法的默认参数 / Tests for default parameters of navigation methods""" + + def test_browser_navigate_back_default_wait_until(self): + """browser_navigate_back 的默认 wait_until 为 domcontentloaded""" + fields = BrowserToolSet.browser_navigate_back.args_schema.model_fields + assert fields["wait_until"].default == "domcontentloaded" + + def test_browser_go_forward_default_wait_until(self): + """browser_go_forward 的默认 wait_until 为 domcontentloaded""" + fields = BrowserToolSet.browser_go_forward.args_schema.model_fields + assert fields["wait_until"].default == "domcontentloaded" + + def test_browser_navigate_back_default_timeout_is_none(self): + """browser_navigate_back 的默认 timeout 为 None""" + fields = BrowserToolSet.browser_navigate_back.args_schema.model_fields + assert fields["timeout"].default is None + + def test_browser_go_forward_default_timeout_is_none(self): + """browser_go_forward 的默认 timeout 为 None""" + fields = BrowserToolSet.browser_go_forward.args_schema.model_fields + assert fields["timeout"].default is None From 7f603bb2b14e1a94b1410fd2a9e8236fda1dbf2c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:00:07 +0000 Subject: [PATCH 6/6] fix: resolve merge conflict with fix/browser-navigate-wait-until Co-authored-by: OhYee <13498329+OhYee@users.noreply.github.com> --- .../test_browser_toolset_error_handling.py | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/tests/unittests/integration/test_browser_toolset_error_handling.py b/tests/unittests/integration/test_browser_toolset_error_handling.py index 93ba922..16079c9 100644 --- a/tests/unittests/integration/test_browser_toolset_error_handling.py +++ b/tests/unittests/integration/test_browser_toolset_error_handling.py @@ -523,30 +523,24 @@ def callback(sb): class TestBrowserNavigationDefaults: - """测试浏览器导航函数的默认参数 / Tests for browser navigation function defaults""" - - def test_browser_navigate_back_default_wait_until_is_domcontentloaded( - self, - ): - """测试 browser_navigate_back 的 wait_until 默认值为 domcontentloaded""" - default = ( - BrowserToolSet.browser_navigate_back.args_schema.model_fields[ - "wait_until" - ].default - ) - assert default == "domcontentloaded", ( - f"Expected 'domcontentloaded' but got '{default}'" - ) - - def test_browser_go_forward_default_wait_until_is_domcontentloaded( - self, - ): - """测试 browser_go_forward 的 wait_until 默认值为 domcontentloaded""" - default = ( - BrowserToolSet.browser_go_forward.args_schema.model_fields[ - "wait_until" - ].default - ) - assert default == "domcontentloaded", ( - f"Expected 'domcontentloaded' but got '{default}'" - ) + """测试导航方法的默认参数 / Tests for default parameters of navigation methods""" + + def test_browser_navigate_back_default_wait_until(self): + """browser_navigate_back 的默认 wait_until 为 domcontentloaded""" + fields = BrowserToolSet.browser_navigate_back.args_schema.model_fields + assert fields["wait_until"].default == "domcontentloaded" + + def test_browser_go_forward_default_wait_until(self): + """browser_go_forward 的默认 wait_until 为 domcontentloaded""" + fields = BrowserToolSet.browser_go_forward.args_schema.model_fields + assert fields["wait_until"].default == "domcontentloaded" + + def test_browser_navigate_back_default_timeout_is_none(self): + """browser_navigate_back 的默认 timeout 为 None""" + fields = BrowserToolSet.browser_navigate_back.args_schema.model_fields + assert fields["timeout"].default is None + + def test_browser_go_forward_default_timeout_is_none(self): + """browser_go_forward 的默认 timeout 为 None""" + fields = BrowserToolSet.browser_go_forward.args_schema.model_fields + assert fields["timeout"].default is None