본문으로 건너뛰기
cccskills
무료GitHub에 공개

visual-browse

Coordinate-level browser control for UI that snapshots, refs, and locators cannot target - canvas apps, extension popups, OS-drawn dialogs, custom drag surfaces. Read this when a DOM-targeted action fails twice, when the next decision depends on rendered pixels, or when CUA clicks land on the wrong element.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md5.1 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Visual Browse

createCua(page) drives the page by viewport coordinates when DOM targeting cannot. It is rung 2 of the ladder below, not a last resort you ask permission to reach.

Escalation ladder

TWO IDENTICAL FAILURES ON THE SAME TARGET MEAN CLIMB, NOT RETRY. The failure itself selects the next rung — never pause to ask which one.

RungUseAdvance when
1. page.snapshot() + page.locator(ref)Everything with a usable refRef is absent, stale, obscured, or the click lands on the wrong node twice
2. createCua(page) coordinatesCanvas, extension popups, custom controls, drag surfacesThe click misses, or the screenshot and the coordinates disagree
3. Pin the viewport, then retry rung 2Coordinate drift: window resized, DPI scaled, or the tab was created at a different sizeCoordinates land correctly but the widget still refuses input
4. createCaptcha(page)A challenge widget is what blocks progressThe widget is solved but the flow still stalls
5. Environment diagnosisBrowser-level failure (entitlements, extension service worker, FIDO)Logs name a cause outside the page

RUNG 5 ENDS IN A WRITTEN DIAGNOSIS, NEVER A CODE CHANGE. When the browser log names the cause (service-worker failure, missing entitlement, FIDO unavailable), stop retrying and report it. Automation code cannot fix a browser-process problem.

Return to refs and locators as soon as DOM targeting works again. Coordinates are the expensive path.

Pin the viewport before trusting coordinates

CUA acts in viewport pixels. When the render surface and the coordinate space disagree, every coordinate is wrong by the same constant offset and retrying repeats the miss. Pin both to one box:

await page._sendToTarget("Emulation.setDeviceMetricsOverride", {
  width: 1440, height: 900, deviceScaleFactor: 1, mobile: false,
  screenWidth: 1440, screenHeight: 900,
  viewport: { x: 0, y: 0, width: 1440, height: 900, scale: 1 },
});
const size = await page.refreshViewportSize();   // -> { width: 1440, height: 900 }

Pin every page you act on, including tabs you did not open, then take a fresh screenshot — coordinates read off an unpinned screenshot are stale.

Pin rather than retry when: the click reports success but nothing changes; the same offset is wrong on every target; screenshot dimensions disagree with the coordinates you computed.

API

import { createCua } from "omowright";

const cua = createCua(page);
await cua.click({ x, y, button?, keypress? });        // keypress: modifiers held during click
await cua.doubleClick({ x, y, keypress? });
await cua.drag({ path: [{ x, y }, ...], keys? });     // mousedown at first point, move through path, mouseup
await cua.move({ x, y, keys? });
await cua.scroll({ x, y, scrollX, scrollY, keypress? });
await cua.type({ text });
await cua.keypress({ keys: ["ControlOrMeta", "a"] }); // ControlOrMeta = Meta on macOS, Control elsewhere
const base64Png = await cua.getVisibleScreenshot();

Modifiers: Alt, Control, ControlOrMeta, Meta, Shift. Aliases: Cmd, Command, Ctrl, Option. The CUA instance is bound to the page it was created from — focus or attach the right tab first.

Look, act, verify

Look before acting when coordinates are unknown, and VERIFY AFTER EVERY PAGE-CHANGING ACTION — AN UNVERIFIED CUA ACTION HAS NOT HAPPENED. Fresh screenshot for visual state, fresh snapshot for DOM state.

  • cua.getVisibleScreenshot() - base64 PNG.
  • page.screenshot({ path }) - file; cite the path when there is no display().
  • page.annotatedScreenshot() - numbered boxes over interactive elements.
  • Eval/REPL kernel: display(Buffer.from(await cua.getVisibleScreenshot(), "base64")).

A popup, modal, or cookie banner overlaying the target is cleared first — everything behind it is unreachable. On layered canvas and editor surfaces, prefer coarse sidebar and toolbar controls over precise clicks on stacked objects.

Surfaces that only CUA reaches

Browser chrome and OS-drawn UI have no DOM, so rung 1 is skipped entirely:

  • Extension popups (password managers, wallets): click the toolbar icon by coordinate, then act inside the popup by coordinate.
  • Platform credential dialogs (passkey, Touch ID, OS password prompts): drawn by the OS. If a click cannot satisfy them, that is rung 5 — read the browser log rather than clicking harder.
  • Native select popups and file pickers: prefer locator.selectOption() / locator.setInputFiles(); use coordinates only for custom-rendered controls.

Values that leave the page through the system clipboard (a one-time code copied by an extension) are read back with pbpaste on macOS and VALIDATED BY SHAPE BEFORE USE — an unvalidated read silently carries whatever was there before.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Push browser tab and download lifecycle events plus manager-owned background tabs. Read this when an agent needs lifecycle notifications or a temporary tab without polling.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

captcha

무료

Interact with challenge widgets in an authorized automation flow using checkbox clicks, slider drags, text OCR, and image-grid input. Verify completion with an application-specific condition.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

chrome

무료

Read this when you need Chrome MV3-shaped APIs — bookmarks, tabs, windows, history, downloads, or top sites — in standalone OmOWright.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

Use when a user-driven CloakBrowser profile needs MV3 Chrome writes/events through the native messaging bridge.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

network

무료

Read the network instead of the DOM. Snoop JSON API responses, wait for a request instead of sleeping, collect items while scrolling, record a QA flight trace (jsonl, HAR, screenshots), and intercept requests with routes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

omowright

무료

The default code-driven browser path for interactive browsing work: drives any browser from code with token-efficient a11y snapshots (57% smaller via compactSnapshot), ref-based clicks, coordinate control (CUA), viewport pinning, CAPTCHA solving (reCAPTCHA, Turnstile, hCaptcha, slider, OCR), Chrome MV3 APIs (tabs/bookmarks/history/downloads/topSites), network snoop (read API JSON instead of DOM), flight-recorder trace (jsonl + HAR + screenshots), OOPIF-aware snapshots, dialog policy, human handoff for login/OTP, device emulation, request routes, stealth via CloakBrowser as the default owned engine with zero exposed CDP ports, and an attached engine that drives the user's own signed-in browser through BrowserSkill (connectBrowserSkill, bskSnapshot, one-click onboarding via bskOnboard). MUST USE for interactive browser work: scraping, blocked/WAF/JS-rendered pages, logins, the user's logged-in sites and open tabs, extension popups, form filling, screenshots, web QA, CAPTCHAs. The ulw-research browsing lane runs on ultimate-browsing, not this skill.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

code-yeongyu의 스킬 모두 보기

이 스킬의 문제 신고