{"record":{"id":"2a16c092e50dcfc5","repo":"microsoft/playwright","slug":"at-least-one-of-files-or-data-must-be-provided","errorCode":null,"errorMessage":"At least one of \"files\" or \"data\" must be provided.","messagePattern":"At least one of \"files\" or \"data\" must be provided\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/frames.ts","lineNumber":1461,"sourceCode":"\n  async hover(progress: Progress, selector: string, options: types.PointerActionOptions & types.PointerActionWaitOptions) {\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._hover(progress, options)));\n  }\n\n  async selectOption(progress: Progress, selector: string, elements: dom.ElementHandle[], values: types.SelectOption[], options: types.CommonActionOptions): Promise<string[]> {\n    return await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._selectOption(progress, elements, values, options));\n  }\n\n  async setInputFiles(progress: Progress, selector: string, params: Omit<channels.FrameSetInputFilesParams, 'timeout'> & { noAutoWaiting?: boolean }): Promise<channels.FrameSetInputFilesResult> {\n    const inputFileItems = await progress.race(prepareFilesForUpload(this, params));\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params, (progress, handle) => handle._setInputFiles(progress, inputFileItems)));\n  }\n\n  async drop(progress: Progress, selector: string, params: Omit<channels.FrameDropParams, 'timeout' | 'selector'>, options: types.PointerActionWaitOptions): Promise<void> {\n    const hasFiles = !!(params.payloads?.length || params.localPaths?.length || params.streams?.length);\n    const hasData = !!params.data?.length;\n    if (!hasFiles && !hasData)\n      throw new Error('At least one of \"files\" or \"data\" must be provided.');\n    const inputFileItems = hasFiles ? await progress.race(prepareFilesForUpload(this, params)) : { filePayloads: undefined, localPaths: undefined };\n    const data = params.data ?? [];\n    dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._drop(progress, inputFileItems, data, options)));\n  }\n\n  async type(progress: Progress, selector: string, text: string, options: { delay?: number, noAutoWaiting?: boolean } & types.StrictOptions) {\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._type(progress, text, options)));\n  }\n\n  async press(progress: Progress, selector: string, key: string, options: { delay?: number, noWaitAfter?: boolean, noAutoWaiting?: boolean } & types.StrictOptions) {\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._press(progress, key, options)));\n  }\n\n  async check(progress: Progress, selector: string, options: types.PointerActionWaitOptions) {\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._setChecked(progress, true, options)));\n  }\n\n  async uncheck(progress: Progress, selector: string, options: types.PointerActionWaitOptions) {","sourceCodeStart":1443,"sourceCodeEnd":1479,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/frames.ts#L1443-L1479","documentation":"Thrown by Frame.drop() when neither files (payloads, localPaths, or streams) nor data items are provided in the drop params. The method checks all three file-related properties and the data array; if all are empty or undefined, it refuses to execute the drag-and-drop operation since there is nothing to drop.","triggerScenarios":"Calling page.dragAndDrop() or frame.drop() with a params object that has empty payloads, localPaths, and streams arrays and an empty or missing data array. This can happen when the params are built dynamically and all source arrays resolve to empty.","commonSituations":"Building the drop params from a file list that is empty due to a prior filter or validation step. Passing a variable for files/data that is undefined at runtime. Migrating from a different drag-and-drop API that used different property names.","solutions":["Provide at least one file via { payloads: [{ name, mimeType, buffer }] } or { localPaths: ['/path/to/file'] }, or at least one data item via { data: [{ type: 'text/plain', data: 'hello' }] }.","Validate that your file/data arrays are non-empty before calling drop: if (files.length === 0 && data.length === 0) return.","Check that file-reading code upstream did not silently produce empty arrays."],"exampleFix":"// before\nawait page.dragAndDrop('#source', '#target', { payloads: [] });\n\n// after\nawait page.dragAndDrop('#source', '#target', {\n  payloads: [{ name: 'file.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') }]\n});","handlingStrategy":"validation","validationCode":"function validateDropParams(params) {\n  const hasFiles = !!(params.payloads?.length || params.localPaths?.length || params.streams?.length);\n  const hasData = !!params.data?.length;\n  if (!hasFiles && !hasData)\n    throw new Error('Drop requires at least files or data');\n}","typeGuard":"function hasDropContent(params: any): boolean {\n  return (Array.isArray(params.payloads) && params.payloads.length > 0)\n    || (Array.isArray(params.localPaths) && params.localPaths.length > 0)\n    || (Array.isArray(params.streams) && params.streams.length > 0)\n    || (Array.isArray(params.data) && params.data.length > 0);\n}","tryCatchPattern":null,"preventionTips":["Verify file/data arrays are non-empty before calling drop.","Check that file-reading code produces expected results.","Use TypeScript to enforce non-empty array types."],"tags":["drop","drag-and-drop","validation","frame","files"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}