Implement Page.uploadFile (#61)

This patch implements `Page.uploadFile` method to support file upload inputs.
This commit is contained in:
JoelEinbinder
2017-07-10 11:21:46 -07:00
committed by Andrey Lushnikov
parent 739c1566a9
commit da0cde1b45
8 changed files with 75 additions and 8 deletions

View File

@@ -108,7 +108,10 @@ class NetworkManager extends EventEmitter {
* @param {!Object} event
*/
_onResponseReceived(event) {
let request = this._idToRequest.get(event.requestId) || null;
let request = this._idToRequest.get(event.requestId);
// FileUpload sends a response without a matching request.
if (!request)
return;
let response = new Response(request, event.response, this._getResponseBody.bind(this, event.requestId));
request._response = response;
this.emit(NetworkManager.Events.Response, response);

View File

@@ -493,10 +493,13 @@ class Page extends EventEmitter {
* @param {!Promise<number>}
*/
async _querySelector(selector) {
return (await this._client.send('DOM.querySelector', {
let {nodeId} = await this._client.send('DOM.querySelector', {
nodeId: await this._rootNodeId(),
selector
})).nodeId;
});
if (!nodeId)
throw new Error('No node found for selector: ' + selector);
return nodeId;
}
/**
@@ -569,6 +572,18 @@ class Page extends EventEmitter {
waitFor(selector) {
return this.mainFrame().waitFor(selector);
}
/**
* @param {string} selector
* @param {!Array<string>} filePaths
* @return {!Promise}
*/
async uploadFile(selector, ...filePaths) {
await this._client.send('DOM.setFileInputFiles', {
nodeId: await this._querySelector(selector),
files: filePaths
});
}
}
/** @enum {string} */