diff --git a/packages/playwright-core/src/server/firefox/ffPage.ts b/packages/playwright-core/src/server/firefox/ffPage.ts index 37965b642e..181b88b2ba 100644 --- a/packages/playwright-core/src/server/firefox/ffPage.ts +++ b/packages/playwright-core/src/server/firefox/ffPage.ts @@ -533,7 +533,15 @@ export class FFPage implements PageDelegate { } async setInputFilePaths(handle: dom.ElementHandle, files: string[]): Promise { - throw new Error('Not implemented'); + await Promise.all([ + this._session.send('Page.setFileInputFiles', { + frameId: handle._context.frame._id, + objectId: handle._objectId, + files + }), + handle.dispatchEvent('input'), + handle.dispatchEvent('change') + ]); } async adoptElementHandle(handle: dom.ElementHandle, to: dom.FrameExecutionContext): Promise> { diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 500d72da6c..1e89ec76be 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -936,8 +936,13 @@ export class WKPage implements PageDelegate { await this._session.send('DOM.setInputFiles', { objectId, files: protocolFiles }); } - async setInputFilePaths(handle: dom.ElementHandle, files: string[]): Promise { - throw new Error('Not implemented'); + async setInputFilePaths(handle: dom.ElementHandle, paths: string[]): Promise { + const pageProxyId = this._pageProxySession.sessionId; + const objectId = handle._objectId; + await Promise.all([ + this._pageProxySession.connection.browserSession.send('Playwright.grantFileReadAccess', { pageProxyId, paths }), + this._session.send('DOM.setInputFiles', { objectId, paths }) + ]); } async adoptElementHandle(handle: dom.ElementHandle, to: dom.FrameExecutionContext): Promise> { diff --git a/tests/browsertype-connect.spec.ts b/tests/browsertype-connect.spec.ts index cfc95de0c7..6c39849448 100644 --- a/tests/browsertype-connect.spec.ts +++ b/tests/browsertype-connect.spec.ts @@ -16,6 +16,7 @@ */ import fs from 'fs'; +import os from 'os'; import * as path from 'path'; import { getUserAgent } from '../packages/playwright-core/lib/utils/utils'; import WebSocket from 'ws'; @@ -574,8 +575,8 @@ test('should fulfill with global fetch result', async ({ browserType, startRemot expect(await response.json()).toEqual({ 'foo': 'bar' }); }); -test('should upload large file', async ({ browserType, startRemoteServer, server, browserName }, testInfo) => { - test.skip(browserName !== 'chromium'); +test('should upload large file', async ({ browserType, startRemoteServer, server, browserName, isMac }, testInfo) => { + test.skip(browserName === 'webkit' && isMac && parseInt(os.release(), 10) < 20, 'WebKit for macOS 10.15 is frozen and does not have corresponding protocol features.'); test.slow(); const remoteServer = await startRemoteServer(); const browser = await browserType.connect(remoteServer.wsEndpoint()); diff --git a/tests/page/page-set-input-files.spec.ts b/tests/page/page-set-input-files.spec.ts index dffafc3e72..2541db9f62 100644 --- a/tests/page/page-set-input-files.spec.ts +++ b/tests/page/page-set-input-files.spec.ts @@ -20,6 +20,7 @@ import { attachFrame } from '../config/utils'; import path from 'path'; import fs from 'fs'; +import os from 'os'; import formidable from 'formidable'; it('should upload the file', async ({ page, server, asset }) => { @@ -36,8 +37,8 @@ it('should upload the file', async ({ page, server, asset }) => { }, input)).toBe('contents of the file'); }); -it('should upload large file', async ({ page, server, browserName }, testInfo) => { - it.skip(browserName !== 'chromium'); +it('should upload large file', async ({ page, server, browserName, isMac }, testInfo) => { + it.skip(browserName === 'webkit' && isMac && parseInt(os.release(), 10) < 20, 'WebKit for macOS 10.15 is frozen and does not have corresponding protocol features.'); it.slow(); await page.goto(server.PREFIX + '/input/fileupload.html'); const uploadFile = testInfo.outputPath('200MB.zip');