Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Playwright Python raises ENOENT during an upload when the file path supplied to the test does not identify a file from the test process’s current working directory. Start by preserving the complete exception, inspect Path.cwd(), check the exact path with Path.exists() or Path.is_file(), then pass a resolved absolute path to locator.set_input_files(). If the test already has the content as bytes, upload an in-memory payload instead of a disk path.

What the ENOENT error means in a Playwright upload

ENOENT is an operating-system “no such file or directory” error. In this context, it normally identifies the file argument that Playwright is trying to read, not a missing browser element. The first question is therefore: which path did the test process resolve, and does that path point to a file at that moment?

Playwright’s Python actions documentation states: “If some of the file paths are relative, they are resolved relative to the current working directory.” A path that looks correct relative to your test module or repository root can still fail when the test runner was started from another directory. The exact traceback, operating system, runner, Playwright version and invocation directory matter, so do not assume a single universal cause without inspecting them.

Fast diagnostic sequence

  1. Read the complete exception. Copy the path shown in the traceback. Check for a misspelling, wrong extension, unexpected case, or a path that was built from an empty environment variable.
  2. Inspect the working directory in the same test process. Print or log Path.cwd(); do not rely on the directory shown by your editor or terminal tab.
  3. Construct the expected path explicitly. Anchor it to a project or fixture directory controlled by your test, rather than relying on an implicit relative path.
  4. Resolve and verify it immediately before upload. Use resolve(), then assert is_file(). This turns a late Playwright failure into an early, readable test failure.
  5. Upload with the locator API. Call set_input_files() on the actual HTML <input type="file"> element.

This check is practical Python debugging based on Playwright’s documented path rule; it is not a special Playwright diagnostic command.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
SANDISK 128GB Ultra Flair, USB-A Flash Drive, Up to 150MB/s Read Speeds
  • 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]

Use an absolute path derived from a known fixture

The safest disk-based pattern is to derive the file from a location your test controls. The following example assumes a fixtures directory beside the test module; change that layout to match your project.

from pathlib import Path
from playwright.sync_api import Page


def test_upload(page: Page) -> None:
    upload_path = (Path(__file__).parent / "fixtures" / "sample.pdf").resolve()

    assert upload_path.is_file(), (
        f"Upload fixture missing: {upload_path} "
        f"(working directory: {Path.cwd()})"
    )

    page.get_by_label("Upload file").set_input_files(upload_path)

Path(__file__).parent is only an example of a stable anchor. In a larger project you might instead define a repository root, use a pytest fixture that returns the fixture directory, or obtain a path from test configuration. The important properties are that the root is explicit, the resulting path is absolute, and the file is checked before the API call.

Check the path without changing the upload yet

from pathlib import Path

candidate = Path("fixtures/sample.pdf")
print("cwd:", Path.cwd())
print("candidate as supplied:", candidate)
print("absolute candidate:", candidate.resolve())
print("exists:", candidate.exists())
print("is file:", candidate.is_file())

If exists is false, fix the path or the process’s working directory first. If it is true but is_file is false, the path may refer to a directory, broken link, or another non-file object.

How set_input_files() accepts uploads

locator.set_input_files() sets files on an HTML file input. It accepts one path, multiple paths, or file-payload dictionaries. A single-file upload can use a Path object or string:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
page.locator('input[type="file"]').set_input_files(upload_path)

For multiple files, provide a list of paths. The page must permit multiple selection for the browser behavior you expect.

Rank #2
Lexar D40E 128GB Dual USB 3.2 Gen 1 Type-C Jump Drive, Champagne Silver
  • 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
files = [
    (Path(__file__).parent / "fixtures" / "one.txt").resolve(),
    (Path(__file__).parent / "fixtures" / "two.txt").resolve(),
]
for path in files:
    assert path.is_file(), f"Missing upload file: {path}"
page.locator('input[type="file"]').set_input_files(files)

Relative paths in these calls follow the same current-working-directory rule. Converting every path to an absolute path before the call removes ambiguity about where Playwright will look.

Upload generated data with an in-memory payload

