assert_not_visible
Confirm that an element with specified text is not visible on screen. Validate hidden or absent UI components.
Instructions
Vérifie qu'un élément contenant le texte donné n'est PAS visible à l'écran.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Texte qui ne doit PAS être à l'écran |
Implementation Reference
- src/tools/assert.ts:62-105 (handler)The main handler implementation for 'assert_not_visible'. It registers the tool on the MCP server, resolves the device, fetches the UI tree (iOS via WDA or Android via ADB), and uses matchElementByText to check if the given text is NOT visible. Returns PASS if not found, FAIL if found.
export function registerAssertNotVisible(server: McpServer): void { server.tool( "assert_not_visible", "Vérifie qu'un élément contenant le texte donné n'est PAS visible à l'écran.", { text: z.string().describe("Texte qui ne doit PAS être à l'écran"), }, async ({ text }) => { const result = await resolveDevice(); if ("error" in result) return { content: [{ type: "text", text: result.error }], isError: true }; const dev = result.device; if (dev.platform === "ios") { const wda = await ensureWdaRunning(dev); if (!wda.ready) return { content: [{ type: "text", text: wda.message ?? "WDA indisponible." }], isError: true }; } try { const elements = dev.platform === "ios" ? await iosGetUiTree() : await androidGetUiTree(); const found = matchElementByText(elements, text); if (!found) { const passMsg = `PASS — "${text}" n'est pas visible (attendu).`; logAction("assert_not_visible", passMsg, false, dev.platform, dev.id, dev.name); return { content: [{ type: "text", text: passMsg }] }; } const displayText = found.label || found.name || found.value || ""; const failMsg = `FAIL — "${text}" est visible : ${found.type} "${displayText}" à (${found.x},${found.y}). Il ne devrait pas l'être.`; logAction("assert_not_visible", failMsg, true, dev.platform, dev.id, dev.name); return { content: [{ type: "text", text: failMsg }], isError: true, }; } catch (err) { const msg = err instanceof Error ? err.message : String(err); return { content: [{ type: "text", text: `Erreur assert: ${msg}` }], isError: true }; } } ); } - src/tools/assert.ts:62-67 (schema)The tool schema definition for 'assert_not_visible': accepts a required 'text' string parameter describing the text that should not be on screen.
export function registerAssertNotVisible(server: McpServer): void { server.tool( "assert_not_visible", "Vérifie qu'un élément contenant le texte donné n'est PAS visible à l'écran.", { text: z.string().describe("Texte qui ne doit PAS être à l'écran"), - src/index.ts:18-45 (registration)Import of registerAssertNotVisible from ./tools/assert.ts, and call to registerAssertNotVisible(server) at line 45 to register this tool on the MCP server.
import { registerAssertVisible, registerAssertNotVisible } from "./tools/assert.js"; import { registerDeepLink } from "./tools/deep-link.js"; import { registerVideoRecord } from "./tools/video-record.js"; import { registerShake, registerRotate } from "./tools/device-actions.js"; import { registerAccessibilityAudit } from "./tools/accessibility-audit.js"; import { registerTestReport } from "./tools/test-report.js"; import { registerVisualDiff } from "./tools/visual-diff.js"; import { registerMultiDevice } from "./tools/multi-device.js"; const server = new McpServer({ name: "phantom", version: "2.3.0", }); // Device management registerListDevices(server); registerSetDevice(server); registerPrepareDevice(server); // Observation registerScreenshot(server); registerGetUiTree(server); registerWaitForElement(server); registerScrollUntilVisible(server); // Assertions registerAssertVisible(server); registerAssertNotVisible(server); - src/utils/auto-report.ts:65-65 (helper)The 'assert_not_visible' tool is listed in ALWAYS_SCREENSHOT_TOOLS set, ensuring a screenshot is always captured when this tool is used for auto-reporting.
const ALWAYS_SCREENSHOT_TOOLS = new Set(["assert_visible", "assert_not_visible", "accessibility_audit", "launch_app"]);