Как загрузить файл в тестирование транспортира angularjs e2e
Я хочу проверить загрузку файлов с помощью теста angularjs e2e. Как вы делаете это в тестах e2e? Я запускаю свой тестовый сценарий через грубую карму.
10 ответов
Вот как я это делаю:
var path = require('path');
it('should upload a file', function() {
var fileToUpload = '../some/path/foo.txt',
absolutePath = path.resolve(__dirname, fileToUpload);
element(by.css('input[type="file"]')).sendKeys(absolutePath);
element(by.id('uploadButton')).click();
});
- Использовать
path
Модуль для разрешения полного пути к файлу, который вы хотите загрузить. - Установите путь к элементу input type="file".
- Нажмите на кнопку загрузки.
Это не будет работать на Firefox. Транспортир будет жаловаться, потому что элемент не виден. Для загрузки в Firefox вы должны сделать вход видимым. Вот что я делаю:
browser.executeAsyncScript(function(callback) {
// You can use any other selector
document.querySelectorAll('#input-file-element')[0]
.style.display = 'inline';
callback();
});
// Now you can upload.
$('input[type="file"]').sendKeys(absolutePath);
$('#uploadButton').click();
Вы не можете напрямую.
По соображениям безопасности вы не можете смоделировать пользователя, который выбирает файл в системе, в комплекте функционального тестирования, таком как ngScenario.
С Protractor, так как он основан на WebDriver, должна быть возможность использовать этот трюк
Вот комбинация советов Андреса Д и davidb583, которые помогли бы мне, когда я работал над этим...
Я пытался выполнить тесты транспортира против элементов управления flowjs.
// requires an absolute path
var fileToUpload = './testPackages/' + packageName + '/' + fileName;
var absolutePath = path.resolve(__dirname, fileToUpload);
// Find the file input element
var fileElem = element(by.css('input[type="file"]'));
// Need to unhide flowjs's secret file uploader
browser.executeScript(
"arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1",
fileElem.getWebElement());
// Sending the keystrokes will ultimately submit the request. No need to simulate the click
fileElem.sendKeys(absolutePath);
// Not sure how to wait for the upload and response to return first
// I need this since I have a test that looks at the results after upload
// ... there is probably a better way to do this, but I punted
browser.sleep(1000);
var imagePath = 'http://placehold.it/120x120&text=image1';
element(by.id('fileUpload')).sendKeys(imagePath);
Это работает для меня.
Прежде всего, для того, чтобы загрузить файл, должен быть
input
элемент, указывающий путь к файлу. Обычно это сразу рядом с кнопкой «Загрузить» ... НО я видел это, когда кнопка не имеет ввода вокруг кнопки, что может показаться запутанным. Сохраняйте моллюск, ввод должен быть на странице! Попробуйте найти элемент ввода в модели DOM, в котором есть что-то вроде «загрузка» или «файл», но имейте в виду, что он может быть где угодно.
Когда вы его найдете, получите его селектор и введите путь к файлу. Помните, что это должен быть абсолютный путь, который начинается с вашего корневого каталога (
/something/like/this
для пользователей MAC и
C:/some/file
в Windows)
await $('input[type="file"]').sendKeys("/file/path")
это может не сработать, если ...
sendKeys protractor может вводить только видимый ввод. Часто ввод будет скрыт или
0
размер пикселей. Вы тоже можете это исправить
let $input = $('input[type="file"]');
await browser.executeScript(
"arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1",
$input.getWebElement()
);
Это то, что я делаю, чтобы загрузить файл в Firefox, этот скрипт делает элемент видимым, чтобы установить значение пути:
browser.executeScript("$('input[type=\"file\"]').parent().css('visibility', 'visible').css('height', 1).css('width', 1).css('overflow', 'visible')");
Если вы хотите выбрать файл, не открывая всплывающее окно, вот ответ:
var path = require('path');
var remote = require('../../node_modules/selenium-webdriver/remote');
browser.setFileDetector(new remote.FileDetector());
var fileToUpload = './resume.docx';
var absolutePath = path.resolve(process.cwd() + fileToUpload);
element(by.css('input[type="file"]')).sendKeys(absolutePath);
// Загрузить файл из C: \ Directory
{
var path = require('path');
var dirname = 'C:/';
var fileToUpload = '../filename.txt';
var absolutePath = path.resolve('C:\filename.txt');
var fileElem = ptor.element.all(protractor.By.css('input[type="file"]'));
fileElem.sendKeys(absolutePath);
cb();
};
Я понял, что ввод файла в тестируемом веб-приложении виден только в Firefox, когда он прокручивается в представление с помощью JavaScript, поэтому я добавил scrollIntoView() в код Andres D, чтобы он работал для моего приложения:
browser.executeAsyncScript(function (callback) {
document.querySelectorAll('input')[2]
.style = '';
document.querySelectorAll('input')[2].scrollIntoView();
callback();
});
(Я также удалил все стили для элемента ввода файла)
Текущие документированные решения будут работать, только если пользователи загружают jQuery. Во всех разных ситуациях пользователи получат ошибку, такую:Failed: $ не определено
Я хотел бы предложить документировать решение с использованием собственного кода angularjs.
например, я бы предложил вместо того, чтобы предлагать:
$('input[type="file"]') .....
предлагать:
angular.element(document.querySelector('input[type="file"]')) .....
последний является более стандартным, поверх углового и более важным, не требующим jquery