If the test creates the content, receives it from another function, or already stores it in memory, do not write a temporary file merely to upload it. Playwright supports a payload containing a filename, MIME type and byte buffer.

payload = {
    "name": "test.txt",
    "mimeType": "text/plain",
    "buffer": b"test data",
}
page.locator('input[type="file"]').set_input_files(files=[payload])

The payload form avoids resolving a disk path for the upload itself, but it still requires a meaningful filename and appropriate MIME type. Use the actual bytes your application expects; a mismatched type can cause server-side validation failures even though the ENOENT problem is gone.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Path upload versus in-memory upload

Approach Where data lives Path-resolution dependency Required metadata
Path-based Filesystem Yes, unless you pass an absolute path The file must exist and be readable
In-memory payload Python bytes No disk path is resolved for the upload Filename, MIME type and byte buffer

When to use the file chooser API

Use page.expect_file_chooser() when a click opens a dynamically created file input or when the input is not conveniently locatable ahead of time:

from pathlib import Path

upload_path = (Path(__file__).parent / "fixtures" / "sample.pdf").resolve()
assert upload_path.is_file(), f"Missing upload fixture: {upload_path}"

with page.expect_file_chooser() as chooser_info:
    page.get_by_role("button", name="Choose file").click()
chooser = chooser_info.value
chooser.set_files(upload_path)

The chooser is an interaction pattern, not a path-error workaround. Its set_files() method also resolves relative paths from the current working directory. Keep the same absolute-path construction and existence check.

Rank #3
SIMMAX 32GB Memory Stick USB 2.0 Flash Drives Swivel Thumb Drive Pen Drive (32GB Purple)
  • 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.

Common ENOENT causes and precise fixes

The test was launched from a different directory

Symptom: A relative path works when running one file from an IDE but fails in CI or when running the suite from the repository root. Fix: log Path.cwd(), then build the path from __file__, a configured project root, or a fixture fixture supplied by the runner, and call resolve().

The filename or extension is wrong

Symptom: The logged absolute path is plausible, but is_file() is false. Fix: list or inspect the fixture directory, correct capitalization and suffixes, and check whether a generated file uses a different name than the test expects.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A directory is being passed as a file

Symptom: The path exists but is not a regular file. Fix: use is_file(), not only exists(), and pass the file inside the directory. If your intention is to upload a directory, use the directory-upload behavior supported by your page and Playwright version rather than treating it as one file.

The fixture is created too late or removed too early

Symptom: The assertion passes intermittently, but the upload fails later. Fix: create the file before constructing the path, keep it in place until set_input_files() returns, and inspect cleanup fixtures or temporary-directory lifetimes. If an absolute path exists and the failure persists, examine the complete exception and test setup instead of guessing.

The selector is wrong, but the error is not ENOENT

A missing locator, hidden input, or page-side validation normally produces a different failure. Confirm that the target is the actual file input and that the page has loaded it. Do not “fix” a selector problem by changing filesystem paths.

Rank #4
Lexar A30E USB 3.2 Gen 1 Flash Drive 64GB 3-Pack
  • Lightweight and convenient: Lexar JumpDrive A30E (USB Type-A) boasts a slim, portable design for easy device compatibility; lightweight at 7.41 g
  • Transfer speeds up to 100 MB/s: 10x faster than standard USB 2.0 drives; Based on internal testing, performance may vary depending upon the host device, interface, and usage conditions
  • Wide compatibility: Compatible with tablets, laptops, Macs, and traditional Type-A devices, no software installation required; Reliably stores photos, videos & files
  • Compact: Features a push-button retractor and a lanyard loop for on-the-go use
  • Enhanced security: Lexar DataShield protects files, easily creates a password-protected safe with auto-encryption; Files deleted from the safe are securely erased and can't be recovered

Reliable patterns for CI, containers and parallel tests

  • Log the resolved path and working directory only when diagnostics are needed; avoid exposing sensitive absolute paths in public CI logs.
  • Keep committed fixtures in a deterministic project location and reference them from a known root.
  • For generated files, use a per-test temporary directory and retain it until the upload request has completed.
  • Do not assume the developer’s checkout path, home directory, or shell working directory exists in a container or remote runner.
  • In parallel tests, give each test unique generated filenames so one test cannot replace or delete another test’s input between the existence check and upload.

