storybook-addon-playwright 7.2.2 → 7.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/server/routes.js +10 -10
- package/dist/api/server/routes.js.map +1 -1
- package/dist/api/server/routes.mjs +10 -10
- package/dist/api/server/routes.mjs.map +1 -1
- package/dist/get-screenshots.js +4 -4
- package/dist/get-screenshots.js.map +1 -1
- package/dist/get-screenshots.mjs +4 -4
- package/dist/get-screenshots.mjs.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/register.js +9 -9
- package/dist/register.js.map +1 -1
- package/dist/register.mjs +9 -9
- package/dist/register.mjs.map +1 -1
- package/dist/run-image-diff.js +4 -4
- package/dist/run-image-diff.js.map +1 -1
- package/dist/run-image-diff.mjs +4 -4
- package/dist/run-image-diff.mjs.map +1 -1
- package/dist/to-match-screenshots.js +4 -4
- package/dist/to-match-screenshots.js.map +1 -1
- package/dist/to-match-screenshots.mjs +4 -4
- package/dist/to-match-screenshots.mjs.map +1 -1
- package/dist/trpc/router.js +10 -10
- package/dist/trpc/router.js.map +1 -1
- package/dist/trpc/router.mjs +10 -10
- package/dist/trpc/router.mjs.map +1 -1
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/server/utils/load-story-data.ts","../src/api/server/utils/get-story-playwright-data.ts","../src/api/server/utils/get-story-playwright-file-info.ts","../src/api/server/utils/get-screenshot-paths.ts","../src/page-extra/clear-input.ts","../src/page-extra/utils/get-boundingBox.ts","../src/page-extra/utils/get-point-by-direction.ts","../src/page-extra/drag-drop-selector.ts","../src/page-extra/utils/dispatch-touch-event.ts","../src/page-extra/touch-from-to.ts","../src/page-extra/extend-page.ts","../src/page-extra/mouse-down-on-selector.ts","../src/page-extra/mouse-from-to.ts","../src/page-extra/mouse-move-to-selector.ts","../src/page-extra/scroll-selector.ts","../src/page-extra/selector-mouse-wheel.ts","../src/page-extra/set-selector-size.ts","../src/page-extra/touch-cancel.ts","../src/page-extra/touch-end.ts","../src/page-extra/touch-move.ts","../src/page-extra/touch-start.ts","../src/utils/storybook-props-to-querystring.ts","../src/utils/args-to-querystring.ts","../src/utils/globals-to-querystring.ts","../src/utils/knobs-to-querystring.ts","../src/utils/construct-story-url.ts","../src/utils/get-schema.ts","../src/utils/get-action-args.ts","../src/utils/get-screenshot-prop.ts","../src/utils/get-screenshot-globals.ts","../src/utils/get-screenshot-args.ts","../src/utils/valid-action.ts","../src/api/server/configs.ts","../src/api/server/data/action-schema.json","../src/api/services/get-actions-schema.ts","../src/api/server/utils/execute-action.ts","../src/api/server/utils/install-mouse-helper.ts","../src/api/services/utils/is-interactive-action.ts","../src/api/services/utils/release-modifier-Key.ts","../src/api/services/utils/should-take-screenshot.ts","../src/api/services/utils/wait-for-story-rendered.ts","../src/api/services/make-screenshot.ts","../src/api/services/utils/set-story-screenshot-options.ts","../src/utils/get-playwright-config-files.ts","../src/get-screenshots.ts"],"names":["loadStoryData","storyDataPath","storyId","create","resolve","reject","fs","readFile","err","data","loadedData","getStoryPlaywrightData","fileName","playWrightData","storiesData","storyData","story","getStoryPlaywrightFileInfo","storyRelativeFilePath","absolutePath","k","parsedFileName","name","getScreenshotPaths","fileInfo","screenshotIdentifier","kebabCase","path","diffDir","filePath","clearInput","selector","options","blur","timeout","e","getBoundingBox","page","elm","box","getPointByDirection","defaultVal","direction","providedPoint","dragDropSelector","to","mouseDownRelativeToSelector","steps","skipMouseUp","mouseDownRelativeX","mouseDownRelativeY","mouseMoveX","mouseMoveY","dispatchTouchEvent","playWright","type","screen","client","el","rect","touchOpt","touchObj","touchEvent","touchFromTo","pageFrom","pageTo","clientFrom","clientTo","screenFrom","screenTo","extendPage","thisPage","scrollSelector","mouseDownOnSelector","mouseMoveToSelector","setSelectorSize","selectorMouseWheel","touchCancel","touchMove","touchEnd","touchStart","mouseFromTo","point","from","scrollProperty","points","eventInitDict","opt","event","width","height","storybookPropsToQuerystring","props","buildArgsParam","argsToQuerystring","args","globalsToQuerystring","globals","knobsToQuerystring","propQuery","prop","propVal","constructStoryUrl","endpoint","id","normalized","normalize","storyUrl","argsQuery","globalsQuery","propsQuery","getActionSchema","schema","key","extendedKey","get","getActionArgs","action","actionSchema","parameters","arr","actionName","isRequired","val","getScreenshotProp","candidates","i","value","getScreenshotGlobals","getScreenshotArgs","validAction","requiredParams","requiredParam","isValidAction","getConfigs","action_schema_default","getActionsSchema","customSchema","executeAction","actionNames","pageObj","pageObjects","nextPageObj","installMouseHelper","waitActions","isInteractiveAction","releaseModifierKey","actionSets","modifierKeys","actionSet","x","shouldTakeScreenshot","actions","currentPosition","enabled","nextAction","storyRenderedReadyPredicate","targetStoryId","storyRenders","selectedRender","render","settleStoryRender","waitForAnimationFrame","fonts","waitForStoryRendered","takeScreenshot","configs","handler","requestData","makeScreenshot","convertToBase64","defaultScreenshotOptions","browserOptions","url","imageInfos","screenshotOptionAction","lastAction","takeScreenshotAll","a","filterActions","elementHandle","isTakeElementScreenshotAtLast","buffer","format","screenshotsBuffers","joinImage","baseBuffer","overlays","_","index","sharp","setStoryScreenshotOptions","screenshot","getStorybookEndpoint","toPosixPath","getLookupPattern","configPath","normalizeStoryImportPath","importPath","toStoryPath","cwd","toPlaywrightJsonPath","storyPath","parsed","extractImportPaths","indexData","entries","result","entry","isHttpUrl","loadStorybookIndex","storybookEndpoint","indexUrl","response","endpointPath","fileURLToPath","indexPath","content","getStorybookDerivedFiles","importPaths","files","normalizedImportPath","playwrightFilePath","relativeFilePath","getPlaywrightConfigFiles","lookupPattern","glob","storybookDerivedFiles","getScreenshots","onScreenshotReady","playwrightJsonPath","requestId","results","screenShotData","screenShot","paths"],"mappings":"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","file":"get-screenshots.mjs","sourcesContent":["import type { PlaywrightData } from '../../../typings';\nimport fs from 'node:fs';\nimport { readFile } from 'jsonfile';\n\nexport async function loadStoryData(\n storyDataPath: string,\n storyId: string,\n create = true,\n): Promise<PlaywrightData | undefined> {\n return new Promise((resolve, reject) => {\n if (!fs.existsSync(storyDataPath)) {\n if (!create) {\n resolve(undefined);\n return;\n }\n\n if (storyId === '*') {\n resolve({ stories: {} });\n } else {\n resolve({ stories: { [storyId]: {} } });\n }\n return;\n }\n\n readFile(storyDataPath, (err, data?: PlaywrightData) => {\n if (err) {\n reject(err);\n return;\n }\n\n const loadedData: PlaywrightData = data || { stories: {} };\n\n if (!loadedData.stories) {\n loadedData.stories = {};\n }\n\n if (!loadedData.stories[storyId] && storyId !== '*') {\n loadedData.stories[storyId] = {};\n }\n\n resolve(loadedData);\n });\n });\n}\n","import type { PlaywrightStoryData } from '../../../typings';\nimport { loadStoryData } from './load-story-data';\n\nexport interface StoryPlaywrightData {\n data: PlaywrightStoryData;\n storyId: string;\n}\n\nexport async function getStoryPlaywrightData(fileName: string) {\n const playWrightData = (await loadStoryData(fileName, '*')) || {\n stories: {},\n };\n\n const storiesData = playWrightData.stories || {};\n\n const stories = Object.keys(storiesData);\n\n const storyData: StoryPlaywrightData[] = stories.map((story) => ({\n data: storiesData[story],\n storyId: story,\n }));\n\n return {\n playWrightData,\n storyData,\n };\n}\n","import * as path from 'node:path';\n\nexport interface StoryPlaywrightFileInfo {\n name: string;\n path: string;\n dir: string;\n}\n\nexport function getStoryPlaywrightFileInfo(storyRelativeFilePath: string) {\n const absolutePath = path.resolve(storyRelativeFilePath);\n const parsedFileName = path.parse(absolutePath);\n\n const name =\n parsedFileName.ext === '.json'\n ? `${parsedFileName.name}.json`\n : `${parsedFileName.name}.playwright.json`;\n return {\n dir: parsedFileName.dir,\n name,\n path: path.join(path.dirname(absolutePath), name),\n screenShotsDir: path.join(parsedFileName.dir, '__screenshots__'),\n };\n}\n","import type { DiffImageToScreenShot } from '../../typings';\nimport path from 'node:path';\nimport kebabCase from 'lodash/kebabCase';\nimport { getStoryPlaywrightFileInfo } from './get-story-playwright-file-info';\n\nexport interface ScreenshotPathInfo {\n diffDir: string;\n filePath: string;\n screenshotIdentifier: string;\n screenshotsDir: string;\n}\n\nexport function getScreenshotPaths(data: DiffImageToScreenShot) {\n const fileInfo = getStoryPlaywrightFileInfo(data.filePath);\n\n const screenshotIdentifier = kebabCase(\n `${path.basename(data.storyId)}--${data.title}--${data.browserType}`,\n );\n\n const diffDir = path.join(fileInfo.screenShotsDir, '__diff_output__');\n\n const filePath = path.join(fileInfo.screenShotsDir, `${screenshotIdentifier}-snap.png`);\n\n return {\n diffDir,\n filePath,\n screenshotIdentifier,\n screenshotsDir: fileInfo.screenShotsDir,\n };\n}\n","import type { Page } from 'playwright';\nimport type { ClearInputOptions } from './typings';\n\nexport async function clearInput(\n this: Page,\n selector: string,\n options: ClearInputOptions = {},\n) {\n const { blur, timeout } = options;\n\n await this.fill(selector, '');\n\n if (blur) {\n await this.$eval(selector, (e) => e.blur());\n }\n\n if (timeout) {\n await this.waitForTimeout(timeout);\n }\n}\n","import type { Page } from 'playwright';\nimport type { ElementHandleBoundingBox } from '../typings';\n\nexport async function getBoundingBox(\n page: Page,\n selector: string,\n): Promise<ElementHandleBoundingBox> {\n await page.waitForSelector(selector);\n const elm = await page.$(selector);\n if (!elm) throw new Error('Unable to find selector!');\n const box = await elm.boundingBox();\n if (!box) throw new Error('Unable to get boundingBox!');\n return box;\n}\n","import type { Position } from '../typings';\n\nexport function getPointByDirection(\n defaultVal: number,\n direction: 'x' | 'y',\n providedPoint?: Position,\n): number {\n if (!providedPoint || !providedPoint[direction]) return defaultVal;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return providedPoint[direction];\n}\n","import type { Page } from 'playwright';\nimport type { MouseFromToOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function dragDropSelector(\n this: Page,\n selector: string,\n to: Position,\n mouseDownRelativeToSelector?: Position,\n options?: MouseFromToOptions,\n) {\n const { steps = 1, skipMouseUp } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(\n box.width / 2,\n 'x',\n mouseDownRelativeToSelector,\n );\n\n const mouseDownRelativeY = getPointByDirection(\n box.height / 2,\n 'y',\n mouseDownRelativeToSelector,\n );\n\n const mouseMoveX = getPointByDirection(0, 'x', to);\n const mouseMoveY = getPointByDirection(0, 'y', to);\n\n // move mouse to center of element or specified point\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n\n await this.mouse.down();\n\n await this.mouse.move(mouseMoveX, mouseMoveY, { steps });\n\n if (!skipMouseUp) await this.mouse.up();\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from '../typings';\n\nexport async function dispatchTouchEvent(\n playWright: Page,\n type: 'touchstart' | 'touchend' | 'touchcancel' | 'touchmove',\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await playWright.$eval(\n selector,\n (el, options) => {\n const rect = el.getBoundingClientRect();\n\n const { client = {}, page = {}, screen = {}, type, options: touchOpt } = options;\n\n const touchObj = new Touch({\n clientX: client.x,\n clientY: client.y,\n identifier: Date.now(),\n pageX: page.x || (client.x !== undefined ? rect.left + client.x : undefined),\n pageY: page.y || (client.y !== undefined ? rect.top + client.y : undefined),\n screenX: screen.x,\n screenY: screen.y,\n target: el,\n });\n\n const touchEvent = new TouchEvent(type, {\n bubbles: true,\n cancelable: true,\n ...touchOpt,\n changedTouches: [touchObj],\n targetTouches: [touchObj],\n touches: [touchObj],\n });\n return el.dispatchEvent(touchEvent);\n },\n { client, options, page, screen, type },\n );\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchFromTo(\n this: Page,\n selector: string,\n pageFrom?: Position,\n pageTo?: Position,\n clientFrom?: Position,\n clientTo?: Position,\n screenFrom?: Position,\n screenTo?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(\n this,\n 'touchstart',\n selector,\n pageFrom,\n screenFrom,\n clientFrom,\n options,\n );\n await dispatchTouchEvent(\n this,\n 'touchmove',\n selector,\n pageTo,\n screenTo,\n clientTo,\n options,\n );\n await dispatchTouchEvent(\n this,\n 'touchend',\n selector,\n pageTo,\n screenTo,\n clientTo,\n options,\n );\n}\n","import type { Page } from 'playwright';\nimport type { PlaywrightPageWithExtra } from './typings';\n\nimport {\n clearInput,\n dragDropSelector,\n mouseDownOnSelector,\n mouseFromTo,\n mouseMoveToSelector,\n scrollSelector,\n selectorMouseWheel,\n setSelectorSize,\n touchCancel,\n touchEnd,\n touchMove,\n touchStart,\n} from '.';\nimport { touchFromTo } from './touch-from-to';\n\nexport function extendPage<T extends Page>(page: T) {\n const thisPage = page as PlaywrightPageWithExtra & T;\n\n thisPage.dragDropSelector = dragDropSelector;\n thisPage.scrollSelector = scrollSelector;\n thisPage.mouseDownOnSelector = mouseDownOnSelector;\n thisPage.mouseMoveToSelector = mouseMoveToSelector;\n thisPage.setSelectorSize = setSelectorSize;\n thisPage.clearInput = clearInput;\n thisPage.selectorMouseWheel = selectorMouseWheel;\n thisPage.touchCancel = touchCancel;\n thisPage.touchMove = touchMove;\n thisPage.touchEnd = touchEnd;\n thisPage.touchStart = touchStart;\n thisPage.touchFromTo = touchFromTo;\n thisPage.mouseFromTo = mouseFromTo;\n\n return thisPage;\n}\n","import type { ExtendedPage, MouseOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function mouseDownOnSelector(\n this: ExtendedPage,\n selector: string,\n point?: Position,\n options?: MouseOptions,\n) {\n const { steps = 1 } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(box.width / 2, 'x', point);\n const mouseDownRelativeY = getPointByDirection(box.height / 2, 'y', point);\n\n // move mouse to center on selector\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n\n await this.mouse.down();\n}\n","import type { Page } from 'playwright';\nimport type { MouseFromToOptions, Position } from './typings';\n\nexport async function mouseFromTo(\n this: Page,\n from: Position,\n to: Position,\n options?: MouseFromToOptions,\n) {\n const { skipMouseUp, steps = 1 } = options || {};\n\n if (\n from.x === undefined ||\n from.y === undefined ||\n to.x === undefined ||\n to.y === undefined\n ) {\n throw new Error('mouseFromTo requires from/to coordinates (x and y).');\n }\n\n // move mouse to center of element or specified point\n await this.mouse.move(from.x, from.y, { steps });\n\n await this.mouse.down();\n\n await this.mouse.move(to.x, to.y, { steps });\n\n if (!skipMouseUp) await this.mouse.up();\n}\n","import type { ExtendedPage, MouseOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function mouseMoveToSelector(\n this: ExtendedPage,\n selector: string,\n point?: Position,\n options?: MouseOptions,\n) {\n const { steps = 1 } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(box.width / 2, 'x', point);\n const mouseDownRelativeY = getPointByDirection(box.height / 2, 'y', point);\n\n // move mouse to center on selector or specified point\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n}\n","import type { ExtendedPage, Location } from './typings';\n\nexport async function scrollSelector(\n this: ExtendedPage,\n selector: string,\n scrollProperty: Location,\n) {\n await this.waitForSelector(selector);\n\n const result = await this.$eval(\n selector,\n (el, points) => {\n if (points.top) {\n (el as HTMLElement).scrollTop = points.top;\n }\n if (points.left) {\n (el as HTMLElement).scrollLeft = points.left;\n }\n },\n scrollProperty,\n );\n return result;\n}\n","import type { ExtendedPage, SelectorMouseWheelOptions } from './typings';\n\nexport async function selectorMouseWheel(\n this: ExtendedPage,\n selector: string,\n eventInitDict?: SelectorMouseWheelOptions,\n) {\n await this.waitForSelector(selector);\n\n const result = await this.$eval(\n selector,\n (el, opt) => {\n const event = new WheelEvent('wheel', opt);\n el.dispatchEvent(event);\n },\n eventInitDict,\n );\n return result;\n}\n","import type { ExtendedPage } from './typings';\n\nexport async function setSelectorSize(\n this: ExtendedPage,\n selector: string,\n width?: string,\n height?: string,\n) {\n await this.$eval(\n selector,\n (el, opt) => {\n if (opt.width !== undefined) {\n (el as HTMLElement).style.width = opt.width;\n }\n\n if (opt.height !== undefined) {\n (el as HTMLElement).style.height = opt.height;\n }\n },\n { height, width },\n );\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchCancel(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchcancel', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchEnd(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchend', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchMove(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchmove', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchStart(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchstart', selector, page, screen, client, options);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { buildArgsParam } from '@storybook/core/router';\n\nexport function storybookPropsToQuerystring(props?: ScreenshotProp) {\n if (!props || Object.keys(props).length === 0) return '';\n\n return buildArgsParam({}, props);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { storybookPropsToQuerystring } from './storybook-props-to-querystring';\n\nexport function argsToQuerystring(args?: ScreenshotProp) {\n return storybookPropsToQuerystring(args);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { storybookPropsToQuerystring } from './storybook-props-to-querystring';\n\nexport function globalsToQuerystring(globals?: ScreenshotProp) {\n return storybookPropsToQuerystring(globals);\n}\n","import type { ScreenshotProp } from '../typings';\n\nexport function knobsToQuerystring(props?: ScreenshotProp) {\n if (!props) return '';\n\n const keys = Object.keys(props);\n\n const propQuery = keys.map((prop) => {\n const propVal = props[prop];\n if (Array.isArray(propVal)) {\n if (propVal.length > 0 && typeof propVal[0] === 'object') {\n return `knob-${prop}=${JSON.stringify(propVal)}`;\n }\n return `knob-${prop}=${propVal.join(',')}`;\n }\n if (typeof propVal === 'object') {\n return `knob-${prop}=${JSON.stringify(propVal)}`;\n }\n return `knob-${prop}=${propVal}`;\n });\n return encodeURI(propQuery.join('&'));\n}\n","import type { ScreenshotProp } from '../typings';\n\nimport normalize from 'normalize-url';\nimport { argsToQuerystring } from './args-to-querystring';\nimport { globalsToQuerystring } from './globals-to-querystring';\nimport { knobsToQuerystring } from './knobs-to-querystring';\n\nexport function constructStoryUrl(\n endpoint: string,\n id: string,\n props?: ScreenshotProp,\n args?: ScreenshotProp,\n globals?: ScreenshotProp,\n) {\n let normalized: string;\n\n if (/^\\.{0,2}[/\\\\]/.test(endpoint)) {\n // File-system path (./storybook-static, /abs/path, ../rel/path)\n normalized = `file:///${endpoint.replace(/\\\\/g, '/').replace(/^\\/+/, '')}`;\n } else if (/^https?:\\/\\//i.test(endpoint) || /^file:\\/\\//i.test(endpoint)) {\n // Already has explicit protocol\n normalized = normalize(endpoint);\n } else {\n // Bare hostname:port, IPv4, or plain hostname (e.g. localhost:1090)\n // Prepend http:// so normalize preserves it instead of defaulting to https://\n normalized = normalize(`http://${endpoint}`);\n }\n\n let storyUrl = `${normalized}/iframe.html?id=${id}`;\n\n const argsQuery = argsToQuerystring(args);\n if (argsQuery) {\n storyUrl = `${storyUrl}&args=${argsQuery}`;\n }\n\n const globalsQuery = globalsToQuerystring(globals);\n if (globalsQuery) {\n storyUrl = `${storyUrl}&globals=${globalsQuery}`;\n }\n\n if (props) {\n const propsQuery = knobsToQuerystring(props);\n if (propsQuery) {\n storyUrl = `${storyUrl}&${propsQuery}`;\n }\n }\n\n return storyUrl.replace(/\\\\/g, '/');\n}\n","import type { ActionSchema } from '../typings';\nimport { get } from 'object-path-immutable';\n\nexport function getActionSchema(\n schema: ActionSchema,\n key: string,\n): ActionSchema | undefined {\n if (!key) return undefined;\n\n const extendedKey = key.split('.').join('.properties.');\n const actionSchema = get(schema, extendedKey);\n return actionSchema;\n}\n","import type { ActionSchemaList, StoryAction } from '../typings';\nimport { getActionSchema } from './get-schema';\n\nexport function getActionArgs(action: StoryAction, actionSchema: ActionSchemaList) {\n const schema = getActionSchema(actionSchema, action.name);\n\n if (!schema) {\n throw new Error(\n `Unable to find '${action.name}', possibly this action has deprecated/removed from playwright and or from custom definitions.`,\n );\n }\n\n const parameters = (schema.parameters as Record<string, unknown> | undefined) || {};\n\n const args = Object.keys(parameters).reduce<unknown[]>((arr, actionName) => {\n const isRequired = schema.required && schema.required.includes(actionName);\n\n if (action && action.args && action.args[actionName] !== undefined) {\n const val = action.args[actionName];\n if (\n !isRequired &&\n val !== null &&\n (val === undefined ||\n (typeof val === 'object' && Object.keys(val).length === 0) ||\n (Array.isArray(val) && val.length === 0))\n ) {\n return arr;\n }\n\n arr.push(action.args[actionName]);\n } else {\n arr.push(undefined);\n }\n return arr;\n }, []);\n\n return args;\n}\n","import type { ScreenshotProp } from '../typings';\n\nexport function getScreenshotProp(\n ...candidates: Array<ScreenshotProp | undefined>\n): ScreenshotProp | undefined {\n for (let i = 0; i < candidates.length; i++) {\n const value = candidates[i];\n if (value && Object.keys(value).length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n","import type { ScreenshotProp } from '../typings';\nimport { getScreenshotProp } from './get-screenshot-prop';\n\ninterface ScreenshotGlobalsLike {\n globals?: ScreenshotProp;\n}\n\nexport const getScreenshotGlobals = (\n data?: ScreenshotGlobalsLike,\n): ScreenshotProp | undefined => {\n if (!data) return undefined;\n\n return getScreenshotProp(data.globals);\n};\n","import { ScreenshotProp } from '../typings';\nimport { getScreenshotProp } from './get-screenshot-prop';\n\ninterface ScreenshotArgsLike {\n args?: ScreenshotProp;\n props?: ScreenshotProp;\n}\n\nexport const getScreenshotArgs = (\n data?: ScreenshotArgsLike,\n): ScreenshotProp | undefined => {\n if (!data) return undefined;\n\n return getScreenshotProp(data.args, data.props);\n};\n","import type { ActionSchemaList, StoryAction } from '../typings';\nimport { getActionSchema } from './get-schema';\n\nexport interface ValidationResult {\n required?: string[];\n}\n\nexport interface ActionListValidationResult extends ValidationResult {\n id: string;\n name: string;\n}\n\nexport function validAction(\n schema: ActionSchemaList,\n action: StoryAction,\n): ValidationResult {\n const actionSchema = getActionSchema(schema, action.name);\n\n if (!actionSchema || !actionSchema.required || !actionSchema.required.length) return {};\n\n if (!action.args) {\n return { required: actionSchema.required };\n }\n\n const argKeys = Object.keys(action.args);\n\n if (argKeys.length === 0) {\n return { required: actionSchema.required };\n }\n\n const requiredParams: string[] = [];\n\n for (let i = 0; i < actionSchema.required.length; i++) {\n const requiredParam = actionSchema.required[i];\n const val = action.args[requiredParam];\n if (!val) {\n requiredParams.push(requiredParam);\n }\n }\n\n return {\n required: requiredParams.length === 0 ? undefined : requiredParams,\n };\n}\n\nexport function isValidAction(schema: ActionSchemaList, action: StoryAction) {\n const result = validAction(schema, action);\n\n return result.required === undefined;\n}\n\nexport function validateActionList(schema: ActionSchemaList, actions: StoryAction[]) {\n const result = actions.reduce<ActionListValidationResult[]>((arr, action) => {\n const res = validAction(schema, action);\n if (res.required) {\n arr.push({\n id: action.id,\n name: action.name,\n ...res,\n });\n }\n return arr;\n }, []);\n return result.length === 0 ? undefined : result;\n}\n","import type { Page } from 'playwright';\nimport type { Config } from '../../typings';\n\nlet configs: Config<Page>;\n\nexport function setConfig<T = Page>(conf: Config<T>) {\n configs = {\n ...(conf as unknown as Config<Page>),\n concurrencyLimit: {\n file: 1,\n story: 1,\n ...conf.concurrencyLimit,\n },\n };\n}\n\nexport function getConfigs() {\n if (!configs) {\n throw new Error('Configuration has not been set.');\n }\n\n return configs;\n}\n","{\n \"clearInput\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"timeout\": {\n \"type\": \"number\"\n },\n \"blur\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, waits for actionability checks, focuses the element, clear it and triggers an input event. If the element matching selector is not an <input>, <textarea> or [contenteditable] element, this method throws an error.\"\n },\n \"dragDropSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"mouseDownRelativeToSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n },\n \"skipMouseUp\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"to\"],\n \"description\": \"This method fetches an element with `selector`, and move it to the position given by user. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseFromTo\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"from\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"to\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n },\n \"skipMouseUp\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"from\", \"to\"],\n \"description\": \"This method will perform mouse down, move,and up from to selected location.\"\n },\n \"scrollSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"scrollProperty\": {\n \"type\": \"object\",\n \"properties\": {\n \"top\": {\n \"type\": \"number\"\n },\n \"left\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"scrollProperty\"],\n \"description\": \"This method fetches an element with `selector`, and set the selector scrollLeft and scrollTop. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseDownOnSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"point\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and perform mousedown on the center of selector. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseMoveToSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"point\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and move the mouse to center of selector. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"setSelectorSize\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, set the height and with. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"selectorMouseWheel\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"eventInitDict\": {\n \"type\": \"object\",\n \"properties\": {\n \"deltaMode\": {\n \"type\": \"number\"\n },\n \"deltaX\": {\n \"type\": \"number\"\n },\n \"deltaY\": {\n \"type\": \"number\"\n },\n \"deltaZ\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch WheelEvent. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchStart\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchstart event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchMove\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchmove event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchEnd\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchend event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchCancel\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchcancel event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchFromTo\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"pageFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"pageTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"clientFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"clientTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screenFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screenTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchstart,touchmove and touchend event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"waitForSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to query for.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"state\": {\n \"type\": \"string\",\n \"enum\": [\"attached\", \"detached\", \"visible\", \"hidden\"],\n \"description\": \"Defaults to `'visible'`. Can be either:\\n- `'attached'` - wait for element to be present in DOM.\\n- `'detached'` - wait for element to not be present in DOM.\\n- `'visible'` - wait for element to have non-empty bounding box and no `visibility:hidden`. Note that element without any content or with `display:none` has an empty bounding box and is not considered visible.\\n- `'hidden'` - wait for element to be either detached from DOM, or have an empty bounding box or `visibility:hidden`. This is opposite to the `'visible'` option.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"options\"],\n \"description\": \"**NOTE** Use web assertions that assert visibility or a locator-based [locator.waitFor([options])](https://playwright.dev/docs/api/class-locator#locator-wait-for) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nReturns when element specified by selector satisfies [`state`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-state) option. Returns `null` if waiting for `hidden` or `detached`.\\n\\n**NOTE** Playwright automatically waits for element to be ready before performing an action. Using [Locator](https://playwright.dev/docs/api/class-locator) objects and web-first assertions makes the code wait-for-selector-free.\\n\\nWait for the [`selector`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-selector) to satisfy [`state`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-state) option (either appear/disappear from dom, or become visible/hidden). If at the moment of calling the method [`selector`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-selector) already satisfies the condition, the method will return immediately. If the selector doesn't satisfy the condition for the [`timeout`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-timeout) milliseconds, the function will throw.\\n\\n**Usage**\\n\\nThis method works across navigations:\\n\\n```js const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.\\n\\n(async () => { const browser = await chromium.launch(); const page = await browser.newPage(); for (const currentURL of ['https://google.com', 'https://bbc.com']) { await page.goto(currentURL); const element = await page.waitForSelector('img'); console.log('Loaded image: ' + await element.getAttribute('src')); } await browser.close(); })(); ```\"\n },\n \"check\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.check([options])](https://playwright.dev/docs/api/class-locator#locator-check) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method checks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-check-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-check-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already checked, this method returns immediately. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-check-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element. 1. Ensure that the element is now checked. If not, this method throws.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-check-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"click\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"Actions that initiate navigations are waiting for these navigations to happen and for pages to start loading. You can opt out of waiting via setting this flag. You would only need this option in the exceptional cases such as navigating to inaccessible pages. Defaults to `false`.\",\n \"deprecated\": \"This option will default to `true` in the future.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.click([options])](https://playwright.dev/docs/api/class-locator#locator-click) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method clicks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-click-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-click-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-click-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-click-option-position). 1. Wait for initiated navigations to either succeed or fail, unless [`noWaitAfter`](https://playwright.dev/docs/api/class-page#page-click-option-no-wait-after) option is set.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-click-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"dblclick\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.dblclick([options])](https://playwright.dev/docs/api/class-locator#locator-dblclick) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method double clicks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-dblclick-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-dblclick-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-dblclick-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to double click in the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-dblclick-option-position).\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-dblclick-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\\n\\n**NOTE** `page.dblclick()` dispatches two `click` events and a single `dblclick` event.\"\n },\n \"fill\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Value to fill for the `<input>`, `<textarea>` or `[contenteditable]` element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"value\"],\n \"description\": \"**NOTE** Use locator-based [locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method waits for an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-fill-option-selector), waits for [actionability](https://playwright.dev/docs/actionability) checks, focuses the element, fills it and triggers an `input` event after filling. Note that you can pass an empty string to clear the input field.\\n\\nIf the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error. However, if the element is inside the `<label>` element that has an associated [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled instead.\\n\\nTo send fine-grained keyboard events, use [locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\"\n },\n \"focus\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.focus([options])](https://playwright.dev/docs/api/class-locator#locator-focus) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method fetches an element with [`selector`](https://playwright.dev/docs/api/class-page#page-focus-option-selector) and focuses it. If there's no element matching [`selector`](https://playwright.dev/docs/api/class-page#page-focus-option-selector), the method waits until a matching element appears in the DOM.\"\n },\n \"hover\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.hover([options])](https://playwright.dev/docs/api/class-locator#locator-hover) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method hovers over an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-hover-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-hover-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-hover-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to hover over the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-hover-option-position).\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-hover-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"press\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"Actions that initiate navigations are waiting for these navigations to happen and for pages to start loading. You can opt out of waiting via setting this flag. You would only need this option in the exceptional cases such as navigating to inaccessible pages. Defaults to `false`.\",\n \"deprecated\": \"This option will default to `true` in the future.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"key\"],\n \"description\": \"**NOTE** Use locator-based [locator.press(key[, options])](https://playwright.dev/docs/api/class-locator#locator-press) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nFocuses the element, and then uses [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) and [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\n[`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nShortcuts such as `key: \\\"Control+o\\\"`, `key: \\\"Control++` or `key: \\\"Control+Shift+T\\\"` are supported as well. When specified with the modifier, modifier is pressed and being held while the subsequent key is being pressed.\\n\\n**Usage**\\n\\n```js const page = await browser.newPage(); await page.goto('https://keycode.info'); await page.press('body', 'A'); await page.screenshot({ path: 'A.png' }); await page.press('body', 'ArrowLeft'); await page.screenshot({ path: 'ArrowLeft.png' }); await page.press('body', 'Shift+O'); await page.screenshot({ path: 'O.png' }); await browser.close(); ```\"\n },\n \"type\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"A text to type into a focused element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between key presses in milliseconds. Defaults to 0.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"text\"],\n \"description\": \"Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text. `page.type` can be used to send fine-grained keyboard events. To fill values in form fields, use [page.fill(selector, value[, options])](https://playwright.dev/docs/api/class-page#page-fill).\\n\\nTo press a special key, like `Control` or `ArrowDown`, use [keyboard.press(key[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-press).\\n\\n**Usage**\",\n \"deprecated\": \"In most cases, you should use\\n[locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. You only need\\nto press keys one by one if there is special keyboard handling on the page - in this case use\\n[locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\"\n },\n \"uncheck\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.uncheck([options])](https://playwright.dev/docs/api/class-locator#locator-uncheck) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method unchecks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-uncheck-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-uncheck-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already unchecked, this method returns immediately. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-uncheck-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element. 1. Ensure that the element is now unchecked. If not, this method throws.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-uncheck-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"waitForTimeout\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"A timeout to wait for\"\n }\n },\n \"required\": [\"timeout\"],\n \"description\": \"**NOTE** Never wait for timeout in production. Tests that wait for time are inherently flaky. Use [Locator](https://playwright.dev/docs/api/class-locator) actions and web assertions that wait automatically.\\n\\nWaits for the given [`timeout`](https://playwright.dev/docs/api/class-page#page-wait-for-timeout-option-timeout) in milliseconds.\\n\\nNote that `page.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going to be flaky. Use signals such as network events, selectors becoming visible and others instead.\\n\\n**Usage**\\n\\n```js // wait for 1 second await page.waitForTimeout(1000); ```\"\n },\n \"keyboard\": {\n \"type\": \"object\",\n \"properties\": {\n \"down\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n }\n },\n \"required\": [\"key\"],\n \"description\": \"Dispatches a `keydown` event.\\n\\n[`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) is a modifier key, `Shift`, `Meta`, `Control`, or `Alt`, subsequent key presses will be sent with that modifier active. To release the modifier key, use [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\nAfter the key is pressed once, subsequent calls to [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) will have [repeat](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat) set to true. To release the key, use [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\n**NOTE** Modifier keys DO influence `keyboard.down`. Holding down `Shift` will type the text in upper case.\"\n },\n \"insertText\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Sets input to the specified text value.\"\n }\n },\n \"required\": [\"text\"],\n \"description\": \"Dispatches only `input` event, does not emit the `keydown`, `keyup` or `keypress` events.\\n\\n**Usage**\\n\\n```js page.keyboard.insertText('嗨'); ```\\n\\n**NOTE** Modifier keys DO NOT effect `keyboard.insertText`. Holding down `Shift` will not type the text in upper case.\"\n },\n \"press\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"key\"],\n \"description\": \"**NOTE** In most cases, you should use [locator.press(key[, options])](https://playwright.dev/docs/api/class-locator#locator-press) instead.\\n\\n[`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nShortcuts such as `key: \\\"Control+o\\\"`, `key: \\\"Control++` or `key: \\\"Control+Shift+T\\\"` are supported as well. When specified with the modifier, modifier is pressed and being held while the subsequent key is being pressed.\\n\\n**Usage**\\n\\n```js const page = await browser.newPage(); await page.goto('https://keycode.info'); await page.keyboard.press('A'); await page.screenshot({ path: 'A.png' }); await page.keyboard.press('ArrowLeft'); await page.screenshot({ path: 'ArrowLeft.png' }); await page.keyboard.press('Shift+O'); await page.screenshot({ path: 'O.png' }); await browser.close(); ```\\n\\nShortcut for [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) and [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\"\n },\n \"type\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"A text to type into a focused element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between key presses in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"text\"],\n \"description\": \"**NOTE** In most cases, you should use [locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. You only need to press keys one by one if there is special keyboard handling on the page - in this case use [locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\\n\\nSends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.\\n\\nTo press a special key, like `Control` or `ArrowDown`, use [keyboard.press(key[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-press).\\n\\n**Usage**\\n\\n```js await page.keyboard.type('Hello'); // Types instantly await page.keyboard.type('World', { delay: 100 }); // Types slower, like a user ```\\n\\n**NOTE** Modifier keys DO NOT effect `keyboard.type`. Holding down `Shift` will not type the text in upper case.\\n\\n**NOTE** For characters that are not on a US keyboard, only an `input` event will be sent.\"\n },\n \"up\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n }\n },\n \"required\": [\"key\"],\n \"description\": \"Dispatches a `keyup` event.\"\n }\n },\n \"required\": [\"down\", \"insertText\", \"press\", \"type\", \"up\"],\n \"additionalProperties\": false,\n \"description\": \"Keyboard provides an api for managing a virtual keyboard. The high level api is [keyboard.type(text[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-type), which takes raw characters and generates proper `keydown`, `keypress`/`input`, and `keyup` events on your page.\\n\\nFor finer control, you can use [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down), [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up), and [keyboard.insertText(text)](https://playwright.dev/docs/api/class-keyboard#keyboard-insert-text) to manually fire events as if they were generated from a real keyboard.\\n\\nAn example of holding down `Shift` in order to select and delete some text:\\n\\n```js await page.keyboard.type('Hello World!'); await page.keyboard.press('ArrowLeft');\\n\\nawait page.keyboard.down('Shift'); for (let i = 0; i < ' World'.length; i++) await page.keyboard.press('ArrowLeft'); await page.keyboard.up('Shift');\\n\\nawait page.keyboard.press('Backspace'); // Result text will end up saying 'Hello!' ```\\n\\nAn example of pressing uppercase `A`\\n\\n```js await page.keyboard.press('Shift+KeyA'); // or await page.keyboard.press('Shift+A'); ```\\n\\nAn example to trigger select-all with the keyboard\\n\\n```js await page.keyboard.press('ControlOrMeta+A'); ```\"\n },\n \"mouse\": {\n \"type\": \"object\",\n \"properties\": {\n \"click\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Shortcut for [mouse.move(x, y[, options])](https://playwright.dev/docs/api/class-mouse#mouse-move), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down), [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up).\"\n },\n \"dblclick\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Shortcut for [mouse.move(x, y[, options])](https://playwright.dev/docs/api/class-mouse#mouse-move), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down), [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down) and [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up).\"\n },\n \"down\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"Dispatches a `mousedown` event.\"\n },\n \"move\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"description\": \"Defaults to 1. Sends `n` interpolated `mousemove` events to represent travel between Playwright's current cursor position and the provided destination. When set to 1, emits a single `mousemove` event at the destination location.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Dispatches a `mousemove` event.\"\n },\n \"up\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"Dispatches a `mouseup` event.\"\n }\n },\n \"required\": [\"click\", \"dblclick\", \"down\", \"move\", \"up\"],\n \"additionalProperties\": false,\n \"description\": \"The Mouse class operates in main-frame CSS pixels relative to the top-left corner of the viewport.\\n\\n**NOTE** If you want to debug where the mouse moved, you can use the [Trace viewer](https://playwright.dev/docs/trace-viewer-intro) or [Playwright Inspector](https://playwright.dev/docs/running-tests). A red dot showing the location of the mouse will be shown for every mouse action.\\n\\nEvery `page` object has its own Mouse, accessible with [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse).\\n\\n```js // Using ‘page.mouse’ to trace a 100x100 square. await page.mouse.move(0, 0); await page.mouse.down(); await page.mouse.move(0, 100); await page.mouse.move(100, 100); await page.mouse.move(100, 0); await page.mouse.move(0, 0); await page.mouse.up(); ```\"\n },\n \"touchscreen\": {\n \"type\": \"object\",\n \"properties\": {\n \"tap\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Dispatches a `touchstart` and `touchend` event with a single touch at the position ([`x`](https://playwright.dev/docs/api/class-touchscreen#touchscreen-tap-option-x),[`y`](https://playwright.dev/docs/api/class-touchscreen#touchscreen-tap-option-y)).\\n\\n**NOTE** [page.tap(selector[, options])](https://playwright.dev/docs/api/class-page#page-tap) the method will throw if [`hasTouch`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-has-touch) option of the browser context is false.\"\n }\n },\n \"required\": [\"tap\"],\n \"additionalProperties\": false,\n \"description\": \"The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the touchscreen can only be used in browser contexts that have been initialized with `hasTouch` set to true.\\n\\nThis class is limited to emulating tap gestures. For examples of other gestures simulated by manually dispatching touch events, see the [emulating legacy touch events](https://playwright.dev/docs/touch-events) page.\"\n },\n \"takeScreenshot\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"This method will take a screenshot at the position that it activated, its useful for taking a screenshot in sequence for events/actions. In the end the screenshots will be merged with the final screenshot.\"\n },\n \"takeScreenshotAll\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"This method will take a screenshot after each action, its useful for looking at over all action execution. In the end the screenshots will be merged.\"\n },\n \"takeElementScreenshot\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method will take a screenshot of an element.\"\n },\n \"takeScreenshotOptions\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"mergeType\": {\n \"type\": \"string\",\n \"enum\": [\"stitch\", \"overlay\"]\n },\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\"vertical\", \"horizontal\"],\n \"description\": \"Direction of the merged image.\"\n },\n \"align\": {\n \"type\": \"string\",\n \"enum\": [\"start\", \"center\", \"end\"],\n \"description\": \"Aligning of given images. If the images are not all the same size, images will be sorted to largest image. Possible values are `start`, `center` and `end`. Default is `start`.\"\n },\n \"offset\": {\n \"type\": \"number\",\n \"description\": \"Offset in pixels between each image. Default is `0`\"\n },\n \"margin\": {\n \"type\": \"string\",\n \"description\": \"Set the margin of image, considered as standard css shorthand properties (e.g. '40 40 0 10')\",\n \"default\": \"0 0 0 0\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Set the background color of image.\"\n }\n },\n \"additionalProperties\": false\n },\n \"overlayOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"The purpose of this action is to have centralized options for all screenshots. This action can be used in conjunction with takeScreenshot action only. Only one instance can be used.\"\n }\n}\n","import type { ActionSchemaList } from '../../typings';\nimport { getConfigs } from '../server/configs';\nimport actionSchema from '../server/data/action-schema.json';\n\nexport function getActionsSchema() {\n let schema = actionSchema as ActionSchemaList;\n\n const customSchema = getConfigs().customActionSchema;\n\n if (customSchema) {\n schema = { ...schema, ...customSchema };\n }\n return schema;\n}\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\nimport { getActionArgs, isValidAction } from '../../../utils';\nimport { getActionsSchema } from '../../services/get-actions-schema';\n\nexport async function executeAction(page: Page, action: StoryAction) {\n const schema = getActionsSchema();\n\n if (!isValidAction(schema, action)) {\n return;\n }\n\n const args = getActionArgs(action, schema);\n\n const actionNames = action.name.split('.');\n let pageObj: unknown = page;\n\n const pageObjects: unknown[] = [pageObj];\n\n for (let i = 0; i < actionNames.length; i++) {\n const name = actionNames[i];\n\n if (\n (typeof pageObj !== 'object' && typeof pageObj !== 'function') ||\n pageObj === null\n ) {\n break;\n }\n\n const nextPageObj = (pageObj as Record<string, unknown>)[name];\n if (nextPageObj === undefined) break;\n\n pageObj = nextPageObj;\n pageObjects.push(pageObj);\n }\n\n if (pageObjects.length === 1) return;\n\n if (typeof pageObj !== 'function') return;\n\n return await pageObj.call(pageObjects[pageObjects.length - 2], ...args);\n}\n","// https://gist.github.com/aslushnikov/94108a4094532c7752135c42e12a00eb\n// This injects a box into the page that moves with the mouse;\n// Useful for debugging\n\nimport type { Page } from 'playwright';\n\nasync function installMouseHelper(page: Page) {\n await page.waitForLoadState('load');\n await page.evaluate(`\n (() => {\n if (window !== window.parent) return;\n const box = document.createElement('playwright-mouse-pointer');\n const styleElement = document.createElement('style');\n\n function getHighestZIndex() {\n let highestZIndex = 0;\n let currentZIndex = 0;\n const nodes = document.body.getElementsByTagName('*');\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node === box) continue;\n currentZIndex = Number(window.getComputedStyle(node).zIndex);\n if (currentZIndex > highestZIndex) {\n highestZIndex = currentZIndex;\n }\n }\n\n return highestZIndex + 1;\n }\n\n styleElement.innerHTML = \\\n 'playwright-mouse-pointer {' +\n 'position: absolute !important;' +\n 'top: -100px;' +\n 'z-index: 1000;' +\n 'left: -100px;' +\n 'width: 14px;' +\n 'height: 14px;' +\n 'background: rgba(0, 0, 0, 0.39);' +\n 'border: 2px solid #fbfbfb9e !important;' +\n 'border-radius: 14px;' +\n 'margin: -8px 0 0 -8px;' +\n 'padding: 0;' +\n 'pointer-events: none !important;' +\n 'box-sizing: content-box !important;' +\n '}' +\n 'playwright-mouse-pointer.button-mousedown {' +\n 'background: rgba(243, 169, 4, 0.87);' +\n '}';\n\n document.head.appendChild(styleElement);\n document.body.appendChild(box);\n\n function setPosition(e) {\n const touch =\n (e.touches && e.touches[0]) ||\n (e.changedTouches && e.changedTouches[0]);\n\n let pageY = e.pageY;\n let pageX = e.pageX;\n\n if (touch) {\n pageY = touch.pageY;\n pageX = touch.pageX;\n }\n\n box.style.left = pageX + 'px';\n box.style.top = pageY + 'px';\n }\n\n document.addEventListener(\n 'mousemove',\n (event) => {\n setPosition(event);\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'mousedown',\n (event) => {\n setPosition(event);\n box.classList.add('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'mouseup',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchstart',\n (event) => {\n setPosition(event);\n box.classList.add('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchend',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchcancel',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchmove',\n (event) => {\n setPosition(event);\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n })();\n `);\n}\n\nexport { installMouseHelper };\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\n\nconst waitActions = [\n 'waitForSelector',\n 'waitForTimeout',\n 'takeScreenshot',\n 'takeScreenshotAll',\n 'takeScreenshotOptions',\n];\n\nexport function isInteractiveAction(action: StoryAction<Page>) {\n return !waitActions.includes(action.name);\n}\n","import type { Page } from 'playwright';\nimport type { ActionSet } from '../../../typings';\n\nexport async function releaseModifierKey(page: Page, actionSets: ActionSet[]) {\n if (actionSets) {\n const modifierKeys = ['Shift', 'Meta', 'Control', 'Alt'];\n\n for (let i = 0; i < actionSets.length; i++) {\n const actionSet = actionSets[i];\n for (let x = 0; x < actionSet.actions.length; x++) {\n const action = actionSet.actions[x];\n if (\n action.name === 'keyboard.down' &&\n action.args &&\n action.args.key &&\n modifierKeys.includes(action.args.key as string)\n ) {\n await page.keyboard.up(action.args.key as string);\n }\n }\n }\n }\n}\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\nimport { isInteractiveAction } from './is-interactive-action';\n\nexport function shouldTakeScreenshot(\n actions: StoryAction<Page>[],\n currentPosition: number,\n enabled?: boolean,\n) {\n // const action = actions[currentPosition];\n\n // if (waitActions.includes(action.name)) return false;\n\n const nextAction = actions[currentPosition + 1];\n\n return (\n enabled &&\n actions.length > 1 &&\n actions.length > currentPosition + 1 &&\n nextAction &&\n isInteractiveAction(nextAction)\n );\n}\n","import type { Page } from 'playwright';\nexport const STORY_RENDER_TIMEOUT = 30000;\n\ntype StoryRenderLike = {\n id?: string;\n phase?: string;\n};\n\nexport interface StoryReadyPredicateInput {\n targetStoryId: string;\n}\n\n/**\n * Executed in the browser context by Playwright waitForFunction.\n */\nexport function storyRenderedReadyPredicate({\n targetStoryId,\n}: StoryReadyPredicateInput): boolean {\n const preview = (\n globalThis as {\n __STORYBOOK_PREVIEW__?: { storyRenders?: StoryRenderLike[] };\n }\n ).__STORYBOOK_PREVIEW__;\n\n const storyRenders = preview?.storyRenders || [];\n\n const selectedRender =\n storyRenders.find((render) => render?.id === targetStoryId) ||\n storyRenders.find(\n (render) => render?.phase === 'completed' || render?.phase === 'finished',\n );\n\n if (selectedRender) {\n return selectedRender.phase === 'completed' || selectedRender.phase === 'finished';\n }\n\n const storyRoot = document.getElementById('storybook-root');\n\n const hasMountedContent = (storyRoot?.childElementCount || 0) > 0;\n\n if (!hasMountedContent) {\n return false;\n }\n\n return ['interactive', 'complete'].includes(document.readyState);\n}\n\n/**\n * Executed in the browser context by Playwright evaluate.\n */\nexport async function settleStoryRender(): Promise<void> {\n const waitForAnimationFrame = async () => {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n };\n\n await waitForAnimationFrame();\n await waitForAnimationFrame();\n\n try {\n const fonts = (\n document as Document & {\n fonts?: {\n ready?: Promise<unknown>;\n };\n }\n ).fonts;\n\n if (fonts?.ready) {\n await fonts.ready;\n }\n } catch {\n // Ignore font API failures and continue.\n }\n}\n\nexport async function waitForStoryRendered(\n page: Page,\n storyId: string,\n timeout = STORY_RENDER_TIMEOUT,\n): Promise<void> {\n try {\n await page.waitForFunction(\n storyRenderedReadyPredicate,\n {\n targetStoryId: storyId,\n },\n {\n timeout,\n },\n );\n\n await page.evaluate(settleStoryRender);\n } catch {\n // Best-effort wait. If Storybook internals are unavailable, continue without blocking.\n }\n}\n","import type { ElementHandle, Page } from 'playwright';\nimport type { TakeScreenshotInput } from '../../schema';\nimport type {\n BrowserContextOptions,\n Config,\n ScreenshotImageData,\n StoryAction,\n} from '../../typings';\nimport type {\n TakeScreenshotOptionsParams,\n TakeScreenshotParams,\n} from '../typings/schema-types';\nimport joinImage from 'join-images';\nimport sharp from 'sharp';\nimport { extendPage } from '../../page-extra';\nimport { constructStoryUrl, getScreenshotArgs, getScreenshotGlobals } from '../../utils';\nimport { getConfigs } from '../server/configs';\nimport { executeAction } from '../server/utils/execute-action';\nimport { installMouseHelper } from '../server/utils/install-mouse-helper';\nimport { isInteractiveAction } from './utils/is-interactive-action';\nimport { releaseModifierKey } from './utils/release-modifier-Key';\nimport { shouldTakeScreenshot } from './utils/should-take-screenshot';\nimport { waitForStoryRendered } from './utils/wait-for-story-rendered';\n\ninterface ImageInfo {\n buffer: Buffer;\n options?: TakeScreenshotParams;\n}\n\nasync function takeScreenshot(\n page: Page,\n data: TakeScreenshotInput,\n configs: Config<Page>,\n handler?: ElementHandle<SVGElement | HTMLElement>,\n) {\n const requestData = {\n ...data,\n requestId: data.requestId || '',\n };\n\n if (configs.beforeScreenshot) {\n await configs.beforeScreenshot(page, requestData, requestData);\n }\n\n if (handler) {\n return handler.screenshot(data.screenshotOptions);\n }\n\n return page.screenshot(data.screenshotOptions);\n}\n\nexport async function makeScreenshot(\n data: TakeScreenshotInput,\n convertToBase64?: boolean,\n): Promise<ScreenshotImageData> {\n const requestData = {\n ...data,\n requestId: data.requestId || '',\n };\n\n const configs = getConfigs();\n\n const { screenshotOptions: defaultScreenshotOptions = {} } = configs;\n\n const browserOptions = data.browserOptions as BrowserContextOptions;\n\n const page = await configs.getPage(\n requestData.browserType,\n browserOptions,\n requestData,\n );\n\n if (!page) {\n throw new Error('Make sure to return an instance of a page from getPage.');\n }\n\n extendPage(page);\n\n const args = getScreenshotArgs(data);\n const globals = getScreenshotGlobals(data);\n\n let url = constructStoryUrl(\n configs.storybookEndpoint,\n data.storyId,\n data.props,\n args,\n globals,\n );\n\n if (configs.afterUrlConstruction) {\n url = configs.afterUrlConstruction(url, requestData);\n }\n\n await page.goto(url, configs.pageGotoOptions);\n\n if (configs.waitForStoryRender !== false) {\n await waitForStoryRendered(page, data.storyId, configs.storyRenderTimeout);\n }\n\n if (configs.afterNavigation) {\n await configs.afterNavigation(page, requestData);\n }\n\n if (browserOptions && browserOptions.cursor) {\n await installMouseHelper(page);\n }\n\n const imageInfos: ImageInfo[] = [];\n\n let screenshotOptionAction: StoryAction | undefined;\n\n let lastAction: StoryAction | undefined;\n\n if (data.actionSets) {\n const actions = data.actionSets.reduce((arr, actionSet) => {\n arr = [...arr, ...actionSet.actions];\n return arr;\n }, [] as StoryAction[]);\n\n lastAction = actions.slice(-1)[0];\n\n const takeScreenshotAll = actions.find((x) => x.name === 'takeScreenshotAll');\n\n screenshotOptionAction = actions.find((a) => a.name === 'takeScreenshotOptions');\n\n const filterActions = actions.filter(\n (a) => !['takeScreenshotAll', 'takeScreenshotOptions'].includes(a.name),\n );\n\n /**\n * Take first image of current page before any action executed\n */\n if (\n takeScreenshotAll &&\n filterActions.filter((a) => isInteractiveAction(a)).length > 0\n ) {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: takeScreenshotAll.args,\n });\n }\n\n for (let i = 0; i < filterActions.length; i++) {\n const action = filterActions[i];\n\n if (action.name === 'takeElementScreenshot') {\n if (action && action.args && action.args.selector) {\n const elementHandle = await page.$(action.args.selector as string);\n\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs, elementHandle || undefined),\n options: action.args,\n });\n }\n continue;\n }\n\n if (action.name === 'takeScreenshot') {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: action.args,\n });\n continue;\n }\n\n await executeAction(page, action);\n\n if (shouldTakeScreenshot(filterActions, i, Boolean(takeScreenshotAll))) {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: takeScreenshotAll?.args || {},\n });\n }\n }\n }\n\n const isTakeElementScreenshotAtLast =\n lastAction &&\n (lastAction.name === 'takeElementScreenshot' || lastAction.name === 'takeScreenshot');\n\n let buffer: Buffer | undefined;\n\n if (!isTakeElementScreenshotAtLast) {\n buffer = await takeScreenshot(page, data, configs);\n }\n\n if (configs.releaseModifierKey) {\n await releaseModifierKey(page, data.actionSets || []);\n }\n\n if (configs.afterScreenshot) {\n await configs.afterScreenshot(page, requestData);\n }\n\n if (imageInfos.length) {\n const format =\n data && data.screenshotOptions && data.screenshotOptions.type\n ? data.screenshotOptions.type\n : 'png';\n\n let options: TakeScreenshotOptionsParams =\n screenshotOptionAction && screenshotOptionAction.args\n ? screenshotOptionAction.args\n : {};\n\n options = {\n mergeType: options.mergeType\n ? options.mergeType\n : defaultScreenshotOptions.mergeType || 'stitch',\n overlayOptions: {\n ...defaultScreenshotOptions.overlayOptions,\n ...options.overlayOptions,\n },\n stitchOptions: {\n ...defaultScreenshotOptions.stitchOptions,\n ...options.stitchOptions,\n },\n };\n\n if (options.mergeType === 'stitch') {\n const screenshotsBuffers = imageInfos.map((x) => x.buffer);\n\n if (buffer) {\n screenshotsBuffers.push(buffer);\n }\n\n buffer = await (\n await joinImage(screenshotsBuffers, {\n ...options.stitchOptions,\n })\n )\n .toFormat(format)\n .toBuffer();\n } else {\n const baseBuffer = buffer || imageInfos[0]?.buffer;\n\n if (!baseBuffer) {\n throw new Error('Unable to create screenshot image buffer.');\n }\n\n const overlaySources =\n buffer === undefined && imageInfos.length === 1\n ? imageInfos\n : imageInfos.filter((_, index) => !(buffer === undefined && index === 0));\n\n const overlays = overlaySources.map((x) => ({\n blend: 'multiply' as const,\n input: x.buffer,\n ...options.overlayOptions,\n ...(x.options ? x.options.stitchOptions : {}),\n }));\n\n buffer = await sharp(baseBuffer).composite(overlays).toFormat(format).toBuffer();\n }\n }\n\n if (!buffer) {\n throw new Error('Unable to create screenshot image buffer.');\n }\n\n return {\n base64: convertToBase64 ? buffer.toString('base64') : undefined,\n browserName: data.browserType,\n buffer,\n };\n}\n","import type { PlaywrightData, ScreenshotData } from '../../../typings';\n\nexport function setStoryScreenshotOptions(\n storyData: PlaywrightData,\n screenshot: ScreenshotData,\n) {\n if (storyData.browserOptions && screenshot.browserOptionsId) {\n screenshot.browserOptions = storyData.browserOptions[screenshot.browserOptionsId];\n }\n if (storyData.screenshotOptions && screenshot.screenshotOptionsId) {\n screenshot.screenshotOptions =\n storyData.screenshotOptions[screenshot.screenshotOptionsId];\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport glob from 'fast-glob';\nimport { getConfigs } from '../api/server/configs';\n\ninterface StorybookIndexEntry {\n importPath?: string;\n}\n\ninterface StorybookIndexResponse {\n entries?: Record<string, StorybookIndexEntry>;\n}\n\ninterface GetPlaywrightConfigFilesOptions {\n cwd?: string;\n storybookEndpoint?: string;\n}\n\nfunction getStorybookEndpoint(options: GetPlaywrightConfigFilesOptions) {\n if (options.storybookEndpoint) {\n return options.storybookEndpoint;\n }\n\n try {\n return getConfigs().storybookEndpoint;\n } catch {\n return undefined;\n }\n}\n\nfunction toPosixPath(filePath: string) {\n return filePath.replace(/\\\\/g, '/');\n}\n\nfunction getLookupPattern(configPath?: string | '*') {\n return configPath && configPath !== '*' ? configPath : '**/*.playwright.json';\n}\n\nfunction normalizeStoryImportPath(importPath: string) {\n return importPath.split('#')[0]?.split('?')[0] ?? '';\n}\n\nfunction toStoryPath(importPath: string, cwd: string) {\n if (importPath.startsWith('/@fs/')) {\n return path.normalize(importPath.replace('/@fs/', ''));\n }\n\n return path.resolve(cwd, importPath);\n}\n\nfunction toPlaywrightJsonPath(storyPath: string) {\n const parsed = path.parse(storyPath);\n return path.join(parsed.dir, `${parsed.name}.playwright.json`);\n}\n\nfunction extractImportPaths(indexData: unknown) {\n if (!indexData || typeof indexData !== 'object') {\n return [];\n }\n\n const entries = (indexData as StorybookIndexResponse).entries;\n if (!entries) {\n return [];\n }\n\n return Object.values(entries).reduce<string[]>((result, entry) => {\n if (typeof entry.importPath === 'string' && entry.importPath.length > 0) {\n result.push(entry.importPath);\n }\n\n return result;\n }, []);\n}\n\nfunction isHttpUrl(url: string) {\n return /^https?:\\/\\//i.test(url);\n}\n\nasync function loadStorybookIndex(storybookEndpoint: string) {\n if (isHttpUrl(storybookEndpoint)) {\n const endpoint = storybookEndpoint.endsWith('/')\n ? storybookEndpoint\n : `${storybookEndpoint}/`;\n const indexUrl = new URL('index.json', endpoint).toString();\n const response = await fetch(indexUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as unknown;\n return extractImportPaths(data);\n }\n\n const endpointPath = storybookEndpoint.startsWith('file://')\n ? fileURLToPath(storybookEndpoint)\n : path.resolve(storybookEndpoint);\n const indexPath = path.join(endpointPath, 'index.json');\n\n if (!fs.existsSync(indexPath)) {\n return [];\n }\n\n const content = await fs.promises.readFile(indexPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n\n return extractImportPaths(parsed);\n}\n\nasync function getStorybookDerivedFiles(storybookEndpoint: string, cwd: string) {\n try {\n const importPaths = await loadStorybookIndex(storybookEndpoint);\n const files = new Set<string>();\n\n importPaths.forEach((importPath) => {\n const normalizedImportPath = normalizeStoryImportPath(importPath);\n if (!normalizedImportPath) {\n return;\n }\n\n const storyPath = toStoryPath(normalizedImportPath, cwd);\n const playwrightFilePath = toPlaywrightJsonPath(storyPath);\n\n if (!fs.existsSync(playwrightFilePath)) {\n return;\n }\n\n const relativeFilePath = toPosixPath(path.relative(cwd, playwrightFilePath));\n if (relativeFilePath.length > 0) {\n files.add(relativeFilePath);\n }\n });\n\n return Array.from(files);\n } catch {\n return [];\n }\n}\n\nexport async function getPlaywrightConfigFiles(\n configPath?: string | '*',\n options: GetPlaywrightConfigFilesOptions = {},\n) {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();\n const lookupPattern = getLookupPattern(configPath);\n\n const files = await glob([lookupPattern, '!node_modules/**'], {\n cwd,\n });\n\n if (configPath && configPath !== '*') {\n return files;\n }\n\n const storybookEndpoint = getStorybookEndpoint(options);\n\n if (!storybookEndpoint) {\n return files;\n }\n\n const storybookDerivedFiles = await getStorybookDerivedFiles(storybookEndpoint, cwd);\n\n if (!storybookDerivedFiles.length) {\n return files;\n }\n\n return Array.from(new Set([...files, ...storybookDerivedFiles]));\n}\n","import type { ScreenshotPathInfo } from './api/server/utils/get-screenshot-paths';\nimport type { RequestData } from './typings/request';\nimport fs from 'node:fs';\nimport { getStoryPlaywrightData } from './api/server/utils/get-story-playwright-data';\nimport { getScreenshotPaths } from './api/server/utils/get-screenshot-paths';\nimport { makeScreenshot } from './api/services/make-screenshot';\nimport { setStoryScreenshotOptions } from './api/services/utils/set-story-screenshot-options';\nimport { getPlaywrightConfigFiles } from './utils/get-playwright-config-files';\n\ninterface RunImageDiffOptions extends RequestData {\n onScreenshotReady?: (\n buffer: Buffer,\n baselineScreenshotPathInfo: ScreenshotPathInfo,\n ) => void;\n playwrightJsonPath?: string;\n}\n\ninterface GetScreenshot {\n buffer: Buffer;\n storyId: string;\n configFile: string;\n}\n\nexport async function getScreenshots(options: RunImageDiffOptions) {\n const { onScreenshotReady, playwrightJsonPath, requestId } = options;\n\n const files =\n playwrightJsonPath && fs.existsSync(playwrightJsonPath)\n ? [playwrightJsonPath]\n : await getPlaywrightConfigFiles(playwrightJsonPath);\n\n const results: GetScreenshot[] = [];\n\n for (const fileName of files) {\n if (!fileName) continue;\n\n const storiesData = await getStoryPlaywrightData(fileName);\n\n for (const story of storiesData.storyData) {\n if (!story) continue;\n\n if (story.data.screenshots && story.data.screenshots.length) {\n for (const screenShotData of story.data.screenshots) {\n if (!screenShotData) continue;\n\n setStoryScreenshotOptions(storiesData.playWrightData, screenShotData);\n\n const screenShot = await makeScreenshot(\n {\n requestId,\n storyId: story.storyId,\n ...screenShotData,\n },\n false,\n );\n\n const paths = getScreenshotPaths({\n browserType: screenShotData.browserType,\n filePath: fileName,\n storyId: story.storyId,\n title: screenShotData.title,\n });\n\n results.push({\n buffer: screenShot.buffer,\n configFile: fileName,\n storyId: story.storyId,\n });\n\n if (onScreenshotReady) {\n await onScreenshotReady(screenShot.buffer, paths);\n }\n }\n }\n }\n }\n\n return results;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/server/utils/load-story-data.ts","../src/api/server/utils/get-story-playwright-data.ts","../src/api/server/utils/get-story-playwright-file-info.ts","../src/api/server/utils/get-screenshot-paths.ts","../src/page-extra/clear-input.ts","../src/page-extra/utils/get-boundingBox.ts","../src/page-extra/utils/get-point-by-direction.ts","../src/page-extra/drag-drop-selector.ts","../src/page-extra/utils/dispatch-touch-event.ts","../src/page-extra/touch-from-to.ts","../src/page-extra/extend-page.ts","../src/page-extra/mouse-down-on-selector.ts","../src/page-extra/mouse-from-to.ts","../src/page-extra/mouse-move-to-selector.ts","../src/page-extra/scroll-selector.ts","../src/page-extra/selector-mouse-wheel.ts","../src/page-extra/set-selector-size.ts","../src/page-extra/touch-cancel.ts","../src/page-extra/touch-end.ts","../src/page-extra/touch-move.ts","../src/page-extra/touch-start.ts","../src/utils/storybook-props-to-querystring.ts","../src/utils/args-to-querystring.ts","../src/utils/globals-to-querystring.ts","../src/utils/knobs-to-querystring.ts","../src/utils/construct-story-url.ts","../src/utils/get-schema.ts","../src/utils/get-action-args.ts","../src/utils/get-screenshot-prop.ts","../src/utils/get-screenshot-globals.ts","../src/utils/get-screenshot-args.ts","../src/utils/valid-action.ts","../src/api/server/configs.ts","../src/api/server/data/action-schema.json","../src/api/services/get-actions-schema.ts","../src/api/server/utils/execute-action.ts","../src/api/server/utils/install-mouse-helper.ts","../src/api/services/utils/is-interactive-action.ts","../src/api/services/utils/release-modifier-Key.ts","../src/api/services/utils/should-take-screenshot.ts","../src/constants/selectors.ts","../src/api/services/utils/wait-for-story-rendered.ts","../src/api/services/make-screenshot.ts","../src/api/services/utils/set-story-screenshot-options.ts","../src/utils/get-playwright-config-files.ts","../src/get-screenshots.ts"],"names":["loadStoryData","storyDataPath","storyId","create","resolve","reject","fs","readFile","err","data","loadedData","getStoryPlaywrightData","fileName","playWrightData","storiesData","storyData","story","getStoryPlaywrightFileInfo","storyRelativeFilePath","absolutePath","k","parsedFileName","name","getScreenshotPaths","fileInfo","screenshotIdentifier","kebabCase","path","diffDir","filePath","clearInput","selector","options","blur","timeout","e","getBoundingBox","page","elm","box","getPointByDirection","defaultVal","direction","providedPoint","dragDropSelector","to","mouseDownRelativeToSelector","steps","skipMouseUp","mouseDownRelativeX","mouseDownRelativeY","mouseMoveX","mouseMoveY","dispatchTouchEvent","playWright","type","screen","client","el","rect","touchOpt","touchObj","touchEvent","touchFromTo","pageFrom","pageTo","clientFrom","clientTo","screenFrom","screenTo","extendPage","thisPage","scrollSelector","mouseDownOnSelector","mouseMoveToSelector","setSelectorSize","selectorMouseWheel","touchCancel","touchMove","touchEnd","touchStart","mouseFromTo","point","from","scrollProperty","points","eventInitDict","opt","event","width","height","storybookPropsToQuerystring","props","buildArgsParam","argsToQuerystring","args","globalsToQuerystring","globals","knobsToQuerystring","propQuery","prop","propVal","constructStoryUrl","endpoint","id","normalized","normalize","storyUrl","argsQuery","globalsQuery","propsQuery","getActionSchema","schema","key","extendedKey","get","getActionArgs","action","actionSchema","parameters","arr","actionName","isRequired","val","getScreenshotProp","candidates","i","value","getScreenshotGlobals","getScreenshotArgs","validAction","requiredParams","requiredParam","isValidAction","getConfigs","action_schema_default","getActionsSchema","customSchema","executeAction","actionNames","pageObj","pageObjects","nextPageObj","installMouseHelper","waitActions","isInteractiveAction","releaseModifierKey","actionSets","modifierKeys","actionSet","x","shouldTakeScreenshot","actions","currentPosition","enabled","nextAction","STORYBOOK_ROOT_ID","STORY_RENDER_TIMEOUT","storyRenderedReadyPredicate","targetStoryId","storyRenders","selectedRender","render","settleStoryRender","waitForAnimationFrame","fonts","waitForStoryRendered","takeScreenshot","configs","handler","requestData","makeScreenshot","convertToBase64","defaultScreenshotOptions","browserOptions","url","imageInfos","screenshotOptionAction","lastAction","takeScreenshotAll","a","filterActions","elementHandle","isTakeElementScreenshotAtLast","buffer","format","screenshotsBuffers","joinImage","baseBuffer","overlays","_","index","sharp","setStoryScreenshotOptions","screenshot","getStorybookEndpoint","toPosixPath","getLookupPattern","configPath","normalizeStoryImportPath","importPath","toStoryPath","cwd","toPlaywrightJsonPath","storyPath","parsed","extractImportPaths","indexData","entries","result","entry","isHttpUrl","loadStorybookIndex","storybookEndpoint","indexUrl","response","endpointPath","fileURLToPath","indexPath","content","getStorybookDerivedFiles","importPaths","files","normalizedImportPath","playwrightFilePath","relativeFilePath","getPlaywrightConfigFiles","lookupPattern","glob","storybookDerivedFiles","getScreenshots","onScreenshotReady","playwrightJsonPath","requestId","results","screenShotData","screenShot","paths"],"mappings":"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","file":"get-screenshots.mjs","sourcesContent":["import type { PlaywrightData } from '../../../typings';\nimport fs from 'node:fs';\nimport { readFile } from 'jsonfile';\n\nexport async function loadStoryData(\n storyDataPath: string,\n storyId: string,\n create = true,\n): Promise<PlaywrightData | undefined> {\n return new Promise((resolve, reject) => {\n if (!fs.existsSync(storyDataPath)) {\n if (!create) {\n resolve(undefined);\n return;\n }\n\n if (storyId === '*') {\n resolve({ stories: {} });\n } else {\n resolve({ stories: { [storyId]: {} } });\n }\n return;\n }\n\n readFile(storyDataPath, (err, data?: PlaywrightData) => {\n if (err) {\n reject(err);\n return;\n }\n\n const loadedData: PlaywrightData = data || { stories: {} };\n\n if (!loadedData.stories) {\n loadedData.stories = {};\n }\n\n if (!loadedData.stories[storyId] && storyId !== '*') {\n loadedData.stories[storyId] = {};\n }\n\n resolve(loadedData);\n });\n });\n}\n","import type { PlaywrightStoryData } from '../../../typings';\nimport { loadStoryData } from './load-story-data';\n\nexport interface StoryPlaywrightData {\n data: PlaywrightStoryData;\n storyId: string;\n}\n\nexport async function getStoryPlaywrightData(fileName: string) {\n const playWrightData = (await loadStoryData(fileName, '*')) || {\n stories: {},\n };\n\n const storiesData = playWrightData.stories || {};\n\n const stories = Object.keys(storiesData);\n\n const storyData: StoryPlaywrightData[] = stories.map((story) => ({\n data: storiesData[story],\n storyId: story,\n }));\n\n return {\n playWrightData,\n storyData,\n };\n}\n","import * as path from 'node:path';\n\nexport interface StoryPlaywrightFileInfo {\n name: string;\n path: string;\n dir: string;\n}\n\nexport function getStoryPlaywrightFileInfo(storyRelativeFilePath: string) {\n const absolutePath = path.resolve(storyRelativeFilePath);\n const parsedFileName = path.parse(absolutePath);\n\n const name =\n parsedFileName.ext === '.json'\n ? `${parsedFileName.name}.json`\n : `${parsedFileName.name}.playwright.json`;\n return {\n dir: parsedFileName.dir,\n name,\n path: path.join(path.dirname(absolutePath), name),\n screenShotsDir: path.join(parsedFileName.dir, '__screenshots__'),\n };\n}\n","import type { DiffImageToScreenShot } from '../../typings';\nimport path from 'node:path';\nimport kebabCase from 'lodash/kebabCase';\nimport { getStoryPlaywrightFileInfo } from './get-story-playwright-file-info';\n\nexport interface ScreenshotPathInfo {\n diffDir: string;\n filePath: string;\n screenshotIdentifier: string;\n screenshotsDir: string;\n}\n\nexport function getScreenshotPaths(data: DiffImageToScreenShot) {\n const fileInfo = getStoryPlaywrightFileInfo(data.filePath);\n\n const screenshotIdentifier = kebabCase(\n `${path.basename(data.storyId)}--${data.title}--${data.browserType}`,\n );\n\n const diffDir = path.join(fileInfo.screenShotsDir, '__diff_output__');\n\n const filePath = path.join(fileInfo.screenShotsDir, `${screenshotIdentifier}-snap.png`);\n\n return {\n diffDir,\n filePath,\n screenshotIdentifier,\n screenshotsDir: fileInfo.screenShotsDir,\n };\n}\n","import type { Page } from 'playwright';\nimport type { ClearInputOptions } from './typings';\n\nexport async function clearInput(\n this: Page,\n selector: string,\n options: ClearInputOptions = {},\n) {\n const { blur, timeout } = options;\n\n await this.fill(selector, '');\n\n if (blur) {\n await this.$eval(selector, (e) => e.blur());\n }\n\n if (timeout) {\n await this.waitForTimeout(timeout);\n }\n}\n","import type { Page } from 'playwright';\nimport type { ElementHandleBoundingBox } from '../typings';\n\nexport async function getBoundingBox(\n page: Page,\n selector: string,\n): Promise<ElementHandleBoundingBox> {\n await page.waitForSelector(selector);\n const elm = await page.$(selector);\n if (!elm) throw new Error('Unable to find selector!');\n const box = await elm.boundingBox();\n if (!box) throw new Error('Unable to get boundingBox!');\n return box;\n}\n","import type { Position } from '../typings';\n\nexport function getPointByDirection(\n defaultVal: number,\n direction: 'x' | 'y',\n providedPoint?: Position,\n): number {\n if (!providedPoint || !providedPoint[direction]) return defaultVal;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return providedPoint[direction];\n}\n","import type { Page } from 'playwright';\nimport type { MouseFromToOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function dragDropSelector(\n this: Page,\n selector: string,\n to: Position,\n mouseDownRelativeToSelector?: Position,\n options?: MouseFromToOptions,\n) {\n const { steps = 1, skipMouseUp } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(\n box.width / 2,\n 'x',\n mouseDownRelativeToSelector,\n );\n\n const mouseDownRelativeY = getPointByDirection(\n box.height / 2,\n 'y',\n mouseDownRelativeToSelector,\n );\n\n const mouseMoveX = getPointByDirection(0, 'x', to);\n const mouseMoveY = getPointByDirection(0, 'y', to);\n\n // move mouse to center of element or specified point\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n\n await this.mouse.down();\n\n await this.mouse.move(mouseMoveX, mouseMoveY, { steps });\n\n if (!skipMouseUp) await this.mouse.up();\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from '../typings';\n\nexport async function dispatchTouchEvent(\n playWright: Page,\n type: 'touchstart' | 'touchend' | 'touchcancel' | 'touchmove',\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await playWright.$eval(\n selector,\n (el, options) => {\n const rect = el.getBoundingClientRect();\n\n const { client = {}, page = {}, screen = {}, type, options: touchOpt } = options;\n\n const touchObj = new Touch({\n clientX: client.x,\n clientY: client.y,\n identifier: Date.now(),\n pageX: page.x || (client.x !== undefined ? rect.left + client.x : undefined),\n pageY: page.y || (client.y !== undefined ? rect.top + client.y : undefined),\n screenX: screen.x,\n screenY: screen.y,\n target: el,\n });\n\n const touchEvent = new TouchEvent(type, {\n bubbles: true,\n cancelable: true,\n ...touchOpt,\n changedTouches: [touchObj],\n targetTouches: [touchObj],\n touches: [touchObj],\n });\n return el.dispatchEvent(touchEvent);\n },\n { client, options, page, screen, type },\n );\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchFromTo(\n this: Page,\n selector: string,\n pageFrom?: Position,\n pageTo?: Position,\n clientFrom?: Position,\n clientTo?: Position,\n screenFrom?: Position,\n screenTo?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(\n this,\n 'touchstart',\n selector,\n pageFrom,\n screenFrom,\n clientFrom,\n options,\n );\n await dispatchTouchEvent(\n this,\n 'touchmove',\n selector,\n pageTo,\n screenTo,\n clientTo,\n options,\n );\n await dispatchTouchEvent(\n this,\n 'touchend',\n selector,\n pageTo,\n screenTo,\n clientTo,\n options,\n );\n}\n","import type { Page } from 'playwright';\nimport type { PlaywrightPageWithExtra } from './typings';\n\nimport {\n clearInput,\n dragDropSelector,\n mouseDownOnSelector,\n mouseFromTo,\n mouseMoveToSelector,\n scrollSelector,\n selectorMouseWheel,\n setSelectorSize,\n touchCancel,\n touchEnd,\n touchMove,\n touchStart,\n} from '.';\nimport { touchFromTo } from './touch-from-to';\n\nexport function extendPage<T extends Page>(page: T) {\n const thisPage = page as PlaywrightPageWithExtra & T;\n\n thisPage.dragDropSelector = dragDropSelector;\n thisPage.scrollSelector = scrollSelector;\n thisPage.mouseDownOnSelector = mouseDownOnSelector;\n thisPage.mouseMoveToSelector = mouseMoveToSelector;\n thisPage.setSelectorSize = setSelectorSize;\n thisPage.clearInput = clearInput;\n thisPage.selectorMouseWheel = selectorMouseWheel;\n thisPage.touchCancel = touchCancel;\n thisPage.touchMove = touchMove;\n thisPage.touchEnd = touchEnd;\n thisPage.touchStart = touchStart;\n thisPage.touchFromTo = touchFromTo;\n thisPage.mouseFromTo = mouseFromTo;\n\n return thisPage;\n}\n","import type { ExtendedPage, MouseOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function mouseDownOnSelector(\n this: ExtendedPage,\n selector: string,\n point?: Position,\n options?: MouseOptions,\n) {\n const { steps = 1 } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(box.width / 2, 'x', point);\n const mouseDownRelativeY = getPointByDirection(box.height / 2, 'y', point);\n\n // move mouse to center on selector\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n\n await this.mouse.down();\n}\n","import type { Page } from 'playwright';\nimport type { MouseFromToOptions, Position } from './typings';\n\nexport async function mouseFromTo(\n this: Page,\n from: Position,\n to: Position,\n options?: MouseFromToOptions,\n) {\n const { skipMouseUp, steps = 1 } = options || {};\n\n if (\n from.x === undefined ||\n from.y === undefined ||\n to.x === undefined ||\n to.y === undefined\n ) {\n throw new Error('mouseFromTo requires from/to coordinates (x and y).');\n }\n\n // move mouse to center of element or specified point\n await this.mouse.move(from.x, from.y, { steps });\n\n await this.mouse.down();\n\n await this.mouse.move(to.x, to.y, { steps });\n\n if (!skipMouseUp) await this.mouse.up();\n}\n","import type { ExtendedPage, MouseOptions, Position } from './typings';\nimport { getBoundingBox } from './utils/get-boundingBox';\nimport { getPointByDirection } from './utils/get-point-by-direction';\n\nexport async function mouseMoveToSelector(\n this: ExtendedPage,\n selector: string,\n point?: Position,\n options?: MouseOptions,\n) {\n const { steps = 1 } = options || {};\n\n const box = await getBoundingBox(this, selector);\n\n const mouseDownRelativeX = getPointByDirection(box.width / 2, 'x', point);\n const mouseDownRelativeY = getPointByDirection(box.height / 2, 'y', point);\n\n // move mouse to center on selector or specified point\n await this.mouse.move(box.x + mouseDownRelativeX, box.y + mouseDownRelativeY, {\n steps,\n });\n}\n","import type { ExtendedPage, Location } from './typings';\n\nexport async function scrollSelector(\n this: ExtendedPage,\n selector: string,\n scrollProperty: Location,\n) {\n await this.waitForSelector(selector);\n\n const result = await this.$eval(\n selector,\n (el, points) => {\n if (points.top) {\n (el as HTMLElement).scrollTop = points.top;\n }\n if (points.left) {\n (el as HTMLElement).scrollLeft = points.left;\n }\n },\n scrollProperty,\n );\n return result;\n}\n","import type { ExtendedPage, SelectorMouseWheelOptions } from './typings';\n\nexport async function selectorMouseWheel(\n this: ExtendedPage,\n selector: string,\n eventInitDict?: SelectorMouseWheelOptions,\n) {\n await this.waitForSelector(selector);\n\n const result = await this.$eval(\n selector,\n (el, opt) => {\n const event = new WheelEvent('wheel', opt);\n el.dispatchEvent(event);\n },\n eventInitDict,\n );\n return result;\n}\n","import type { ExtendedPage } from './typings';\n\nexport async function setSelectorSize(\n this: ExtendedPage,\n selector: string,\n width?: string,\n height?: string,\n) {\n await this.$eval(\n selector,\n (el, opt) => {\n if (opt.width !== undefined) {\n (el as HTMLElement).style.width = opt.width;\n }\n\n if (opt.height !== undefined) {\n (el as HTMLElement).style.height = opt.height;\n }\n },\n { height, width },\n );\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchCancel(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchcancel', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchEnd(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchend', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchMove(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchmove', selector, page, screen, client, options);\n}\n","import type { Page } from 'playwright';\nimport type { PageExtraTouchOptions, Position } from './typings';\nimport { dispatchTouchEvent } from './utils/dispatch-touch-event';\n\nexport async function touchStart(\n this: Page,\n selector: string,\n page?: Position,\n screen?: Position,\n client?: Position,\n options?: PageExtraTouchOptions,\n) {\n await dispatchTouchEvent(this, 'touchstart', selector, page, screen, client, options);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { buildArgsParam } from '@storybook/core/router';\n\nexport function storybookPropsToQuerystring(props?: ScreenshotProp) {\n if (!props || Object.keys(props).length === 0) return '';\n\n return buildArgsParam({}, props);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { storybookPropsToQuerystring } from './storybook-props-to-querystring';\n\nexport function argsToQuerystring(args?: ScreenshotProp) {\n return storybookPropsToQuerystring(args);\n}\n","import type { ScreenshotProp } from '../typings';\nimport { storybookPropsToQuerystring } from './storybook-props-to-querystring';\n\nexport function globalsToQuerystring(globals?: ScreenshotProp) {\n return storybookPropsToQuerystring(globals);\n}\n","import type { ScreenshotProp } from '../typings';\n\nexport function knobsToQuerystring(props?: ScreenshotProp) {\n if (!props) return '';\n\n const keys = Object.keys(props);\n\n const propQuery = keys.map((prop) => {\n const propVal = props[prop];\n if (Array.isArray(propVal)) {\n if (propVal.length > 0 && typeof propVal[0] === 'object') {\n return `knob-${prop}=${JSON.stringify(propVal)}`;\n }\n return `knob-${prop}=${propVal.join(',')}`;\n }\n if (typeof propVal === 'object') {\n return `knob-${prop}=${JSON.stringify(propVal)}`;\n }\n return `knob-${prop}=${propVal}`;\n });\n return encodeURI(propQuery.join('&'));\n}\n","import type { ScreenshotProp } from '../typings';\n\nimport normalize from 'normalize-url';\nimport { argsToQuerystring } from './args-to-querystring';\nimport { globalsToQuerystring } from './globals-to-querystring';\nimport { knobsToQuerystring } from './knobs-to-querystring';\n\nexport function constructStoryUrl(\n endpoint: string,\n id: string,\n props?: ScreenshotProp,\n args?: ScreenshotProp,\n globals?: ScreenshotProp,\n) {\n let normalized: string;\n\n if (/^\\.{0,2}[/\\\\]/.test(endpoint)) {\n // File-system path (./storybook-static, /abs/path, ../rel/path)\n normalized = `file:///${endpoint.replace(/\\\\/g, '/').replace(/^\\/+/, '')}`;\n } else if (/^https?:\\/\\//i.test(endpoint) || /^file:\\/\\//i.test(endpoint)) {\n // Already has explicit protocol\n normalized = normalize(endpoint);\n } else {\n // Bare hostname:port, IPv4, or plain hostname (e.g. localhost:1090)\n // Prepend http:// so normalize preserves it instead of defaulting to https://\n normalized = normalize(`http://${endpoint}`);\n }\n\n let storyUrl = `${normalized}/iframe.html?id=${id}`;\n\n const argsQuery = argsToQuerystring(args);\n if (argsQuery) {\n storyUrl = `${storyUrl}&args=${argsQuery}`;\n }\n\n const globalsQuery = globalsToQuerystring(globals);\n if (globalsQuery) {\n storyUrl = `${storyUrl}&globals=${globalsQuery}`;\n }\n\n if (props) {\n const propsQuery = knobsToQuerystring(props);\n if (propsQuery) {\n storyUrl = `${storyUrl}&${propsQuery}`;\n }\n }\n\n return storyUrl.replace(/\\\\/g, '/');\n}\n","import type { ActionSchema } from '../typings';\nimport { get } from 'object-path-immutable';\n\nexport function getActionSchema(\n schema: ActionSchema,\n key: string,\n): ActionSchema | undefined {\n if (!key) return undefined;\n\n const extendedKey = key.split('.').join('.properties.');\n const actionSchema = get(schema, extendedKey);\n return actionSchema;\n}\n","import type { ActionSchemaList, StoryAction } from '../typings';\nimport { getActionSchema } from './get-schema';\n\nexport function getActionArgs(action: StoryAction, actionSchema: ActionSchemaList) {\n const schema = getActionSchema(actionSchema, action.name);\n\n if (!schema) {\n throw new Error(\n `Unable to find '${action.name}', possibly this action has deprecated/removed from playwright and or from custom definitions.`,\n );\n }\n\n const parameters = (schema.parameters as Record<string, unknown> | undefined) || {};\n\n const args = Object.keys(parameters).reduce<unknown[]>((arr, actionName) => {\n const isRequired = schema.required && schema.required.includes(actionName);\n\n if (action && action.args && action.args[actionName] !== undefined) {\n const val = action.args[actionName];\n if (\n !isRequired &&\n val !== null &&\n (val === undefined ||\n (typeof val === 'object' && Object.keys(val).length === 0) ||\n (Array.isArray(val) && val.length === 0))\n ) {\n return arr;\n }\n\n arr.push(action.args[actionName]);\n } else {\n arr.push(undefined);\n }\n return arr;\n }, []);\n\n return args;\n}\n","import type { ScreenshotProp } from '../typings';\n\nexport function getScreenshotProp(\n ...candidates: Array<ScreenshotProp | undefined>\n): ScreenshotProp | undefined {\n for (let i = 0; i < candidates.length; i++) {\n const value = candidates[i];\n if (value && Object.keys(value).length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n","import type { ScreenshotProp } from '../typings';\nimport { getScreenshotProp } from './get-screenshot-prop';\n\ninterface ScreenshotGlobalsLike {\n globals?: ScreenshotProp;\n}\n\nexport const getScreenshotGlobals = (\n data?: ScreenshotGlobalsLike,\n): ScreenshotProp | undefined => {\n if (!data) return undefined;\n\n return getScreenshotProp(data.globals);\n};\n","import { ScreenshotProp } from '../typings';\nimport { getScreenshotProp } from './get-screenshot-prop';\n\ninterface ScreenshotArgsLike {\n args?: ScreenshotProp;\n props?: ScreenshotProp;\n}\n\nexport const getScreenshotArgs = (\n data?: ScreenshotArgsLike,\n): ScreenshotProp | undefined => {\n if (!data) return undefined;\n\n return getScreenshotProp(data.args, data.props);\n};\n","import type { ActionSchemaList, StoryAction } from '../typings';\nimport { getActionSchema } from './get-schema';\n\nexport interface ValidationResult {\n required?: string[];\n}\n\nexport interface ActionListValidationResult extends ValidationResult {\n id: string;\n name: string;\n}\n\nexport function validAction(\n schema: ActionSchemaList,\n action: StoryAction,\n): ValidationResult {\n const actionSchema = getActionSchema(schema, action.name);\n\n if (!actionSchema || !actionSchema.required || !actionSchema.required.length) return {};\n\n if (!action.args) {\n return { required: actionSchema.required };\n }\n\n const argKeys = Object.keys(action.args);\n\n if (argKeys.length === 0) {\n return { required: actionSchema.required };\n }\n\n const requiredParams: string[] = [];\n\n for (let i = 0; i < actionSchema.required.length; i++) {\n const requiredParam = actionSchema.required[i];\n const val = action.args[requiredParam];\n if (!val) {\n requiredParams.push(requiredParam);\n }\n }\n\n return {\n required: requiredParams.length === 0 ? undefined : requiredParams,\n };\n}\n\nexport function isValidAction(schema: ActionSchemaList, action: StoryAction) {\n const result = validAction(schema, action);\n\n return result.required === undefined;\n}\n\nexport function validateActionList(schema: ActionSchemaList, actions: StoryAction[]) {\n const result = actions.reduce<ActionListValidationResult[]>((arr, action) => {\n const res = validAction(schema, action);\n if (res.required) {\n arr.push({\n id: action.id,\n name: action.name,\n ...res,\n });\n }\n return arr;\n }, []);\n return result.length === 0 ? undefined : result;\n}\n","import type { Page } from 'playwright';\nimport type { Config } from '../../typings';\n\nlet configs: Config<Page>;\n\nexport function setConfig<T = Page>(conf: Config<T>) {\n configs = {\n ...(conf as unknown as Config<Page>),\n concurrencyLimit: {\n file: 1,\n story: 1,\n ...conf.concurrencyLimit,\n },\n };\n}\n\nexport function getConfigs() {\n if (!configs) {\n throw new Error('Configuration has not been set.');\n }\n\n return configs;\n}\n","{\n \"clearInput\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"timeout\": {\n \"type\": \"number\"\n },\n \"blur\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, waits for actionability checks, focuses the element, clear it and triggers an input event. If the element matching selector is not an <input>, <textarea> or [contenteditable] element, this method throws an error.\"\n },\n \"dragDropSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"mouseDownRelativeToSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n },\n \"skipMouseUp\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"to\"],\n \"description\": \"This method fetches an element with `selector`, and move it to the position given by user. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseFromTo\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"from\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"to\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n },\n \"skipMouseUp\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"from\", \"to\"],\n \"description\": \"This method will perform mouse down, move,and up from to selected location.\"\n },\n \"scrollSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"scrollProperty\": {\n \"type\": \"object\",\n \"properties\": {\n \"top\": {\n \"type\": \"number\"\n },\n \"left\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"scrollProperty\"],\n \"description\": \"This method fetches an element with `selector`, and set the selector scrollLeft and scrollTop. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseDownOnSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"point\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and perform mousedown on the center of selector. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"mouseMoveToSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"point\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"default\": 1\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and move the mouse to center of selector. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"setSelectorSize\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, set the height and with. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"selectorMouseWheel\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"eventInitDict\": {\n \"type\": \"object\",\n \"properties\": {\n \"deltaMode\": {\n \"type\": \"number\"\n },\n \"deltaX\": {\n \"type\": \"number\"\n },\n \"deltaY\": {\n \"type\": \"number\"\n },\n \"deltaZ\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch WheelEvent. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchStart\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchstart event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchMove\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchmove event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchEnd\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchend event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchCancel\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"page\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screen\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"client\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchcancel event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"touchFromTo\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n },\n \"pageFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"pageTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"clientFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"clientTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screenFrom\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"screenTo\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"bubbles\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"cancelable\": {\n \"type\": \"boolean\",\n \"default\": true\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method fetches an element with `selector`, and dispatch touchstart,touchmove and touchend event. If there's no element matching `selector`, the method waits until a matching element appears in the DOM.\"\n },\n \"waitForSelector\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to query for.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"state\": {\n \"type\": \"string\",\n \"enum\": [\"attached\", \"detached\", \"visible\", \"hidden\"],\n \"description\": \"Defaults to `'visible'`. Can be either:\\n- `'attached'` - wait for element to be present in DOM.\\n- `'detached'` - wait for element to not be present in DOM.\\n- `'visible'` - wait for element to have non-empty bounding box and no `visibility:hidden`. Note that element without any content or with `display:none` has an empty bounding box and is not considered visible.\\n- `'hidden'` - wait for element to be either detached from DOM, or have an empty bounding box or `visibility:hidden`. This is opposite to the `'visible'` option.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"options\"],\n \"description\": \"**NOTE** Use web assertions that assert visibility or a locator-based [locator.waitFor([options])](https://playwright.dev/docs/api/class-locator#locator-wait-for) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nReturns when element specified by selector satisfies [`state`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-state) option. Returns `null` if waiting for `hidden` or `detached`.\\n\\n**NOTE** Playwright automatically waits for element to be ready before performing an action. Using [Locator](https://playwright.dev/docs/api/class-locator) objects and web-first assertions makes the code wait-for-selector-free.\\n\\nWait for the [`selector`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-selector) to satisfy [`state`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-state) option (either appear/disappear from dom, or become visible/hidden). If at the moment of calling the method [`selector`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-selector) already satisfies the condition, the method will return immediately. If the selector doesn't satisfy the condition for the [`timeout`](https://playwright.dev/docs/api/class-page#page-wait-for-selector-option-timeout) milliseconds, the function will throw.\\n\\n**Usage**\\n\\nThis method works across navigations:\\n\\n```js const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.\\n\\n(async () => { const browser = await chromium.launch(); const page = await browser.newPage(); for (const currentURL of ['https://google.com', 'https://bbc.com']) { await page.goto(currentURL); const element = await page.waitForSelector('img'); console.log('Loaded image: ' + await element.getAttribute('src')); } await browser.close(); })(); ```\"\n },\n \"check\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.check([options])](https://playwright.dev/docs/api/class-locator#locator-check) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method checks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-check-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-check-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already checked, this method returns immediately. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-check-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element. 1. Ensure that the element is now checked. If not, this method throws.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-check-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"click\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"Actions that initiate navigations are waiting for these navigations to happen and for pages to start loading. You can opt out of waiting via setting this flag. You would only need this option in the exceptional cases such as navigating to inaccessible pages. Defaults to `false`.\",\n \"deprecated\": \"This option will default to `true` in the future.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.click([options])](https://playwright.dev/docs/api/class-locator#locator-click) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method clicks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-click-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-click-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-click-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-click-option-position). 1. Wait for initiated navigations to either succeed or fail, unless [`noWaitAfter`](https://playwright.dev/docs/api/class-page#page-click-option-no-wait-after) option is set.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-click-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"dblclick\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.dblclick([options])](https://playwright.dev/docs/api/class-locator#locator-dblclick) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method double clicks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-dblclick-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-dblclick-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-dblclick-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to double click in the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-dblclick-option-position).\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-dblclick-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\\n\\n**NOTE** `page.dblclick()` dispatches two `click` events and a single `dblclick` event.\"\n },\n \"fill\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Value to fill for the `<input>`, `<textarea>` or `[contenteditable]` element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"value\"],\n \"description\": \"**NOTE** Use locator-based [locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method waits for an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-fill-option-selector), waits for [actionability](https://playwright.dev/docs/actionability) checks, focuses the element, fills it and triggers an `input` event after filling. Note that you can pass an empty string to clear the input field.\\n\\nIf the target element is not an `<input>`, `<textarea>` or `[contenteditable]` element, this method throws an error. However, if the element is inside the `<label>` element that has an associated [control](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control), the control will be filled instead.\\n\\nTo send fine-grained keyboard events, use [locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\"\n },\n \"focus\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.focus([options])](https://playwright.dev/docs/api/class-locator#locator-focus) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method fetches an element with [`selector`](https://playwright.dev/docs/api/class-page#page-focus-option-selector) and focuses it. If there's no element matching [`selector`](https://playwright.dev/docs/api/class-page#page-focus-option-selector), the method waits until a matching element appears in the DOM.\"\n },\n \"hover\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"modifiers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Alt\", \"Control\", \"ControlOrMeta\", \"Meta\", \"Shift\"]\n },\n \"description\": \"Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current modifiers back. If not specified, currently pressed modifiers are used. \\\"ControlOrMeta\\\" resolves to \\\"Control\\\" on Windows and Linux and to \\\"Meta\\\" on macOS.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it. Note that keyboard `modifiers` will be pressed regardless of `trial` to allow testing elements which are only visible when those keys are pressed.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.hover([options])](https://playwright.dev/docs/api/class-locator#locator-hover) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method hovers over an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-hover-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-hover-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-hover-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to hover over the center of the element, or the specified [`position`](https://playwright.dev/docs/api/class-page#page-hover-option-position).\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-hover-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"press\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"Actions that initiate navigations are waiting for these navigations to happen and for pages to start loading. You can opt out of waiting via setting this flag. You would only need this option in the exceptional cases such as navigating to inaccessible pages. Defaults to `false`.\",\n \"deprecated\": \"This option will default to `true` in the future.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"key\"],\n \"description\": \"**NOTE** Use locator-based [locator.press(key[, options])](https://playwright.dev/docs/api/class-locator#locator-press) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nFocuses the element, and then uses [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) and [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\n[`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-page#page-press-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nShortcuts such as `key: \\\"Control+o\\\"`, `key: \\\"Control++` or `key: \\\"Control+Shift+T\\\"` are supported as well. When specified with the modifier, modifier is pressed and being held while the subsequent key is being pressed.\\n\\n**Usage**\\n\\n```js const page = await browser.newPage(); await page.goto('https://keycode.info'); await page.press('body', 'A'); await page.screenshot({ path: 'A.png' }); await page.press('body', 'ArrowLeft'); await page.screenshot({ path: 'ArrowLeft.png' }); await page.press('body', 'Shift+O'); await page.screenshot({ path: 'O.png' }); await browser.close(); ```\"\n },\n \"type\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"A text to type into a focused element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between key presses in milliseconds. Defaults to 0.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\", \"text\"],\n \"description\": \"Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text. `page.type` can be used to send fine-grained keyboard events. To fill values in form fields, use [page.fill(selector, value[, options])](https://playwright.dev/docs/api/class-page#page-fill).\\n\\nTo press a special key, like `Control` or `ArrowDown`, use [keyboard.press(key[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-press).\\n\\n**Usage**\",\n \"deprecated\": \"In most cases, you should use\\n[locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. You only need\\nto press keys one by one if there is special keyboard handling on the page - in this case use\\n[locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\"\n },\n \"uncheck\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\",\n \"description\": \"A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to bypass the [actionability](https://playwright.dev/docs/actionability) checks. Defaults to `false`.\"\n },\n \"noWaitAfter\": {\n \"type\": \"boolean\",\n \"description\": \"This option has no effect.\",\n \"deprecated\": \"This option has no effect.\"\n },\n \"position\": {\n \"type\": \"object\",\n \"properties\": {\n \"x\": {\n \"type\": \"number\"\n },\n \"y\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"additionalProperties\": false,\n \"description\": \"A point to use relative to the top-left corner of element padding box. If not specified, uses some visible point of the element.\"\n },\n \"strict\": {\n \"type\": \"boolean\",\n \"description\": \"When true, the call requires selector to resolve to a single element. If given selector resolves to more than one element, the call throws an exception.\"\n },\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) or [page.setDefaultTimeout(timeout)](https://playwright.dev/docs/api/class-page#page-set-default-timeout) methods.\"\n },\n \"trial\": {\n \"type\": \"boolean\",\n \"description\": \"When set, this method only performs the [actionability](https://playwright.dev/docs/actionability) checks and skips the action. Defaults to `false`. Useful to wait until the element is ready for the action without performing it.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"**NOTE** Use locator-based [locator.uncheck([options])](https://playwright.dev/docs/api/class-locator#locator-uncheck) instead. Read more about [locators](https://playwright.dev/docs/locators).\\n\\nThis method unchecks an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-uncheck-option-selector) by performing the following steps: 1. Find an element matching [`selector`](https://playwright.dev/docs/api/class-page#page-uncheck-option-selector). If there is none, wait until a matching element is attached to the DOM. 1. Ensure that matched element is a checkbox or a radio input. If not, this method throws. If the element is already unchecked, this method returns immediately. 1. Wait for [actionability](https://playwright.dev/docs/actionability) checks on the matched element, unless [`force`](https://playwright.dev/docs/api/class-page#page-uncheck-option-force) option is set. If the element is detached during the checks, the whole action is retried. 1. Scroll the element into view if needed. 1. Use [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse) to click in the center of the element. 1. Ensure that the element is now unchecked. If not, this method throws.\\n\\nWhen all steps combined have not finished during the specified [`timeout`](https://playwright.dev/docs/api/class-page#page-uncheck-option-timeout), this method throws a [TimeoutError](https://playwright.dev/docs/api/class-timeouterror). Passing zero timeout disables this.\"\n },\n \"waitForTimeout\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"timeout\": {\n \"type\": \"number\",\n \"description\": \"A timeout to wait for\"\n }\n },\n \"required\": [\"timeout\"],\n \"description\": \"**NOTE** Never wait for timeout in production. Tests that wait for time are inherently flaky. Use [Locator](https://playwright.dev/docs/api/class-locator) actions and web assertions that wait automatically.\\n\\nWaits for the given [`timeout`](https://playwright.dev/docs/api/class-page#page-wait-for-timeout-option-timeout) in milliseconds.\\n\\nNote that `page.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going to be flaky. Use signals such as network events, selectors becoming visible and others instead.\\n\\n**Usage**\\n\\n```js // wait for 1 second await page.waitForTimeout(1000); ```\"\n },\n \"keyboard\": {\n \"type\": \"object\",\n \"properties\": {\n \"down\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n }\n },\n \"required\": [\"key\"],\n \"description\": \"Dispatches a `keydown` event.\\n\\n[`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-down-option-key) is a modifier key, `Shift`, `Meta`, `Control`, or `Alt`, subsequent key presses will be sent with that modifier active. To release the modifier key, use [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\nAfter the key is pressed once, subsequent calls to [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) will have [repeat](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat) set to true. To release the key, use [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\\n\\n**NOTE** Modifier keys DO influence `keyboard.down`. Holding down `Shift` will type the text in upper case.\"\n },\n \"insertText\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Sets input to the specified text value.\"\n }\n },\n \"required\": [\"text\"],\n \"description\": \"Dispatches only `input` event, does not emit the `keydown`, `keyup` or `keypress` events.\\n\\n**Usage**\\n\\n```js page.keyboard.insertText('嗨'); ```\\n\\n**NOTE** Modifier keys DO NOT effect `keyboard.insertText`. Holding down `Shift` will not type the text in upper case.\"\n },\n \"press\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `keydown` and `keyup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"key\"],\n \"description\": \"**NOTE** In most cases, you should use [locator.press(key[, options])](https://playwright.dev/docs/api/class-locator#locator-press) instead.\\n\\n[`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) can specify the intended [keyboardEvent.key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) value or a single character to generate the text for. A superset of the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) values can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values). Examples of the keys are:\\n\\n`F1` - `F12`, `Digit0`- `Digit9`, `KeyA`- `KeyZ`, `Backquote`, `Minus`, `Equal`, `Backslash`, `Backspace`, `Tab`, `Delete`, `Escape`, `ArrowDown`, `End`, `Enter`, `Home`, `Insert`, `PageDown`, `PageUp`, `ArrowRight`, `ArrowUp`, etc.\\n\\nFollowing modification shortcuts are also supported: `Shift`, `Control`, `Alt`, `Meta`, `ShiftLeft`, `ControlOrMeta`. `ControlOrMeta` resolves to `Control` on Windows and Linux and to `Meta` on macOS.\\n\\nHolding down `Shift` will type the text that corresponds to the [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) in the upper case.\\n\\nIf [`key`](https://playwright.dev/docs/api/class-keyboard#keyboard-press-option-key) is a single character, it is case-sensitive, so the values `a` and `A` will generate different respective texts.\\n\\nShortcuts such as `key: \\\"Control+o\\\"`, `key: \\\"Control++` or `key: \\\"Control+Shift+T\\\"` are supported as well. When specified with the modifier, modifier is pressed and being held while the subsequent key is being pressed.\\n\\n**Usage**\\n\\n```js const page = await browser.newPage(); await page.goto('https://keycode.info'); await page.keyboard.press('A'); await page.screenshot({ path: 'A.png' }); await page.keyboard.press('ArrowLeft'); await page.screenshot({ path: 'ArrowLeft.png' }); await page.keyboard.press('Shift+O'); await page.screenshot({ path: 'O.png' }); await browser.close(); ```\\n\\nShortcut for [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down) and [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up).\"\n },\n \"type\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"A text to type into a focused element.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between key presses in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"text\"],\n \"description\": \"**NOTE** In most cases, you should use [locator.fill(value[, options])](https://playwright.dev/docs/api/class-locator#locator-fill) instead. You only need to press keys one by one if there is special keyboard handling on the page - in this case use [locator.pressSequentially(text[, options])](https://playwright.dev/docs/api/class-locator#locator-press-sequentially).\\n\\nSends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the text.\\n\\nTo press a special key, like `Control` or `ArrowDown`, use [keyboard.press(key[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-press).\\n\\n**Usage**\\n\\n```js await page.keyboard.type('Hello'); // Types instantly await page.keyboard.type('World', { delay: 100 }); // Types slower, like a user ```\\n\\n**NOTE** Modifier keys DO NOT effect `keyboard.type`. Holding down `Shift` will not type the text in upper case.\\n\\n**NOTE** For characters that are not on a US keyboard, only an `input` event will be sent.\"\n },\n \"up\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Name of the key to press or a character to generate, such as `ArrowLeft` or `a`.\"\n }\n },\n \"required\": [\"key\"],\n \"description\": \"Dispatches a `keyup` event.\"\n }\n },\n \"required\": [\"down\", \"insertText\", \"press\", \"type\", \"up\"],\n \"additionalProperties\": false,\n \"description\": \"Keyboard provides an api for managing a virtual keyboard. The high level api is [keyboard.type(text[, options])](https://playwright.dev/docs/api/class-keyboard#keyboard-type), which takes raw characters and generates proper `keydown`, `keypress`/`input`, and `keyup` events on your page.\\n\\nFor finer control, you can use [keyboard.down(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-down), [keyboard.up(key)](https://playwright.dev/docs/api/class-keyboard#keyboard-up), and [keyboard.insertText(text)](https://playwright.dev/docs/api/class-keyboard#keyboard-insert-text) to manually fire events as if they were generated from a real keyboard.\\n\\nAn example of holding down `Shift` in order to select and delete some text:\\n\\n```js await page.keyboard.type('Hello World!'); await page.keyboard.press('ArrowLeft');\\n\\nawait page.keyboard.down('Shift'); for (let i = 0; i < ' World'.length; i++) await page.keyboard.press('ArrowLeft'); await page.keyboard.up('Shift');\\n\\nawait page.keyboard.press('Backspace'); // Result text will end up saying 'Hello!' ```\\n\\nAn example of pressing uppercase `A`\\n\\n```js await page.keyboard.press('Shift+KeyA'); // or await page.keyboard.press('Shift+A'); ```\\n\\nAn example to trigger select-all with the keyboard\\n\\n```js await page.keyboard.press('ControlOrMeta+A'); ```\"\n },\n \"mouse\": {\n \"type\": \"object\",\n \"properties\": {\n \"click\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Shortcut for [mouse.move(x, y[, options])](https://playwright.dev/docs/api/class-mouse#mouse-move), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down), [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up).\"\n },\n \"dblclick\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"delay\": {\n \"type\": \"number\",\n \"description\": \"Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Shortcut for [mouse.move(x, y[, options])](https://playwright.dev/docs/api/class-mouse#mouse-move), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down), [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up), [mouse.down([options])](https://playwright.dev/docs/api/class-mouse#mouse-down) and [mouse.up([options])](https://playwright.dev/docs/api/class-mouse#mouse-up).\"\n },\n \"down\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"Dispatches a `mousedown` event.\"\n },\n \"move\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"steps\": {\n \"type\": \"number\",\n \"description\": \"Defaults to 1. Sends `n` interpolated `mousemove` events to represent travel between Playwright's current cursor position and the provided destination. When set to 1, emits a single `mousemove` event at the destination location.\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Dispatches a `mousemove` event.\"\n },\n \"up\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"options\": {\n \"type\": \"object\",\n \"properties\": {\n \"button\": {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"middle\"],\n \"description\": \"Defaults to `left`.\"\n },\n \"clickCount\": {\n \"type\": \"number\",\n \"description\": \"defaults to 1. See [UIEvent.detail].\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"Dispatches a `mouseup` event.\"\n }\n },\n \"required\": [\"click\", \"dblclick\", \"down\", \"move\", \"up\"],\n \"additionalProperties\": false,\n \"description\": \"The Mouse class operates in main-frame CSS pixels relative to the top-left corner of the viewport.\\n\\n**NOTE** If you want to debug where the mouse moved, you can use the [Trace viewer](https://playwright.dev/docs/trace-viewer-intro) or [Playwright Inspector](https://playwright.dev/docs/running-tests). A red dot showing the location of the mouse will be shown for every mouse action.\\n\\nEvery `page` object has its own Mouse, accessible with [page.mouse](https://playwright.dev/docs/api/class-page#page-mouse).\\n\\n```js // Using ‘page.mouse’ to trace a 100x100 square. await page.mouse.move(0, 0); await page.mouse.down(); await page.mouse.move(0, 100); await page.mouse.move(100, 100); await page.mouse.move(100, 0); await page.mouse.move(0, 0); await page.mouse.up(); ```\"\n },\n \"touchscreen\": {\n \"type\": \"object\",\n \"properties\": {\n \"tap\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"x\": {\n \"type\": \"number\",\n \"description\": \"X coordinate relative to the main frame's viewport in CSS pixels.\"\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"Y coordinate relative to the main frame's viewport in CSS pixels.\"\n }\n },\n \"required\": [\"x\", \"y\"],\n \"description\": \"Dispatches a `touchstart` and `touchend` event with a single touch at the position ([`x`](https://playwright.dev/docs/api/class-touchscreen#touchscreen-tap-option-x),[`y`](https://playwright.dev/docs/api/class-touchscreen#touchscreen-tap-option-y)).\\n\\n**NOTE** [page.tap(selector[, options])](https://playwright.dev/docs/api/class-page#page-tap) the method will throw if [`hasTouch`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-has-touch) option of the browser context is false.\"\n }\n },\n \"required\": [\"tap\"],\n \"additionalProperties\": false,\n \"description\": \"The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the touchscreen can only be used in browser contexts that have been initialized with `hasTouch` set to true.\\n\\nThis class is limited to emulating tap gestures. For examples of other gestures simulated by manually dispatching touch events, see the [emulating legacy touch events](https://playwright.dev/docs/touch-events) page.\"\n },\n \"takeScreenshot\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"This method will take a screenshot at the position that it activated, its useful for taking a screenshot in sequence for events/actions. In the end the screenshots will be merged with the final screenshot.\"\n },\n \"takeScreenshotAll\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"This method will take a screenshot after each action, its useful for looking at over all action execution. In the end the screenshots will be merged.\"\n },\n \"takeElementScreenshot\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"selector\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"selector\"],\n \"description\": \"This method will take a screenshot of an element.\"\n },\n \"takeScreenshotOptions\": {\n \"kind\": \"function\",\n \"type\": \"Promise\",\n \"parameters\": {\n \"mergeType\": {\n \"type\": \"string\",\n \"enum\": [\"stitch\", \"overlay\"]\n },\n \"stitchOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\"vertical\", \"horizontal\"],\n \"description\": \"Direction of the merged image.\"\n },\n \"align\": {\n \"type\": \"string\",\n \"enum\": [\"start\", \"center\", \"end\"],\n \"description\": \"Aligning of given images. If the images are not all the same size, images will be sorted to largest image. Possible values are `start`, `center` and `end`. Default is `start`.\"\n },\n \"offset\": {\n \"type\": \"number\",\n \"description\": \"Offset in pixels between each image. Default is `0`\"\n },\n \"margin\": {\n \"type\": \"string\",\n \"description\": \"Set the margin of image, considered as standard css shorthand properties (e.g. '40 40 0 10')\",\n \"default\": \"0 0 0 0\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Set the background color of image.\"\n }\n },\n \"additionalProperties\": false\n },\n \"overlayOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"blend\": {\n \"type\": \"string\",\n \"enum\": [\n \"clear\",\n \"source\",\n \"over\",\n \"in\",\n \"out\",\n \"atop\",\n \"dest\",\n \"dest-over\",\n \"dest-in\",\n \"dest-out\",\n \"dest-atop\",\n \"xor\",\n \"add\",\n \"saturate\",\n \"multiply\",\n \"screen\",\n \"overlay\",\n \"darken\",\n \"lighten\",\n \"colour-dodge\",\n \"colour-burn\",\n \"hard-light\",\n \"soft-light\",\n \"difference\",\n \"exclusion\"\n ],\n \"description\": \"How to blend this image with the image below. (optional)\",\n \"default\": \"multiply\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"required\": [],\n \"description\": \"The purpose of this action is to have centralized options for all screenshots. This action can be used in conjunction with takeScreenshot action only. Only one instance can be used.\"\n }\n}\n","import type { ActionSchemaList } from '../../typings';\nimport { getConfigs } from '../server/configs';\nimport actionSchema from '../server/data/action-schema.json';\n\nexport function getActionsSchema() {\n let schema = actionSchema as ActionSchemaList;\n\n const customSchema = getConfigs().customActionSchema;\n\n if (customSchema) {\n schema = { ...schema, ...customSchema };\n }\n return schema;\n}\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\nimport { getActionArgs, isValidAction } from '../../../utils';\nimport { getActionsSchema } from '../../services/get-actions-schema';\n\nexport async function executeAction(page: Page, action: StoryAction) {\n const schema = getActionsSchema();\n\n if (!isValidAction(schema, action)) {\n return;\n }\n\n const args = getActionArgs(action, schema);\n\n const actionNames = action.name.split('.');\n let pageObj: unknown = page;\n\n const pageObjects: unknown[] = [pageObj];\n\n for (let i = 0; i < actionNames.length; i++) {\n const name = actionNames[i];\n\n if (\n (typeof pageObj !== 'object' && typeof pageObj !== 'function') ||\n pageObj === null\n ) {\n break;\n }\n\n const nextPageObj = (pageObj as Record<string, unknown>)[name];\n if (nextPageObj === undefined) break;\n\n pageObj = nextPageObj;\n pageObjects.push(pageObj);\n }\n\n if (pageObjects.length === 1) return;\n\n if (typeof pageObj !== 'function') return;\n\n return await pageObj.call(pageObjects[pageObjects.length - 2], ...args);\n}\n","// https://gist.github.com/aslushnikov/94108a4094532c7752135c42e12a00eb\n// This injects a box into the page that moves with the mouse;\n// Useful for debugging\n\nimport type { Page } from 'playwright';\n\nasync function installMouseHelper(page: Page) {\n await page.waitForLoadState('load');\n await page.evaluate(`\n (() => {\n if (window !== window.parent) return;\n const box = document.createElement('playwright-mouse-pointer');\n const styleElement = document.createElement('style');\n\n function getHighestZIndex() {\n let highestZIndex = 0;\n let currentZIndex = 0;\n const nodes = document.body.getElementsByTagName('*');\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node === box) continue;\n currentZIndex = Number(window.getComputedStyle(node).zIndex);\n if (currentZIndex > highestZIndex) {\n highestZIndex = currentZIndex;\n }\n }\n\n return highestZIndex + 1;\n }\n\n styleElement.innerHTML = \\\n 'playwright-mouse-pointer {' +\n 'position: absolute !important;' +\n 'top: -100px;' +\n 'z-index: 1000;' +\n 'left: -100px;' +\n 'width: 14px;' +\n 'height: 14px;' +\n 'background: rgba(0, 0, 0, 0.39);' +\n 'border: 2px solid #fbfbfb9e !important;' +\n 'border-radius: 14px;' +\n 'margin: -8px 0 0 -8px;' +\n 'padding: 0;' +\n 'pointer-events: none !important;' +\n 'box-sizing: content-box !important;' +\n '}' +\n 'playwright-mouse-pointer.button-mousedown {' +\n 'background: rgba(243, 169, 4, 0.87);' +\n '}';\n\n document.head.appendChild(styleElement);\n document.body.appendChild(box);\n\n function setPosition(e) {\n const touch =\n (e.touches && e.touches[0]) ||\n (e.changedTouches && e.changedTouches[0]);\n\n let pageY = e.pageY;\n let pageX = e.pageX;\n\n if (touch) {\n pageY = touch.pageY;\n pageX = touch.pageX;\n }\n\n box.style.left = pageX + 'px';\n box.style.top = pageY + 'px';\n }\n\n document.addEventListener(\n 'mousemove',\n (event) => {\n setPosition(event);\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'mousedown',\n (event) => {\n setPosition(event);\n box.classList.add('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'mouseup',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchstart',\n (event) => {\n setPosition(event);\n box.classList.add('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchend',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchcancel',\n () => {\n box.classList.remove('button-mousedown');\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n\n document.addEventListener(\n 'touchmove',\n (event) => {\n setPosition(event);\n box.style.zIndex = getHighestZIndex().toString();\n },\n true,\n );\n })();\n `);\n}\n\nexport { installMouseHelper };\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\n\nconst waitActions = [\n 'waitForSelector',\n 'waitForTimeout',\n 'takeScreenshot',\n 'takeScreenshotAll',\n 'takeScreenshotOptions',\n];\n\nexport function isInteractiveAction(action: StoryAction<Page>) {\n return !waitActions.includes(action.name);\n}\n","import type { Page } from 'playwright';\nimport type { ActionSet } from '../../../typings';\n\nexport async function releaseModifierKey(page: Page, actionSets: ActionSet[]) {\n if (actionSets) {\n const modifierKeys = ['Shift', 'Meta', 'Control', 'Alt'];\n\n for (let i = 0; i < actionSets.length; i++) {\n const actionSet = actionSets[i];\n for (let x = 0; x < actionSet.actions.length; x++) {\n const action = actionSet.actions[x];\n if (\n action.name === 'keyboard.down' &&\n action.args &&\n action.args.key &&\n modifierKeys.includes(action.args.key as string)\n ) {\n await page.keyboard.up(action.args.key as string);\n }\n }\n }\n }\n}\n","import type { Page } from 'playwright';\nimport type { StoryAction } from '../../../typings';\nimport { isInteractiveAction } from './is-interactive-action';\n\nexport function shouldTakeScreenshot(\n actions: StoryAction<Page>[],\n currentPosition: number,\n enabled?: boolean,\n) {\n // const action = actions[currentPosition];\n\n // if (waitActions.includes(action.name)) return false;\n\n const nextAction = actions[currentPosition + 1];\n\n return (\n enabled &&\n actions.length > 1 &&\n actions.length > currentPosition + 1 &&\n nextAction &&\n isInteractiveAction(nextAction)\n );\n}\n","export const STORYBOOK_ROOT_ID = 'storybook-root';\nexport const STORYBOOK_ROOT_SELECTOR = `html>body>#${STORYBOOK_ROOT_ID}`;\n","import type { Page } from 'playwright';\nimport { STORYBOOK_ROOT_ID } from '../../../constants';\nexport const STORY_RENDER_TIMEOUT = 30000;\n\ntype StoryRenderLike = {\n id?: string;\n phase?: string;\n};\n\nexport interface StoryReadyPredicateInput {\n targetStoryId: string;\n}\n\n/**\n * Executed in the browser context by Playwright waitForFunction.\n */\nexport function storyRenderedReadyPredicate({\n targetStoryId,\n}: StoryReadyPredicateInput): boolean {\n const preview = (\n globalThis as {\n __STORYBOOK_PREVIEW__?: { storyRenders?: StoryRenderLike[] };\n }\n ).__STORYBOOK_PREVIEW__;\n\n const storyRenders = preview?.storyRenders || [];\n\n const selectedRender =\n storyRenders.find((render) => render?.id === targetStoryId) ||\n storyRenders.find(\n (render) => render?.phase === 'completed' || render?.phase === 'finished',\n );\n\n if (selectedRender) {\n return selectedRender.phase === 'completed' || selectedRender.phase === 'finished';\n }\n\n const storyRoot = document.getElementById(STORYBOOK_ROOT_ID);\n\n const hasMountedContent = (storyRoot?.childElementCount || 0) > 0;\n\n if (!hasMountedContent) {\n return false;\n }\n\n return ['interactive', 'complete'].includes(document.readyState);\n}\n\n/**\n * Executed in the browser context by Playwright evaluate.\n */\nexport async function settleStoryRender(): Promise<void> {\n const waitForAnimationFrame = async () => {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n };\n\n await waitForAnimationFrame();\n await waitForAnimationFrame();\n\n try {\n const fonts = (\n document as Document & {\n fonts?: {\n ready?: Promise<unknown>;\n };\n }\n ).fonts;\n\n if (fonts?.ready) {\n await fonts.ready;\n }\n } catch {\n // Ignore font API failures and continue.\n }\n}\n\nexport async function waitForStoryRendered(\n page: Page,\n storyId: string,\n timeout = STORY_RENDER_TIMEOUT,\n): Promise<void> {\n try {\n await page.waitForFunction(\n storyRenderedReadyPredicate,\n {\n targetStoryId: storyId,\n },\n {\n timeout,\n },\n );\n\n await page.evaluate(settleStoryRender);\n } catch {\n // Best-effort wait. If Storybook internals are unavailable, continue without blocking.\n }\n}\n","import type { ElementHandle, Page } from 'playwright';\nimport type { TakeScreenshotInput } from '../../schema';\nimport type {\n BrowserContextOptions,\n Config,\n ScreenshotImageData,\n StoryAction,\n} from '../../typings';\nimport type {\n TakeScreenshotOptionsParams,\n TakeScreenshotParams,\n} from '../typings/schema-types';\nimport joinImage from 'join-images';\nimport sharp from 'sharp';\nimport { extendPage } from '../../page-extra';\nimport { constructStoryUrl, getScreenshotArgs, getScreenshotGlobals } from '../../utils';\nimport { getConfigs } from '../server/configs';\nimport { executeAction } from '../server/utils/execute-action';\nimport { installMouseHelper } from '../server/utils/install-mouse-helper';\nimport { isInteractiveAction } from './utils/is-interactive-action';\nimport { releaseModifierKey } from './utils/release-modifier-Key';\nimport { shouldTakeScreenshot } from './utils/should-take-screenshot';\nimport { waitForStoryRendered } from './utils/wait-for-story-rendered';\n\ninterface ImageInfo {\n buffer: Buffer;\n options?: TakeScreenshotParams;\n}\n\nasync function takeScreenshot(\n page: Page,\n data: TakeScreenshotInput,\n configs: Config<Page>,\n handler?: ElementHandle<SVGElement | HTMLElement>,\n) {\n const requestData = {\n ...data,\n requestId: data.requestId || '',\n };\n\n if (configs.beforeScreenshot) {\n await configs.beforeScreenshot(page, requestData, requestData);\n }\n\n if (handler) {\n return handler.screenshot(data.screenshotOptions);\n }\n\n return page.screenshot(data.screenshotOptions);\n}\n\nexport async function makeScreenshot(\n data: TakeScreenshotInput,\n convertToBase64?: boolean,\n): Promise<ScreenshotImageData> {\n const requestData = {\n ...data,\n requestId: data.requestId || '',\n };\n\n const configs = getConfigs();\n\n const { screenshotOptions: defaultScreenshotOptions = {} } = configs;\n\n const browserOptions = data.browserOptions as BrowserContextOptions;\n\n const page = await configs.getPage(\n requestData.browserType,\n browserOptions,\n requestData,\n );\n\n if (!page) {\n throw new Error('Make sure to return an instance of a page from getPage.');\n }\n\n extendPage(page);\n\n const args = getScreenshotArgs(data);\n const globals = getScreenshotGlobals(data);\n\n let url = constructStoryUrl(\n configs.storybookEndpoint,\n data.storyId,\n data.props,\n args,\n globals,\n );\n\n if (configs.afterUrlConstruction) {\n url = configs.afterUrlConstruction(url, requestData);\n }\n\n await page.goto(url, configs.pageGotoOptions);\n\n if (configs.waitForStoryRender !== false) {\n await waitForStoryRendered(page, data.storyId, configs.storyRenderTimeout);\n }\n\n if (configs.afterNavigation) {\n await configs.afterNavigation(page, requestData);\n }\n\n if (browserOptions && browserOptions.cursor) {\n await installMouseHelper(page);\n }\n\n const imageInfos: ImageInfo[] = [];\n\n let screenshotOptionAction: StoryAction | undefined;\n\n let lastAction: StoryAction | undefined;\n\n if (data.actionSets) {\n const actions = data.actionSets.reduce((arr, actionSet) => {\n arr = [...arr, ...actionSet.actions];\n return arr;\n }, [] as StoryAction[]);\n\n lastAction = actions.slice(-1)[0];\n\n const takeScreenshotAll = actions.find((x) => x.name === 'takeScreenshotAll');\n\n screenshotOptionAction = actions.find((a) => a.name === 'takeScreenshotOptions');\n\n const filterActions = actions.filter(\n (a) => !['takeScreenshotAll', 'takeScreenshotOptions'].includes(a.name),\n );\n\n /**\n * Take first image of current page before any action executed\n */\n if (\n takeScreenshotAll &&\n filterActions.filter((a) => isInteractiveAction(a)).length > 0\n ) {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: takeScreenshotAll.args,\n });\n }\n\n for (let i = 0; i < filterActions.length; i++) {\n const action = filterActions[i];\n\n if (action.name === 'takeElementScreenshot') {\n if (action && action.args && action.args.selector) {\n const elementHandle = await page.$(action.args.selector as string);\n\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs, elementHandle || undefined),\n options: action.args,\n });\n }\n continue;\n }\n\n if (action.name === 'takeScreenshot') {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: action.args,\n });\n continue;\n }\n\n await executeAction(page, action);\n\n if (shouldTakeScreenshot(filterActions, i, Boolean(takeScreenshotAll))) {\n imageInfos.push({\n buffer: await takeScreenshot(page, data, configs),\n options: takeScreenshotAll?.args || {},\n });\n }\n }\n }\n\n const isTakeElementScreenshotAtLast =\n lastAction &&\n (lastAction.name === 'takeElementScreenshot' || lastAction.name === 'takeScreenshot');\n\n let buffer: Buffer | undefined;\n\n if (!isTakeElementScreenshotAtLast) {\n buffer = await takeScreenshot(page, data, configs);\n }\n\n if (configs.releaseModifierKey) {\n await releaseModifierKey(page, data.actionSets || []);\n }\n\n if (configs.afterScreenshot) {\n await configs.afterScreenshot(page, requestData);\n }\n\n if (imageInfos.length) {\n const format =\n data && data.screenshotOptions && data.screenshotOptions.type\n ? data.screenshotOptions.type\n : 'png';\n\n let options: TakeScreenshotOptionsParams =\n screenshotOptionAction && screenshotOptionAction.args\n ? screenshotOptionAction.args\n : {};\n\n options = {\n mergeType: options.mergeType\n ? options.mergeType\n : defaultScreenshotOptions.mergeType || 'stitch',\n overlayOptions: {\n ...defaultScreenshotOptions.overlayOptions,\n ...options.overlayOptions,\n },\n stitchOptions: {\n ...defaultScreenshotOptions.stitchOptions,\n ...options.stitchOptions,\n },\n };\n\n if (options.mergeType === 'stitch') {\n const screenshotsBuffers = imageInfos.map((x) => x.buffer);\n\n if (buffer) {\n screenshotsBuffers.push(buffer);\n }\n\n buffer = await (\n await joinImage(screenshotsBuffers, {\n ...options.stitchOptions,\n })\n )\n .toFormat(format)\n .toBuffer();\n } else {\n const baseBuffer = buffer || imageInfos[0]?.buffer;\n\n if (!baseBuffer) {\n throw new Error('Unable to create screenshot image buffer.');\n }\n\n const overlaySources =\n buffer === undefined && imageInfos.length === 1\n ? imageInfos\n : imageInfos.filter((_, index) => !(buffer === undefined && index === 0));\n\n const overlays = overlaySources.map((x) => ({\n blend: 'multiply' as const,\n input: x.buffer,\n ...options.overlayOptions,\n ...(x.options ? x.options.stitchOptions : {}),\n }));\n\n buffer = await sharp(baseBuffer).composite(overlays).toFormat(format).toBuffer();\n }\n }\n\n if (!buffer) {\n throw new Error('Unable to create screenshot image buffer.');\n }\n\n return {\n base64: convertToBase64 ? buffer.toString('base64') : undefined,\n browserName: data.browserType,\n buffer,\n };\n}\n","import type { PlaywrightData, ScreenshotData } from '../../../typings';\n\nexport function setStoryScreenshotOptions(\n storyData: PlaywrightData,\n screenshot: ScreenshotData,\n) {\n if (storyData.browserOptions && screenshot.browserOptionsId) {\n screenshot.browserOptions = storyData.browserOptions[screenshot.browserOptionsId];\n }\n if (storyData.screenshotOptions && screenshot.screenshotOptionsId) {\n screenshot.screenshotOptions =\n storyData.screenshotOptions[screenshot.screenshotOptionsId];\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport glob from 'fast-glob';\nimport { getConfigs } from '../api/server/configs';\n\ninterface StorybookIndexEntry {\n importPath?: string;\n}\n\ninterface StorybookIndexResponse {\n entries?: Record<string, StorybookIndexEntry>;\n}\n\ninterface GetPlaywrightConfigFilesOptions {\n cwd?: string;\n storybookEndpoint?: string;\n}\n\nfunction getStorybookEndpoint(options: GetPlaywrightConfigFilesOptions) {\n if (options.storybookEndpoint) {\n return options.storybookEndpoint;\n }\n\n try {\n return getConfigs().storybookEndpoint;\n } catch {\n return undefined;\n }\n}\n\nfunction toPosixPath(filePath: string) {\n return filePath.replace(/\\\\/g, '/');\n}\n\nfunction getLookupPattern(configPath?: string | '*') {\n return configPath && configPath !== '*' ? configPath : '**/*.playwright.json';\n}\n\nfunction normalizeStoryImportPath(importPath: string) {\n return importPath.split('#')[0]?.split('?')[0] ?? '';\n}\n\nfunction toStoryPath(importPath: string, cwd: string) {\n if (importPath.startsWith('/@fs/')) {\n return path.normalize(importPath.replace('/@fs/', ''));\n }\n\n return path.resolve(cwd, importPath);\n}\n\nfunction toPlaywrightJsonPath(storyPath: string) {\n const parsed = path.parse(storyPath);\n return path.join(parsed.dir, `${parsed.name}.playwright.json`);\n}\n\nfunction extractImportPaths(indexData: unknown) {\n if (!indexData || typeof indexData !== 'object') {\n return [];\n }\n\n const entries = (indexData as StorybookIndexResponse).entries;\n if (!entries) {\n return [];\n }\n\n return Object.values(entries).reduce<string[]>((result, entry) => {\n if (typeof entry.importPath === 'string' && entry.importPath.length > 0) {\n result.push(entry.importPath);\n }\n\n return result;\n }, []);\n}\n\nfunction isHttpUrl(url: string) {\n return /^https?:\\/\\//i.test(url);\n}\n\nasync function loadStorybookIndex(storybookEndpoint: string) {\n if (isHttpUrl(storybookEndpoint)) {\n const endpoint = storybookEndpoint.endsWith('/')\n ? storybookEndpoint\n : `${storybookEndpoint}/`;\n const indexUrl = new URL('index.json', endpoint).toString();\n const response = await fetch(indexUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as unknown;\n return extractImportPaths(data);\n }\n\n const endpointPath = storybookEndpoint.startsWith('file://')\n ? fileURLToPath(storybookEndpoint)\n : path.resolve(storybookEndpoint);\n const indexPath = path.join(endpointPath, 'index.json');\n\n if (!fs.existsSync(indexPath)) {\n return [];\n }\n\n const content = await fs.promises.readFile(indexPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n\n return extractImportPaths(parsed);\n}\n\nasync function getStorybookDerivedFiles(storybookEndpoint: string, cwd: string) {\n try {\n const importPaths = await loadStorybookIndex(storybookEndpoint);\n const files = new Set<string>();\n\n importPaths.forEach((importPath) => {\n const normalizedImportPath = normalizeStoryImportPath(importPath);\n if (!normalizedImportPath) {\n return;\n }\n\n const storyPath = toStoryPath(normalizedImportPath, cwd);\n const playwrightFilePath = toPlaywrightJsonPath(storyPath);\n\n if (!fs.existsSync(playwrightFilePath)) {\n return;\n }\n\n const relativeFilePath = toPosixPath(path.relative(cwd, playwrightFilePath));\n if (relativeFilePath.length > 0) {\n files.add(relativeFilePath);\n }\n });\n\n return Array.from(files);\n } catch {\n return [];\n }\n}\n\nexport async function getPlaywrightConfigFiles(\n configPath?: string | '*',\n options: GetPlaywrightConfigFilesOptions = {},\n) {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();\n const lookupPattern = getLookupPattern(configPath);\n\n const files = await glob([lookupPattern, '!node_modules/**'], {\n cwd,\n });\n\n if (configPath && configPath !== '*') {\n return files;\n }\n\n const storybookEndpoint = getStorybookEndpoint(options);\n\n if (!storybookEndpoint) {\n return files;\n }\n\n const storybookDerivedFiles = await getStorybookDerivedFiles(storybookEndpoint, cwd);\n\n if (!storybookDerivedFiles.length) {\n return files;\n }\n\n return Array.from(new Set([...files, ...storybookDerivedFiles]));\n}\n","import type { ScreenshotPathInfo } from './api/server/utils/get-screenshot-paths';\nimport type { RequestData } from './typings/request';\nimport fs from 'node:fs';\nimport { getStoryPlaywrightData } from './api/server/utils/get-story-playwright-data';\nimport { getScreenshotPaths } from './api/server/utils/get-screenshot-paths';\nimport { makeScreenshot } from './api/services/make-screenshot';\nimport { setStoryScreenshotOptions } from './api/services/utils/set-story-screenshot-options';\nimport { getPlaywrightConfigFiles } from './utils/get-playwright-config-files';\n\ninterface RunImageDiffOptions extends RequestData {\n onScreenshotReady?: (\n buffer: Buffer,\n baselineScreenshotPathInfo: ScreenshotPathInfo,\n ) => void;\n playwrightJsonPath?: string;\n}\n\ninterface GetScreenshot {\n buffer: Buffer;\n storyId: string;\n configFile: string;\n}\n\nexport async function getScreenshots(options: RunImageDiffOptions) {\n const { onScreenshotReady, playwrightJsonPath, requestId } = options;\n\n const files =\n playwrightJsonPath && fs.existsSync(playwrightJsonPath)\n ? [playwrightJsonPath]\n : await getPlaywrightConfigFiles(playwrightJsonPath);\n\n const results: GetScreenshot[] = [];\n\n for (const fileName of files) {\n if (!fileName) continue;\n\n const storiesData = await getStoryPlaywrightData(fileName);\n\n for (const story of storiesData.storyData) {\n if (!story) continue;\n\n if (story.data.screenshots && story.data.screenshots.length) {\n for (const screenShotData of story.data.screenshots) {\n if (!screenShotData) continue;\n\n setStoryScreenshotOptions(storiesData.playWrightData, screenShotData);\n\n const screenShot = await makeScreenshot(\n {\n requestId,\n storyId: story.storyId,\n ...screenShotData,\n },\n false,\n );\n\n const paths = getScreenshotPaths({\n browserType: screenShotData.browserType,\n filePath: fileName,\n storyId: story.storyId,\n title: screenShotData.title,\n });\n\n results.push({\n buffer: screenShot.buffer,\n configFile: fileName,\n storyId: story.storyId,\n });\n\n if (onScreenshotReady) {\n await onScreenshotReady(screenShot.buffer, paths);\n }\n }\n }\n }\n }\n\n return results;\n}\n"]}
|