Як завантажити файл при тестуванні транспортера 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.