Skip to content

Commit a61d47d

Browse files
author
rocketraccoon
committed
feat(mcp-tools): add hover element tool
1 parent 1be5044 commit a61d47d

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ build
33
testplane-mcp-*.tgz
44
tmp
55
.vscode
6+
.idea

src/tools/hover-element.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
2+
import { ToolDefinition } from "../types.js";
3+
import { contextProvider } from "../context-provider.js";
4+
import { createElementStateResponse, createErrorResponse } from "../responses/index.js";
5+
import { elementSelectorSchema, findElement } from "./utils/element-selector.js";
6+
7+
export const elementHoverSchema = elementSelectorSchema;
8+
9+
const hoverElementCb: ToolCallback<typeof elementHoverSchema> = async args => {
10+
try {
11+
const context = contextProvider.getContext();
12+
const browser = await context.browser.get();
13+
14+
const { element, queryDescription, testplaneCode } = await findElement(browser, args.locator);
15+
16+
await element.moveTo();
17+
18+
console.error(`Successfully hovered element with ${queryDescription}`);
19+
20+
return await createElementStateResponse(element, {
21+
action: `Successfully hovered element found by ${queryDescription}`,
22+
testplaneCode: testplaneCode.startsWith("await")
23+
? `await (${testplaneCode}).moveTo();`
24+
: `await ${testplaneCode}.moveTo();`,
25+
});
26+
} catch (error) {
27+
console.error("Error hover element:", error);
28+
29+
if (error instanceof Error && error.message.includes("Unable to find")) {
30+
return createErrorResponse(
31+
"Element not found. Try using a different query strategy or check if the element exists on the page.",
32+
);
33+
}
34+
35+
return createErrorResponse("Error hover element", error instanceof Error ? error : undefined);
36+
}
37+
};
38+
39+
export const hoverElement: ToolDefinition<typeof elementHoverSchema> = {
40+
name: "hoverElement",
41+
description: "Hover an element on the page.",
42+
schema: elementHoverSchema,
43+
cb: hoverElementCb,
44+
};

src/tools/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ToolDefinition } from "../types.js";
22
import { navigate } from "./navigate.js";
33
import { closeBrowser } from "./close-browser.js";
44
import { clickOnElement } from "./click-on-element.js";
5+
import { hoverElement } from "./hover-element.js";
56
import { typeIntoElement } from "./type-into-element.js";
67
import { takePageSnapshot } from "./take-page-snapshot.js";
78
import { listTabs } from "./list-tabs.js";
@@ -14,6 +15,7 @@ export const tools = [
1415
navigate,
1516
closeBrowser,
1617
clickOnElement,
18+
hoverElement,
1719
typeIntoElement,
1820
takePageSnapshot,
1921
listTabs,

0 commit comments

Comments
 (0)