Тестирование загрузки файлов в 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() реализация метода.

  1. использование тега --verbose в команде nightwatch привело меня к проблеме где он фактически не находил входной тег во время setValue(), но это было во время waitForElementVisible(). Меняется input[type="file"] до input#fileUpload решил эту вопрос.

  2. во-вторых, следующие способы описания пути не были рабочий...

    • '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);