Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Release the mouse button
.claude/skills/testdriverai-testdriver-mouse-up/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-22 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 25% | 0% |
<!-- Generated from mouse-up.mdx. DO NOT EDIT. -->
The mouseUp() method releases the mouse button, completing a drag operation or custom mouse gesture that was started with mouseDown(). You can call it without parameters to release at the current mouse position.
javascript// Release mouse button at current position await ai.mouseUp();
None. The mouse button is released at the current cursor position.
Returns a Promise<void> that resolves when the mouse button is released.
javascript// Start dragging await ai.mouseDown('file to drag'); // Move to drop location await ai.hover('target folder'); // Complete the drop await ai.mouseUp();
javascriptimport { test } from 'vitest'; import { vscode } from '@testdriver/sdk'; test('selects range of files', async () => { const { ai } = await vscode(); // Click first file await ai.click('first-file.js in explorer'); // Hold shift and click last file await ai.pressKeys('Shift'); await ai.mouseDown('last-file.js in explorer'); await ai.mouseUp(); // Verify multiple files selected const selectedCount = await ai.find('status bar showing file count'); expect(selectedCount.text).toContain('5 files'); });
javascripttest('draws a shape', async () => { const { ai } = await chrome('https://drawing-app.example.com'); // Select pencil tool await ai.click('pencil tool'); // Draw a line await ai.mouseDown('canvas near top-left'); await ai.hover('canvas center'); await ai.hover('canvas bottom-right'); await ai.mouseUp(); // Verify drawing exists const strokes = await ai.exec('canvas.getContext("2d").getImageData(0,0,100,100)'); expect(strokes).toBeTruthy(); });
javascripttest('resizes editor panel', async () => { const { ai } = await vscode(); // Grab the divider await ai.mouseDown('panel resize divider'); // Drag to new position await ai.hover('position 400 pixels from left'); // Release to complete resize await ai.mouseUp(); // Verify new panel size const panel = await ai.find('editor panel'); expect(panel.width).toBeGreaterThan(350); });
javascriptimport { test } from 'vitest'; import { chrome } from '@testdriver/sdk'; test('reorders tasks in list', async () => { const { ai } = await chrome('https://todo-app.example.com'); // Start dragging first task await ai.mouseDown('drag handle on first task'); // Move down to third position await ai.hover('third task position'); // Drop the task await ai.mouseUp(); // Verify new order const thirdTask = await ai.find('third task in list'); expect(thirdTask.text).toContain('Original first task'); });
javascripttest('selects text with mouse drag', async () => { const { ai } = await chrome('https://document.example.com'); // Start selection at beginning of word await ai.mouseDown('start of "TestDriver" word'); // Drag to end of word await ai.hover('end of "TestDriver" word'); // Complete selection await ai.mouseUp(); // Verify selection const selection = await ai.exec('window.getSelection().toString()'); expect(selection).toBe('TestDriver'); });
mouseUp() must be preceded by mouseDown() to have an effectclick() instead of mouseDown/mouseUp pairmouseDown() - Press mouse button without releasinghover() - Move mouse to elementclick() - Complete click (mouseDown + mouseUp)doubleClick() - Double-click on elementrightClick() - Right-click for context menu| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | fail→pass | 6,614 | 3,697 | -44% | 1 | 1 | 0% | 1,162 | 1,676 | +44% | 0 | 0 | — |
case-01 | fail→pass | 8,765 | 33,253 | +279% | 1 | 1 | 0% | 1,459 | 1,677 | +15% | 0 | 0 | — |
case-02 | fail→pass | 10,338 | 3,765 | -64% | 1 | 1 | 0% | 2,001 | 1,904 | -5% | 0 | 0 | — |
case-03 | pass→pass | 8,480 | 3,498 | -59% | 1 | 1 | 0% | 1,531 | 1,801 | +18% | 0 | 0 | — |
case-04 | fail→pass | 7,875 | 3,667 | -53% | 1 | 1 | 0% | 1,374 | 1,801 | +31% | 0 | 0 | — |
case-05 | fail→pass | 8,255 | 3,457 | -58% | 1 | 1 | 0% | 1,416 | 1,775 | +25% | 0 | 0 | — |
case-06 | fail→pass | 10,567 | 3,077 | -71% | 1 | 1 | 0% | 1,763 | 1,751 | -1% | 0 | 0 | — |
case-07 | fail→pass | 9,399 | 2,435 | -74% | 1 | 1 | 0% | 1,570 | 1,580 | +1% | 0 | 0 | — |
case-08 | pass→pass | 8,106 | 3,134 | -61% | 1 | 1 | 0% | 1,249 | 1,633 | +31% | 0 | 0 | — |
case-09 | pass→pass | 9,182 | 3,498 | -62% | 1 | 1 | 0% | 1,428 | 1,665 | +17% | 0 | 0 | — |
case-10 | pass→pass | 4,724 | 1,736 | -63% | 1 | 1 | 0% | 706 | 1,396 | +98% | 0 | 0 | — |
case-11 | pass→pass | 7,050 | 3,382 | -52% | 1 | 1 | 0% | 1,174 | 1,738 | +48% | 0 | 0 | — |
case-12 | pass→pass | 8,947 | 3,359 | -62% | 1 | 1 | 0% | 1,430 | 1,692 | +18% | 0 | 0 | — |
case-13 | pass→pass | 9,476 | 2,220 | -77% | 1 | 1 | 0% | 1,402 | 1,529 | +9% | 0 | 0 | — |
case-14 | fail→pass | 10,168 | 4,452 | -56% | 1 | 1 | 0% | 1,687 | 1,923 | +14% | 0 | 0 | — |
case-15 | pass→pass | 6,592 | 6,089 | -8% | 1 | 1 | 0% | 1,014 | 2,072 | +104% | 0 | 0 | — |
case-16 | fail→pass | 9,935 | 4,689 | -53% | 1 | 1 | 0% | 1,674 | 2,000 | +19% | 0 | 0 | — |
case-17 | fail→pass | 12,179 | 6,567 | -46% | 1 | 1 | 0% | 2,130 | 2,364 | +11% | 0 | 0 | — |
case-18 | pass→pass | 10,180 | 4,770 | -53% | 1 | 1 | 0% | 1,599 | 1,827 | +14% | 0 | 0 | — |
case-19 | pass→pass | 3,636 | 2,741 | -25% | 1 | 1 | 0% | 519 | 1,615 | +211% | 0 | 0 | — |
case-20 | pass→pass | 7,476 | 8,346 | +12% | 1 | 1 | 0% | 1,295 | 2,297 | +77% | 0 | 0 | — |
case-21 | pass→pass | 8,004 | 6,449 | -19% | 1 | 1 | 0% | 1,342 | 2,267 | +69% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.