These practices reduce race and environment problems, but they do not replace reading the actual traceback. An absolute path that was valid a moment earlier can still fail if another part of the test removes or replaces the file.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If your goal is to capture a page rather than exercise an upload workflow, ScreenshotNeo provides a website screenshot API and MCP server. A single request returns a PNG, JPEG, WebP or PDF:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo documentation for request options. Before capture it accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server exposes take_screenshot, get_page_info and capture_pdf for Claude, Cursor and other MCP clients. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Create a free ScreenshotNeo account.

FAQ

Does ENOENT prove the browser cannot find the upload input?

No. It points first to a file-path lookup failure in the test process. Check the path and working directory before debugging the page selector.

Will changing to expect_file_chooser() fix a bad relative path?

No. Chooser paths follow the same current-working-directory rule. Use the chooser for dynamic inputs, but still pass a verified absolute path or an in-memory payload.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can I use bytes without supplying a filename?

No. The in-memory payload form requires a filename, MIME type and byte buffer.

Best Value
RAOYI 5 Pack 64GB USB Flash Drive, USB 2.0 Memory Stick Thumb Drives Jump Drive Pen Drive for PC Laptop Computer - 64G Multipack
  • Large Capacity and Fast Transmission : The USB flash drives available in 5 mixed colors, it's great for you to classify and store different files; The reading and writing speed of the USB 2.0 memory stick can reach more than 12MB/s and 5MB/s to ensure high-speed data transmission
  • Retractable and Portable Design :The pen drive features a retractable connector for you to extend it from the body easily at the push of a thumb; The capless design eliminates the hassle of losing usb drive caps; Compact size and lanyard hole is convenient for you to attach to your keychain and carry everywhere
  • Plug and Play : No need to install any software, just simply plug the memory stick into the port of your USB-compatible devices such as computer, laptop to start data storage or transmission; Thumb shape and non-slip sliding switch is convenient for you to hold and plug
  • Wide Compatibility : Supports Windows 7/8/10 / Vista / XP / 2000 / ME / NT /Linux, Mac OS and TV, car, audio device with USB port.; 5 pcs 64GB thumb drives meet your most needs of daily storage for photos, music, videos and files
  • What You Get : 5 Pack 64GB USB 2.0 Flash Thumb Drives (Mixed Colors: Black Red Blue Green Purple) and Technical Support; NOTE: The default format system of the 64GB usb stick is exFAT

Frequently Asked Questions

Does ENOENT prove the browser cannot find the upload input?

No. It points first to a file-path lookup failure in the test process. Check the path and working directory before debugging the page selector.

Will changing to expect_file_chooser() fix a bad relative path?

No. Chooser paths follow the same current-working-directory rule. Use the chooser for dynamic inputs, but still pass a verified absolute path or an in-memory payload.

Can I use bytes without supplying a filename?

No. The in-memory payload form requires a filename, MIME type and byte buffer.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The Bottom Line

Resolve and verify the upload path in the same process that runs the test, then pass that absolute path to set_input_files(). Use the payload form when the bytes already exist in memory; use the file chooser only for dynamic input interactions.

Quick Recap

Bestseller No. 1
SANDISK 128GB Ultra Flair, USB-A Flash Drive, Up to 150MB/s Read Speeds
SANDISK 128GB Ultra Flair, USB-A Flash Drive, Up to 150MB/s Read Speeds
Transfer to drive up to 15 times faster than standard USB 2.0 drives(1); Sleek, durable metal casing
$23.99
Bestseller No. 4
Lexar A30E USB 3.2 Gen 1 Flash Drive 64GB 3-Pack
Lexar A30E USB 3.2 Gen 1 Flash Drive 64GB 3-Pack
Compact: Features a push-button retractor and a lanyard loop for on-the-go use
$33.99

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.