Як завантажити файл при тестуванні транспортера angularjs e2e


Відповіді:


138

Ось як я це роблю:

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();
});
  1. Використовуйте pathмодуль, щоб визначити повний шлях до файлу, який потрібно завантажити.
  2. Встановіть шлях до елемента type = "file" .
  3. Клацніть на кнопку завантаження.

Це не спрацює на 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();

+1 Це працює. Андресе, вам слід попросити ОЗ про відгук, оскільки це може бути прийнято як правильна відповідь.
— кома

1
Працював і з транспортиром.
— Ilia Barahovski,

6
FWIW, __dirnameіноді вказує на тимчасовий каталог (можливо, там, де тести копіюються програмою запуску тестів). Ви можете використовувати process.cwd()замість цього, __dirnameякщо це так.
— Борис Окунський

Це працює у мене в chrome, але для інших браузерів транспортир скаржиться, що елемент не видно ... будь-які ідеї?
— Омід Ахурай

Ви не можете завантажувати за допомогою firefox, оскільки елемент не видно. Вам потрібно зробити елемент видимим, щоб встановити значення шляху. Дивіться оновлену відповідь.
— Андрес Д,

14

Не можна безпосередньо.

З міркувань безпеки ви не можете імітувати користувача, який вибирає файл у системі, у функціональному наборі тестування, такому як ngScenario.

З Protractor, оскільки він заснований на WebDriver, має бути можливо використовувати цей фокус

З: Чи підтримує WebDriver завантаження файлів? В: Так.

Ви не можете безпосередньо взаємодіяти з діалоговим вікном переглядача файлів ОС, але ми робимо магію, щоб, якщо ви викликаєте WebElement # sendKeys ("/ шлях / до / файлу") для елемента завантаження файлу, він робить правильно. Переконайтеся, що ви не натискаєте WebElement # () на елемент завантаження файлу, інакше браузер, можливо, зависне.

Це чудово працює:

$('input[type="file"]').sendKeys("/file/path")

Здається, це не відповідає на запитання, а посилання на інший сайт
— activedecay

4

Ось комбінація Андреса Д та порад 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);

2
var imagePath = 'http://placehold.it/120x120&text=image1';
element(by.id('fileUpload')).sendKeys(imagePath);

Це працює для мене.


1

Це те, що я роблю для завантаження файлу у firefox, цей скрипт робить елемент видимим, щоб встановити значення шляху:

   browser.executeScript("$('input[type=\"file\"]').parent().css('visibility', 'visible').css('height', 1).css('width', 1).css('overflow', 'visible')");

0

Я зрозумів, що введення файлу у веб-програмі, яку я тестую, видно лише у Firefox, коли вона прокручується до перегляду за допомогою JavaScript, тому я додав scrollIntoView () в код Andres D, щоб він працював для мого додатка:

  browser.executeAsyncScript(function (callback) {
        document.querySelectorAll('input')[2]
     .style = '';
        document.querySelectorAll('input')[2].scrollIntoView();

        callback();
    });

(Я також видалив усі стилі для елемента введення файлу)


0

// Завантажити файл із каталогу C: \

{

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();

};


То для чого потрібна змінна fileToUpload?
— Рись 242,

0

Якщо ви хочете вибрати файл, не відкриваючи спливаюче спливаюче вікно, це відповідь:

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

-3

поточні задокументовані рішення працюють лише в тому випадку, якщо користувачі завантажують jQuery. я у всіх різних ситуаціях користувачі отримуватимуть таку помилку: Помилка: $ не визначено

я б запропонував задокументувати рішення, використовуючи власний код angularjs.

наприклад, я б запропонував замість того, щоб пропонувати:

    $('input[type="file"]') .....

запропонувати:

    angular.element(document.querySelector('input[type="file"]')) .....

остання є більш стандартною, поверх кутової і, що важливіше, не вимагає jquery

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.