fix: deepen stale-tab act retry tests + changelog (#30739) (thanks @Sid-Qin)

This commit is contained in:
Peter Steinberger
2026-03-02 13:49:24 +00:00
parent f72f5cf6de
commit 10152fc2dd
2 changed files with 42 additions and 0 deletions

View File

@@ -57,6 +57,7 @@ Docs: https://docs.openclaw.ai
- Browser/Remote CDP ownership checks: skip local-process ownership errors for non-loopback remote CDP profiles when HTTP is reachable but the websocket handshake fails, and surface the remote websocket attach/retry path instead. (#15582) Landed from contributor (#28780) Thanks @stubbi, @bsormagec, @unblockedgamesstudio and @vincentkoc.
- Browser/Profile attach-only override: support `browser.profiles.<name>.attachOnly` (fallback to global `browser.attachOnly`) so loopback proxy profiles can skip local launch/port-ownership checks without forcing attach-only mode for every profile. (#20595) Thanks @unblockedgamesstudio and @vincentkoc.
- Browser/Act request compatibility: accept legacy flattened `action="act"` params (`kind/ref/text/...`) in addition to `request={...}` so browser act calls no longer fail with `request required`. (#15120) Thanks @vincentkoc.
- Browser/Act stale target recovery: retry one Chrome `act` request without `targetId` after `404: tab not found` so stale relay tab IDs can self-heal without requiring an immediate manual `tabs` refresh. (#30739) Thanks @Sid-Qin.
- Browser/Extension relay stale tabs: evict stale cached targets from `/json/list` when extension targets are destroyed/crashed or commands fail with missing target/session errors. (#6175) Thanks @vincentkoc.
- CLI/Browser start timeout: honor `openclaw browser --timeout <ms> start` and stop by removing the fixed 15000ms override so slower Chrome startups can use caller-provided timeouts. (#22412, #23427) Thanks @vincentkoc.
- Browser/CDP startup diagnostics: include Chrome stderr output and a Linux no-sandbox hint in startup timeout errors so failed launches are easier to diagnose. (#29312) Thanks @veast.

View File

@@ -562,4 +562,45 @@ describe("browser tool act stale target recovery", () => {
);
expect(result?.details).toMatchObject({ ok: true });
});
it("does not retry when targetId is missing after trim", async () => {
browserActionsMocks.browserAct.mockRejectedValueOnce(new Error("404: tab not found"));
browserClientMocks.browserTabs.mockResolvedValueOnce([
{ targetId: "new-tab", title: "New Tab", url: "https://example.com" },
]);
const tool = createBrowserTool();
await expect(
tool.execute?.("call-2", {
action: "act",
profile: "chrome",
request: {
action: "click",
targetId: " ",
ref: "btn-1",
},
}),
).rejects.toThrow("stale targetId");
expect(browserActionsMocks.browserAct).toHaveBeenCalledTimes(1);
});
it("does not apply stale-tab retry for non-chrome profiles", async () => {
browserActionsMocks.browserAct.mockRejectedValueOnce(new Error("404: tab not found"));
const tool = createBrowserTool();
await expect(
tool.execute?.("call-3", {
action: "act",
profile: "openclaw",
request: {
action: "click",
targetId: "stale-tab",
ref: "btn-1",
},
}),
).rejects.toThrow("404: tab not found");
expect(browserActionsMocks.browserAct).toHaveBeenCalledTimes(1);
});
});