Тестирование загрузки файлов в Nightwatch.Яш
Я хотел бы вновь открыть поставленный вопрос здесь и здесь о тестировании загрузки файлов в Nightwatch.js, который использует селен.
обе ссылки имеют рекомендуемое решение установки значения элемента ввода файла в качестве url-адреса. В моем случае использования я не смог заставить это работать. Даже установка тега значения вручную, вне nightwatch, ввода, где type="file"
, не изменяет url-адрес. Я пробовал это в Chrome, Firefox и IE10, в инструментах разработки.
альтернативное решение, которое я рассматривал, пыталось эмулировать все нажатия клавиш процесса загрузки файлов. Это будет следовать пути нажатия кнопки загрузки файла, введите путь и введите enter. Это будет сделано через .click
и .key
методы. Однако вы теряете фокус фактического окна загрузки файла, что задерживает нажатия клавиш, пока это окно не будет закрыто. Другие разработчики, похоже, смогли исправить это решение напрямую в селене используя .findElement
и .sendKeys
методы на java, но я не мог понять, как это сделать в javascript и nightwatch.
какие идеи?
// My test
module.exports = {
"Standard File Upload" : function (browser) {
browser
.url("http://localhost:3000")
.waitForElementVisible('body', 1000)
.waitForElementVisible('input[type="file"]', 1000)
.setValue('input[type="file"]','http://localhost:3000/testfile.txt')
.click('#submit')
.pause(1000)
.assert.containsText('h3', 'File Uploaded Successfully')
.end();
}
};
// http://localhost:3000/testfile.txt was tested manually in the file upload window and worked successfully
<!-- My input tag -->
<input id="fileUpload" type="file" name="textfile"/>
3 ответов
были две отдельные проблемы с моим setValue()
реализация метода.
использование тега --verbose в команде nightwatch привело меня к проблеме где он фактически не находил входной тег во время
setValue()
, но это было во времяwaitForElementVisible()
. Меняетсяinput[type="file"]
доinput#fileUpload
решил эту вопрос.-
во-вторых, следующие способы описания пути не были рабочий...
'textfile.txt'
-
'http://localhost:3000/testfile.txt'
(будет работать, если набран вручную в окне загрузки файла)
То, что работало, использовалоrequire('path').resolve(__dirname + '/testfile.txt')
Взгляните здесь чтобы увидеть обсуждение, которое привело к исправлению. Спасибо Ричарду-Флоси.
работающий код:
module.exports = {
"Standard File Upload" : function (browser) {
browser
.url("http://localhost:3000")
.waitForElementVisible('body', 1000)
.waitForElementVisible('input#fileUpload', 1000)
.pause(1000)
.setValue('input#fileUpload', require('path').resolve(__dirname + '/testfile.txt')) // Works
// .setValue('input#fileUpload', "testfile.txt") // Will not work
// .setValue('input#fileUpload', "http://localhost:3000/testfile.txt") // Will not work
// .setValue('input[type="file"]', require('path').resolve(__dirname + '/testfile.txt')) // Will not work
.click('#submit')
.pause(1000)
.assert.containsText('h3', 'File Uploaded Successfully')
.end();
}
};
Я не уверен, почему у вас возникли эти проблемы, возможно, проверьте, используете ли вы последнюю версию selenium server и nightwatch. Этот код работает для меня 100% в Chrome, Safari, Firefox, IE7/8/9/10/11 (не тестируется в IE6, но также предполагает его).
driver.setValue('input#fileUpload', __dirname + '\testfile.txt')
в моем случае, у меня была дополнительная проблема, потому что файл, который я пытался загрузить слишком высоко в моей структуре каталогов.
Как только я переместил файл на тот же уровень (или в подкаталог) фактических тестовых файлов, все сработало.
из сценария, живущего в моем :
// No dice:
var fullPath = require('path').resolve(__dirname + '/../../somefile.pdf');
// Works:
var fullPath = require('path').resolve(__dirname + '/../somefile.pdf');
this.setValue('input#fileUpload', fullPath);