Тестирование загрузки файла в средство выбора файлов с помощью транспортира в приложении AngularJS
В проекте AngularJS я пытаюсь проверить транспортиром, правильно ли загружен файл в средство выбора файлов.
Filepicker input type="file"
элемент в котором iframe name="filepicker_dialog" id="filepicker_dialog"
Итак, во-первых, необходимо получить доступ к iframe:
var
ptor = protractor.getInstance(),
driver = ptor.driver;
//Open iframe
element(by.id('openIframe')).click();
//Wait iframe is present
browser.wait(function(){
return element(by.id('filepicker_dialog')).isPresent();
})
.then(function(){
//Switch protractor to iframe
ptor.switchTo().frame('filepicker_dialog');
})
Как говорится в Selenium wiki, чтобы загрузить файл, нужно сделать какой-то трюк, потому что...
Вы не можете напрямую взаимодействовать с диалоговым окном браузера файлов операционной системы
Итак, основываясь на том, как загрузить файл в angularjs e2e, ответ на тестирование транспортира я задаю путь к файлу на входном значении:
//Upload image
.then(function(){
//Get image's absolute path
var fileToUpload = '../../public/assets/img/header.jpg';
var absolutePath = path.resolve(__dirname, fileToUpload);
//Set image's path as input (file type) value
driver.findElement(By.id('fileUploadInput')).sendKeys(absolutePath);
//Submit form
driver.findElement(By.id('fileUploadForm')).submit();
// Switch back to Default Content
ptor.switchTo().defaultContent();
});
Кажется, что файл загружен внутри iframe, но не в мой проект, проблема в том, что iframe не закрывается и остается так:
Я связался с командой сборщиков файлов, и их ответ был:
Поэтому, когда файл загружен, все, что происходит, - это отправка результатов на исходный веб-сайт через интерфейс iframe или локальное хранилище. Если коммуникационный фрейм и локальное хранилище недоступны, отправка данных не удастся, а виджет останется открытым с сообщением об ошибке.
Поскольку они предполагают, что проблема может заключаться в том, что транспортир является одним из фреймов, поэтому он не может связаться с основным фреймом, несмотря на то, что я делаю ptor.switchTo().defaultContent();
переключиться на основной кадр.
Консоль имеет только одну ошибку и не очень полезна:
Я почти знаю, что происходит, но я не знаю, что еще делать, какой-нибудь совет / идея?
Заранее спасибо.
3 ответа
Это работает сейчас, как сказала я Алексею. .switchTo().defaultContent()
но я делаю после того, как .sendKeys(absolutePath)
, Не нужно отправлять форму.
Тогда я жду, чтобы iframe был закрыт ( нет).
Весь код:
var
ptor = protractor.getInstance(),
driver = ptor.driver;
//Open iframe
element(by.id('openIframe')).click();
//Wait iframe is present
browser.wait(function(){
return element(by.id('filepicker_dialog')).isPresent();
})
.then(function(){
//Switch protractor to iframe
ptor.switchTo().frame('filepicker_dialog');
})
//Upload image
.then(function(){
//Get image's absolute path
var fileToUpload = '../../public/assets/img/header.jpg';
var absolutePath = path.resolve(__dirname, fileToUpload);
//Set image's path as input (file type) value
driver.findElement(By.id('fileUploadInput')).sendKeys(absolutePath);
})
// Switch back to Default Content
.then(function(){
ptor.switchTo().defaultContent();
})
//Wait iframe is closed
.then(function(){
browser.wait(function(){
var deferred = protractor.promise.defer();
element(by.id('filepicker_dialog')).isPresent()
.then(function(present){
deferred.fulfill(!present);
});
return deferred.promise;
});
});
<input name="upload" type="file">
Решение:
var absolutePath = path.join (__dirname, '.. \\.. \\ dash-e2e-tests \\ resources \\ files-cab \\test-files\\image.png); элемент (by.xpath("XPath")) SendKeys(absolutePath).
Одной из возможных причин может быть "когда" вы переключаетесь на контент по умолчанию - попробуйте сделать это только после отправки формы:
element(by.id('fileUploadForm')).submit().then(function() {
browser.switchTo().defaultContent();
});