Тестирование загрузки файла в средство выбора файлов с помощью транспортира в приложении 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();
});
Другие вопросы по тегам