Angularjs e2e açıölçer testinde dosya nasıl yüklenir


Yanıtlar:


140

Ben böyle yaparım:

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. Yüklemek pathistediğiniz dosyanın tam yolunu çözmek için modülü kullanın .
  2. Giriş türü = "dosya" öğesinin yolunu ayarlayın .
  3. Yükle düğmesine tıklayın.

Bu firefox üzerinde çalışmayacaktır. İletki, öğe görünmediği için şikayet edecek. Firefox'a yüklemek için girdiyi görünür yapmanız gerekir. Bu benim işim:

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 Bu çalışıyor. Andres, OP'den geri bildirim istemelisin çünkü bu cevap doğru cevap olarak kabul edilebilir.
koma

1
Açıölçer ile de çalıştı.
Ilia Barahovski

7
FWIW, __dirnamebazen geçici bir dizine işaret eder (muhtemelen testlerin çalıştırıcı tarafından kopyalandığı yer). Durum buysa process.cwd()bunun yerine kullanabilirsiniz __dirname.
BorisOkunskiy

Bu benim için kromda çalışıyor, ancak diğer tarayıcılar için iletki, öğenin görünür olmadığından şikayet ediyor ... herhangi bir fikir?
Omid Ahourai

Öğe görünmediği için firefox ile yükleyemezsiniz. Yol değerini ayarlamak için öğeyi görünür yapmanız gerekir. Güncellenen yanıta bakın.
Andres D

15

Doğrudan yapamazsınız.

Güvenlik nedeniyle, ngScenario gibi işlevsel bir test paketi içinde sistemde bir dosya seçen bir kullanıcıyı simüle edemezsiniz.

İletki ile, WebDriver tabanlı olduğu için bu numarayı kullanmak mümkün olmalıdır.

S: WebDriver, dosya yüklemelerini destekliyor mu? A: Evet.

Yerel işletim sistemi dosya tarayıcısı iletişim kutusu ile doğrudan etkileşim kuramazsınız, ancak bir dosya yükleme öğesinde WebElement # sendKeys ("/ yol / / dosyaya") çağırırsanız, doğru şeyi yapması için biraz sihir yaparız. WebElement # dosya yükleme öğesine tıklamadığınızdan emin olun (), aksi takdirde tarayıcı muhtemelen kilitlenir.

Bu gayet iyi çalışıyor:

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

Bu, soruyu yanıtlamıyor gibi görünüyor ve başka bir siteye bağlantılar
aktif3

4

İşte Andres D ve davidb583'ün bu konuda çalışırken bana yardımcı olacak tavsiyelerinden oluşan bir kombinasyon ...

Flowjs kontrollerine karşı açıölçer testleri yaptırmaya çalışıyordum.

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

Bu benim için çalışıyor.


1

Firefox'a dosya yüklemek için yaptığım şey bu, bu komut dosyası, yol değerini ayarlamak için öğeyi görünür kılıyor:

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

0

Test ettiğim web uygulamasındaki dosya girişinin Firefox'ta yalnızca JavaScript kullanılarak görünüme kaydırıldığında göründüğünü fark ettim, bu yüzden benim uygulamam için çalışmasını sağlamak için Andres D'nin koduna scrollIntoView () ekledim:

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

        callback();
    });

(Ayrıca dosya giriş öğesi için tüm stilleri kaldırdım)


0

// C: \ Directory'den bir dosya yüklemek için

{

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

};


Peki değişken ne fileToUploadiçin?
Lynx 242

0

Aşağıdaki açılır pencereyi açmadan bir dosya seçmek istiyorsanız cevap:

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

mevcut belgelenmiş çözümler yalnızca kullanıcılar jQuery yüklüyorsa çalışacaktır. i tüm farklı durumlarda kullanıcılar aşağıdaki gibi bir hata alacak: Başarısız: $ tanımlı değil

yerel angularjs kodunu kullanarak bir çözümü belgelemeyi öneririm.

örneğin şunu önermek yerine öneririm:

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

önermek:

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

ikincisi daha standart, açısal ve daha önemlisi jquery gerektirmez

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.