From 63da01aee8f19a11685adeeb7493def691b67e22 Mon Sep 17 00:00:00 2001 From: Ricardo Barbosa <1101461@isep.ipp.pt> Date: Sat, 2 May 2020 19:16:22 +0200 Subject: [PATCH] @devtools: Enable file uploads by changing input elements' value (#5347) --- e2e/element.test.js | 6 ++++++ packages/devtools/src/commands/elementSendKeys.js | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/e2e/element.test.js b/e2e/element.test.js index 892f6e6f8f1..92ff1620aa1 100644 --- a/e2e/element.test.js +++ b/e2e/element.test.js @@ -105,6 +105,12 @@ describe('elements', () => { expect(await browser.getElementProperty(textarea[ELEMENT_KEY], 'value')).toBe('foobar') }) + it('elementSendKeys for file-type input', async () => { + const fileInput = await browser.findElement('css selector', '#upload-test') + await browser.elementSendKeys(fileInput[ELEMENT_KEY], 'README.md') + expect(await browser.getElementProperty(fileInput[ELEMENT_KEY], 'value')).toBe('C:\\fakepath\\README.md') + }) + it('elementClear', async () => { const textarea = await browser.findElement('css selector', 'textarea') await browser.elementClear(textarea[ELEMENT_KEY]) diff --git a/packages/devtools/src/commands/elementSendKeys.js b/packages/devtools/src/commands/elementSendKeys.js index 6b509031644..d9de51fe30e 100644 --- a/packages/devtools/src/commands/elementSendKeys.js +++ b/packages/devtools/src/commands/elementSendKeys.js @@ -1,4 +1,5 @@ import { getStaleElementError } from '../utils' +import path from 'path' export default async function elementSendKeys ({ elementId, text }) { const elementHandle = this.elementStore.get(elementId) @@ -9,7 +10,15 @@ export default async function elementSendKeys ({ elementId, text }) { await elementHandle.focus() const page = this.getPageHandle() - await page.keyboard.type(text) + const tagName = await (await elementHandle.getProperty('tagName')).jsonValue() + const type = await (await elementHandle.getProperty('type')).jsonValue() + + if(tagName === 'INPUT' && type === 'file'){ + const paths = (text || '').split('\n').map(p => path.resolve(p)) + await elementHandle.uploadFile(...paths) + } else { + await page.keyboard.type(text) + } return null }