File Uploads

View as Markdown

Browser runtimes support uploading files to <input type="file"> elements. Since the browser runs remotely, files are sent as base64-encoded payloads.

Setting input files

Playwright

Use setInputFiles on a locator or page:

1import { readFileSync } from "fs";
2
3// Via locator
4await runtime.page.locator("input[type=file]").setInputFiles({
5 name: "report.pdf",
6 mimeType: "application/pdf",
7 buffer: readFileSync("./report.pdf").toString("base64"),
8});
9
10// Via page selector
11await runtime.page.setInputFiles("input[type=file]", {
12 name: "report.pdf",
13 mimeType: "application/pdf",
14 buffer: readFileSync("./report.pdf").toString("base64"),
15});

Multiple files

1await runtime.page.locator("input[type=file]").setInputFiles([
2 {
3 name: "page1.png",
4 mimeType: "image/png",
5 buffer: readFileSync("./page1.png").toString("base64"),
6 },
7 {
8 name: "page2.png",
9 mimeType: "image/png",
10 buffer: readFileSync("./page2.png").toString("base64"),
11 },
12]);

Clear selected files

1await runtime.page.locator("input[type=file]").setInputFiles([]);

File payload format

FieldTypeDescription
namestringFilename
mimeTypestringMIME type
bufferstringBase64-encoded file content

Stagehand

Stagehand uses the same file payload format:

1await runtime.page.locator("input[type=file]").setInputFiles({
2 name: "data.csv",
3 mimeType: "text/csv",
4 buffer: readFileSync("./data.csv").toString("base64"),
5});

Multipart form data (Playwright)

For API requests that accept file uploads via multipart form data:

1await runtime.page.request.post("https://api.example.com/upload", {
2 multipart: {
3 name: "My Report",
4 file: {
5 name: "report.pdf",
6 mimeType: "application/pdf",
7 buffer: readFileSync("./report.pdf").toString("base64"),
8 },
9 },
10});

Example: upload a document

1import { readFileSync } from "fs";
2
3await runtime.page.goto("https://app.example.com/upload");
4
5// Set the file on the input
6await runtime.page.locator("#file-input").setInputFiles({
7 name: "invoice.pdf",
8 mimeType: "application/pdf",
9 buffer: readFileSync("./invoice.pdf").toString("base64"),
10});
11
12// Submit the form
13await runtime.page.locator("#upload-btn").click();
14
15// Wait for upload confirmation
16await runtime.page.locator(".upload-success").waitFor();