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. input 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 작동 중입니다. Andres,이 질문이 정답으로 받아 들여질 수 있으므로 OP에 피드백을 요청해야합니다.
혼수 상태

1
각도기와 함께 작업했습니다.
Ilia Barahovski 2014 년

6
FWIW는 __dirname때때로 임시 디렉터리 (테스트 실행자가 테스트를 복사하는 위치)를 가리 킵니다. process.cwd()__dirname경우 대신 사용할 수 있습니다 .
BorisOkunskiy

이것은 크롬에서 나를 위해 일하고 있지만 다른 브라우저의 경우 각도기가 요소가 보이지 않는다고 불평합니다 ... 어떤 아이디어?
Omid Ahourai 2015 년

요소가 보이지 않기 때문에 firefox로 업로드 할 수 없습니다. 경로 값을 설정하려면 요소를 표시해야합니다. 업데이트 된 답변을 참조하십시오.
Andres D

14

직접 할 수는 없습니다.

보안상의 이유로 ngScenario와 같은 기능 테스트 스위트 내에서 시스템에서 파일을 선택하는 사용자를 시뮬레이션 할 수 없습니다.

Protractor를 사용하면 WebDriver를 기반으로하기 때문에이 트릭 을 사용할 수 있습니다.

Q : WebDriver는 파일 업로드를 지원합니까? A : 네.

기본 OS 파일 브라우저 대화 상자와 직접 상호 작용할 수는 없지만 파일 업로드 요소에서 WebElement # sendKeys ( "/ path / to / file")를 호출하면 올바른 작업을 수행하도록 몇 가지 마법을 사용합니다. 파일 업로드 요소를 WebElement # click ()하지 않도록하십시오. 그렇지 않으면 브라우저가 중단 될 수 있습니다.

이것은 잘 작동합니다.

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

이것은 질문에 답하지 않는 것 같고 다른 사이트로 연결됩니다
activedecay

4

여기에 제가이 문제를 해결하는 데 도움이되었을 Andres D와 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

이것이 파이어 폭스에 파일을 업로드하기 위해하는 일입니다.이 스크립트는 경로 값을 설정하기 위해 요소를 표시합니다.

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

0

테스트중인 웹 앱의 파일 입력은 JavaScript를 사용하여보기로 스크롤 할 때만 Firefox에서 볼 수 있다는 것을 깨달았으므로 Andres D의 코드에 scrollIntoView ()를 추가하여 앱에서 작동하도록했습니다.

  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는 무엇입니까?
Lynx 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가 필요하지 않은 것이 더 중요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.