For uploads, Puppeteer can send a local path to an input[type="file"] with uploadFile(); Playwright’s locator API uses setInputFiles(). If the page opens a file chooser dynamically, wait for the chooser before clicking. For downloads, Playwright provides a Download object; Puppeteer’s current Files guide does not document a programmatic download-handling method.
Upload a file in Puppeteer
When the page already contains a file input, wait for it and call uploadFile() on its element handle. The Puppeteer Files guide documents this pattern (version 25.12.0): Puppeteer: Files.
As an Amazon Associate I earn from qualifying purchases.
const fileElement = await page.waitForSelector('input[type="file"]');
if (!fileElement) throw new Error('File input was not found');
await fileElement.uploadFile('./fixtures/report.pdf');
The input does not need to be visible for this API pattern. If your application has several file inputs, select the intended one more precisely rather than relying on the first matching selector.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minuteWhen a button opens the file chooser
Start waiting for the chooser before clicking the button that opens it. If you click first, the chooser event can occur before the wait is registered.
#1 Best Overall
- USB-C 2-in-1 storage OTG: The Lexar JumpDrive Dual Drive D40E features USB Type-A and Type-C connectors in a slim, portable form factor for easy device compatibility
- Transfer speeds up to 100MB/s: Based on internal testing, performance may vary depending upon the host device, interface, and usage conditions. 1MB=1,000,000 bytes
- Plug and Play: Widely compatible with USB Type-C smartphones, tablets, laptops, Macs, and traditional Type-A devices, no software installation required. The 360° swivel design allows for easy switching between connectors without the hassle of losing a cap
- Durable & Compact: The Lexar D40E USB memory stick features a metal enclosure, withstands temperatures from 0° to 50° C (32°F to 122°F), and is lightweight at 26g with dimensions of 70.4 x 16.9 x 11.7mm
- Security & Warranty: Securely protects files using an advanced security software solution with 256-bit AES encryption. Backed by a Lexar 3-year limited warranty
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('#upload-file-button'),
]);
await fileChooser.accept(['/tmp/report.pdf']);
The chooser must be accepted or cancelled before another chooser can appear. Puppeteer’s documented chooser APIs do not intercept DOM calls such as window.showOpenFilePicker. See the waitForFileChooser reference and FileChooser reference.
Upload a file in Playwright
Prefer a locator and setInputFiles() for a file input. Playwright recommends locator-based operations over ElementHandle usage; its Actions documentation covers file uploads: Playwright: upload files.
Rank #2
- High-speed USB 3.0 performance of up to 150MB/s(1) [(1) Write to drive up to 15x faster than standard USB 2.0 drives (4MB/s); varies by drive capacity. Up to 150MB/s read speed. USB 3.0 port required. Based on internal testing; performance may be lower depending on host device, usage conditions, and other factors; 1MB=1,000,000 bytes]
- Transfer a full-length movie in less than 30 seconds(2) [(2) Based on 1.2GB MPEG-4 video transfer with USB 3.0 host device. Results may vary based on host device, file attributes and other factors]
- Transfer to drive up to 15 times faster than standard USB 2.0 drives(1)
- Sleek, durable metal casing
- Easy-to-use password protection for your private files(3) [(3)Password protection uses 128-bit AES encryption and is supported by Windows 7, Windows 8, Windows 10, and Mac OS X v10.9 plus; Software download required for Mac, visit the SanDisk SecureAccess support page]
await page.getByLabel('Upload file').setInputFiles('/absolute/path/report.pdf');
Multiple files, generated files, and clearing an input
- Multiple files: pass an array of paths, for example
await page.getByLabel('Upload files').setInputFiles(['/tmp/one.pdf', '/tmp/two.pdf']);. - Generated content: supply an object with a filename, MIME type, and buffer:
await page.getByLabel('Upload file').setInputFiles({ name: 'report.txt', mimeType: 'text/plain', buffer: Buffer.from('Report contents') });. - Clear the selection: pass an empty array:
await page.getByLabel('Upload file').setInputFiles([]);.
These forms are documented in the Playwright file-upload guide.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →When the file chooser appears dynamically
Register the event wait before triggering the action that opens the chooser, then set its files:
Rank #3
- What You Get - 2 pack 64GB genuine USB 2.0 flash drives, 12-month warranty and lifetime friendly customer service
- Great for All Ages and Purposes – the thumb drives are suitable for storing digital data for school, business or daily usage. Apply to data storage of music, photos, movies and other files
- Easy to Use - Plug and play USB memory stick, no need to install any software. Support Windows 7 / 8 / 10 / Vista / XP / Unix / 2000 / ME / NT Linux and Mac OS, compatible with USB 2.0 and 1.1 ports
- Convenient Design - 360°metal swivel cap with matt surface and ring designed zip drive can protect USB connector, avoid to leave your fingerprint and easily attach to your key chain to avoid from losing and for easy carrying
- Brand Yourself - Brand the flash drive with your company's name and provide company's overview, policies, etc. to the newly joined employees or your customers
const chooserPromise = page.waitForEvent('filechooser');
await page.getByLabel('Upload file').click();
const chooser = await chooserPromise;
await chooser.setFiles('/absolute/path/report.pdf');
The Page API documents the filechooser event for cases such as clicking a file input: Playwright Page API: filechooser.
Understand file paths and execution environments
A path is meaningful to the process that reads the file, not automatically to every browser or machine involved. In Playwright’s documented API, relative paths resolve from the current working directory. In Puppeteer, a local script connected to remote Chrome must pass absolute paths to FileChooser.accept(). In either tool, make sure the automation process can access the file; containers, remote browsers, and separate worker processes may have different filesystems. The documentation does not establish one universal path mapping for every deployment topology.
Rank #4
- GOOD VALUE PACKAGE - 1 Pack 32GB Memory Stick USB 2.0 Flash Drives with great cost performance and high quality.
- BIG CAPACITY - The available capacity: 29.10GB-29.8GB, You can save the data of movies, music, photos, designs, programs, manuals, handouts in a high speed.Good performance in digital data storing, transferring and sharing with families, friends, workmates, clients and machines.
- EASY TO USE & PLUG AND WORK - Support windows 7 / 8 / 10 / Vista / XP / 2000 / ME / NT Linux and Mac OS, Compatible with USB2.0 and below.
- TWISTTURN DESIGN & EASY CARRY - The metal clip rotates 360° round the ABS plastic body which with rubber oil skin feeling finish. The capless design can avoid lossing of cap, and providing efficient protection to the USB port.
- WARRANTY & SUPPORT - SIMMAX logo is laser printed on the USB connector surface, our products are of good quality and we promise that any problem about the product within one year since you buy.
- Use an absolute path when the working directory could vary between local runs, CI jobs, or containers.
- Check that the file exists in the environment where the automation process runs and that the process can read it.
- For remote Chrome with Puppeteer’s chooser flow, pass absolute paths as the Puppeteer reference specifies.
Handle page downloads
Playwright
Playwright emits a download event and provides a Download instance for basic file operations. Register the listener before the action that starts the download so the event is not missed. Consult the Page API download event for the current methods and behavior.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Puppeteer
Puppeteer’s current Files guide describes file uploads and chooser handling but says it does not offer programmatic download handling. Do not assume Playwright’s Download object workflow exists in Puppeteer; consult the live Puppeteer Files guide for the supported boundary.
Best Value
- 【16GB Flash Drive】USB flash drives with 16GB capacity, meet your needs of daily use on work, school, home and travelling for photos, music, videos, files storage and transfer. IMEASON thumb drives can be used to store different files, easy to data backup.
- 【Metal Swivel Cap Design】USB thumb drive is metal swivel cover provides extra protection for the usb thumbdrive connector, no usb drive cap to lose; keychain design makes it easier to carry without worrying lose it.
- 【Wide Compatibility】USB drive supports Windows 7/8/10/11 / Vista / XP / Unix / 2000 / ME / NT Linux and Mac OS, also Supports USB 2.0 and 1.1 ports. USB Stick support TV, desktop, notebook computer, car, audio and other device. The USB Memory Stick is your great data storage and transfer companion with traveling and working.
- 【Easy to use】usb memory stick is plug and play without any software installation. Just simply plug the Flashdrive into the port of your USB-compatible devices such as computer, laptop to start data storage or transmission.
- 【What You Get】16 GB USB Flash Drive Thumb Drive, The default format of the usb storage flash drive is FAT32.
Which API should you use?
| Task | Puppeteer | Playwright |
|---|---|---|
| Supply files to an existing input | ElementHandle.uploadFile(paths) |
Prefer locator setInputFiles(pathsOrFiles) |
| Respond to a chooser opened by an action | Wait with waitForFileChooser(), then accept(paths); register the wait before the action |
Wait for the filechooser event, then call setFiles(...) |
| Provide in-memory file contents | Not established by the consulted Puppeteer Files guide | Pass an object containing name, mimeType, and buffer |
| Handle a page download | Current Files guide says programmatic handling is not offered | Listen for download and use the Download instance for basic operations |
For migration, Puppeteer’s waitForFileChooser and ElementHandle.uploadFile correspond broadly to Playwright’s locator-based setInputFiles approach. The exact APIs differ, so update the event-wait and file-supply code rather than expecting a direct method-for-method replacement. See Playwright migration guide.
Troubleshoot file automation
- The chooser wait never resolves: the action may not open a chooser, or the wait may have been registered too late. Register it before clicking; Puppeteer’s
waitForFileChooser()does not return a chooser that is already open. - The upload reports a missing file: verify the path from the automation process’s working environment, not just from the machine where you view the test. Try an absolute path and check read access.
- A relative Playwright path works locally but fails in CI: relative paths resolve from the current working directory. Use an absolute path or construct the path from a known project directory.
- Remote Puppeteer Chrome cannot access a local file: for
FileChooser.accept(), Puppeteer warns a local script connected to remote Chrome must pass absolute paths. Ensure the file is accessible in the relevant execution setup. - A second chooser does not appear: accept or cancel the current Puppeteer chooser before attempting another.
window.showOpenFilePickeris not intercepted: Puppeteer’s documented file chooser interception does not cover this DOM API; use an application flow that exposes a file input or another supported route.- You need downloaded files from Puppeteer: the current Puppeteer Files guide does not provide a programmatic download-handling method. Playwright documents a download event and Download object; choose the tool and workflow accordingly.
Or skip the browser setup
If the goal is a screenshot rather than exercising an upload or download workflow, ScreenshotNeo can capture a page through one GET request. See the ScreenshotNeo API documentation for options.
Quick Recap
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
ScreenshotNeo accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits cost nothing, with response headers indicating the page verdict and billing status. Its MCP server provides screenshot tools for Claude, Cursor, and other MCP clients. The free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000 shots. Sign up for 1,000 free screenshots a month—no card required.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




