Validate selector or locator
validate-selectorValidates CSS, Playwright selectors and locators on a live page: checks match counts (actions need exactly 1), shows sample matches and returns a sturdier verified locator.
Instructions
Check a CSS selector, Playwright selector or locator (getByRole/getByTestId…, .first(), .filter(), frameLocator() for iframes) on a live page: validity, match count (actions need exactly 1), sample matches and a sturdier verified locator for each. Counts once after load: use waitFor or actions for late elements. Accepts storageState/headers/actions.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"url": "<url>",
"selector": "<selector>"
},
"name": "validate-selector"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| har | No | ||
| url | Yes | Full URL of the live page to test against (http/https) | |
| device | No | Playwright device preset, e.g. 'iPhone 15', 'Pixel 7', 'iPad Pro 11' (viewport, user agent, touch) | |
| routes | No | Network mocks, first match wins: json/body/status fulfil, abort fails, delayMs alone slows the real request | |
| actions | No | Steps run in order after load to reach a state (modal, step 3). One call = one fresh browser, so include the login steps; end with a 'wait' on what the state shows | |
| browser | No | Engine (default chromium) | |
| channel | No | Branded Chromium to launch instead of the bundled one (must be installed) | |
| connect | No | Remote browser: Playwright ws(s):// endpoint or 'cdp:<url>'; keys as {{env:E2E_…}} | |
| headers | No | Extra HTTP headers, e.g. Authorization | |
| offline | No | Go offline once the page has loaded, before steps run, to check offline and retry states | |
| waitFor | No | Wait for this selector to be visible first (for elements that render late) | |
| selector | Yes | Selector or locator, e.g. getByRole('button', { name: 'Save' }) | |
| viewport | No | ||
| timeoutMs | No | Overall limit in ms (default 45000) | |
| blockWrites | No | Abort POST/PUT/PATCH/DELETE requests no mock answers, so steps cannot change real data (default: PW_MCP_BLOCK_WRITES) | |
| projectRoot | No | Project whose Playwright launches the browser (default: server root) | |
| storageState | No | Logged-in session: storageState JSON inside the project, e.g. playwright/.auth/user.json | |
| blockResources | No | Skip these requests for speed and privacy: image, media, font, stylesheet, trackers (known analytics/ad hosts); default PW_MCP_BLOCK_RESOURCES | |
| actionTimeoutMs | No | How long each action waits for its element (default 10000); keep timeoutMs above the total |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ok | Yes | false when the call failed (see error) or the tests it ran failed | |
| url | No | ||
| error | No | ||
| valid | No | validate-selector: the selector parsed and ran | |
| locator | No | a verified unique locator for the first match | |
| matches | No | elements matched; actions need exactly 1 | |
| httpStatus | No | the page's HTTP status |