Skip to content

Instantly share code, notes, and snippets.

@gontard
Forked from Bunk/uploadLocalFile.js
Created August 8, 2019 14:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gontard/6d7f7c29298bf534e8b9b869ad0f407d to your computer and use it in GitHub Desktop.
Save gontard/6d7f7c29298bf534e8b9b869ad0f407d to your computer and use it in GitHub Desktop.
Nightwatch — Upload local files to remote selenium grid
const path = require('path')
const util = require('util')
const events = require('events')
const archiver = require('archiver')
const handleResult = cb => result => {
if (result.status !== 0) throw new Error(result.value.message)
cb(result.value)
}
function uploadLocalFile () { events.EventEmitter.call(this) }
util.inherits(uploadLocalFile, events.EventEmitter)
/**
* uploadLocalFile is responsible for using webdriver protocol to upload a local
* file to a remote Selenium server for use in testing uploads.
*
* @argument filePath Local path to the file used for uploading
* @argument inputSelector Input selector for the file input to upload with
*/
uploadLocalFile.prototype.command = function uploadLocalFile (filePath, inputSelector) {
const self = this
const Nightwatch = this.client
const api = this.api
const uploadRemote = cb => {
let buffers = []
let zip = archiver('zip')
zip
.on('data', data => { buffers.push(data) })
.on('error', err => { throw err })
.on('finish', () => {
const file = Buffer.concat(buffers).toString('base64')
api.session(session => {
const opt = {
path: `/session/${session.sessionId}/file`,
method: 'POST',
data: { file }
}
Nightwatch.runProtocolAction(opt, handleResult(cb)).send()
})
})
const name = path.basename(filePath)
zip.file(filePath, { name })
zip.finalize()
}
uploadRemote(tempUrl => {
api.setValue(inputSelector, tempUrl, () => self.emit('complete'))
})
return self
}
module.exports = uploadLocalFile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment