Firefox에서 파일 다운로드 대화 상자에 액세스


83

Firefox에서 파일 다운로드 대화 상자를 조작 할 수있는 API가 있습니까? (사용자가 직접 시작하는 것이 아니라 사용자가 무언가를 할 때 나타나는 항목에 액세스하고 싶습니다.)

내가하고 싶은 것은 Selenium에서이 대화 상자에 액세스하는 것입니다 (그리고 Selenium "권한 모드"가 크롬 인터페이스에 액세스하기에 충분한 지 여부도 확실하지 않습니다).


3
저는 3 주 동안 처음으로 Apache 가상 사설 서버를 구성하고 (공유 호스팅에서 Selenium을 실행하는 것이 약간 까다롭기 때문에) Firefox, Selenium 및 Python을 함께 작동시키고 실제 Python 코드를 작성하는 데 보냈습니다. 자바 스크립트가 많은 사이트를 통해 파일을 다운로드합니다. 그런 다음 다운로드 한 파일에 실제로 액세스하는 방법을 몰랐습니다. 먼저 질문 해주셔서 정말 기쁩니다.
Paul D. Waite 2011

Firefox에 괜찮은 AppleScript 사전이 있다면 AppleScript가 좋습니다.
Nicolas Barbulesco 2013

캔 사람의 도움이 나를 [이 웹 사이트에서 질문] [1] [1] : stackoverflow.com/questions/27058053/...
예브게니 Semashko

답변:


33

내가 아는 한에서는 아니다. 그러나 Firefox가 자동으로 다운로드를 시작하고 특정 위치에 파일저장 하도록 구성 할 수 있습니다 . 그러면 테스트에서 파일이 실제로 도착했는지 확인할 수 있습니다.


좋아,이 솔루션을 사용하겠습니다.
Andrey Shchekin

1
그러나 selenium은 기본 프로필 (프로필이 지정되지 않았으므로)에서 Firefox를 시작하므로 구성 할 때마다합니다. 대신 선호하는 새 프로필을 만들어 더 쉽게 만듭니다.
Vignesh Dhamodaran

71

이 문제에 대한 해결책이 있습니다. 코드를 확인하십시오.

FirefoxProfile firefoxProfile = new FirefoxProfile();

firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir","c:\\downloads");
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);

driver.navigate().to("http://www.myfile.com/hey.csv");

1
닫히지 만 2013 년 8 월 17 일 현재 Ubuntu 12.04의 Firefox에서 제대로 작동하지 않습니다. "browser.helperApps.neverAsk.saveToDisk"속성 값을 "text / csv, application / vnd.ms-excel"로 변경하면 Ubuntu에서 작동합니다.
바코 야로

2
값 이름이 변경되었을 수 있으며 이는 1 년 이상 이후입니다.
dlopezgonzalez

1
동일한 방법을 사용하여 파일을 자동 저장하지만 작동하지 않습니다. 내 firefox 버전은 20.0입니다. 그리고 pdf 파일을 다운로드하려고합니다 (MIME 유형 사용-> application / pdf, application / x-pdf)
Yatin

3
이것이 Content-Disposition: attachment. 이 경우 Firefox는 항상 대화 상자를 팝업하는 것 같습니다!
Martin Höller

: 리눅스에서 XLS 파일을 다운로드 이것은 나를 위해 일한setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
donfuxx

42

나는 같은 문제에 시달렸지만 해결책을 찾았습니다. 나는이 블로그 와 같은 방식으로 했다.

물론 이것은 Java였으며 Python으로 번역했습니다.

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir",getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")

browser = webdriver.Firefox(firefox_profile=fp)

내 예에서는 CSV 파일이었습니다. 그러나 더 많은 것을 필요로 할 때~/.mozilla/$USER_PROFILE/mimeTypes.rdf


3
나는 이것을 시도했지만 그것은 나를 위해 작동하지 않는 것 같습니다. 파일 저장 대화 상자가 계속 표시됩니다.
ealfonso

1
감사합니다. 마지막 선호는 클러치였습니다. "application / pdf"
user2426679

1
동일한 방법을 사용하여 파일을 자동 저장하지만 작동하지 않습니다. 내 firefox 버전은 20.0입니다. 그리고 pdf 파일을 다운로드하려고합니다 (MIME 유형 사용-> application / pdf, application / x-pdf)
Yatin

1
@Akendo 감사합니다. 이것은 python 3.4.3, selenium-2.52 및 Firefox 44를 사용하여 저에게
Igor

8

웹 애플리케이션은 3 가지 유형의 팝업을 생성합니다. 즉,

 1| JavaScript PopUps
 2| Browser PopUps
 3| Native OS PopUps [e.g., Windows Popup like Upload/Download]

일반적으로 JavaScript 팝업은 웹 애플리케이션 코드에 의해 생성됩니다. Selenium은 이러한 JavaScript 팝업을 처리하기위한 API를 제공합니다.Alert .

결국 브라우저 팝업을 무시하고 파일을 다운로드하는 가장 간단한 방법은 브라우저 프로필을 사용하는 것입니다. 이를 수행하는 몇 가지 방법이 있습니다.

  • 브라우저 속성 (또는)의 변경을 수동으로 포함
  • 프로필 setPreference를 사용하여 브라우저 속성 사용자 지정

방법 1

브라우저 프로필에서 팝업 작업을 시작하기 전에 다운로드 옵션이 기본적으로 파일 저장으로 설정되어 있는지 확인하십시오.

(Firefox 열기) 도구> 옵션> 애플리케이션

여기에 이미지 설명 입력

방법 2

아래 스 니펫을 사용하고 필요할 때마다 편집하십시오.

FirefoxProfile profile = new FirefoxProfile();

String path = "C:\\Test\\";
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", path);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.download.manager.focusWhenStarting", false);  
profile.setPreference("browser.download.useDownloadDir", true);
profile.setPreference("browser.helperApps.alwaysAsk.force", false);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.download.manager.closeWhenDone", true);
profile.setPreference("browser.download.manager.showAlertOnComplete", false);
profile.setPreference("browser.download.manager.useWindow", false);
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
profile.setPreference("pdfjs.disabled", true);
       
driver = new FirefoxDriver(profile);

4

나는 같은 문제에 직면했다. 애플리케이션에서 FireFox 인스턴스는 다음과 같이 DesiredCapabilities를 전달하여 생성되었습니다.

driver = new FirefoxDriver(capabilities);

다른 사람의 제안에 따라 변경했습니다.

FirefoxProfile firefoxProfile = new FirefoxProfile();     
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");
driver = new FirefoxDrvier(firefoxProfile);

이것은 목적을 달성했지만 불행히도 다른 자동화 테스트가 실패하기 시작했습니다. 그 이유는 이전에 전달 된 기능을 제거했기 때문입니다.

인터넷에서 좀 더 검색하고 다른 방법을 찾았습니다. 원하는 기능에서 프로파일 자체를 설정할 수 있습니다.

따라서 새로운 작업 코드는 다음과 같습니다.

DesiredCapabilities capabilities = DesiredCapabilities.firefox();

// add more capabilities as per your need.
FirefoxProfile firefoxProfile = new FirefoxProfile();        
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");

// set the firefoxprofile as a capability
capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile);
driver = new FirefoxDriver(capabilities);

3

모르겠지만 Firefox 다운로드 애드온 중 하나의 소스를 확인할 수 있습니다.

다음은 Download Statusbar를 사용하는 소스입니다 .


고맙습니다. 매우 흥미 롭습니다 (하지만 xul 부분으로 확장 기능을 작성하지 않는 한 불가능하거나 엄청나게 어렵습니다).
Andrey Shchekin

3

대부분의 브라우저 (내 경우 Firefox)는 기본적으로 확인 버튼을 선택합니다. 그래서 다음 코드를 사용하여이 문제를 해결했습니다. 기본적으로 Enter 키를 누르면 파일이 다운로드됩니다.

Robot robot = new Robot();

// A short pause, just to be sure that OK is selected
Thread.sleep(3000);

robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

3

나는 같은 문제가 있었고 Save Dialogue에 대한 액세스 권한이 없었습니다.

아래 코드가 도움이 될 수 있습니다.

    FirefoxProfile fp = new FirefoxProfile();
    fp.setPreference("browser.download.folderList",2);
    fp.setPreference("browser.download.manager.showWhenStarting",false);
    fp.setPreference("browser.helperApps.alwaysAsk.force", false);
    // Below you have to set the content-type of downloading file(I have set simple CSV file)
    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

다운로드중인 파일 형식에 따라 콘텐츠 형식 을 지정해야합니다 .

' ;로 구분 된 여러 콘텐츠 유형을 지정할 수 있습니다 . '

예 :

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");

2

다음과 같이 기본 파일 다운로드 대화 상자를 트리거하는 대신 :

By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();

대신 기본 파일 다운로드 대화 상자를 건너 뛰기 위해이 작업을 수행합니다. 이렇게하면 모든 브라우저에서 작동합니다.

String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);

getFileFromURLApache HttpClient를 사용하여 파일을 다운로드하고 파일 참조를 반환하는 메서드를 구현 하면됩니다.

마찬가지로 Selenide를 사용하는 경우 download()파일 다운로드를 처리 하는 내장 함수를 사용하여 동일한 방식으로 작동합니다 .


이는 html에서 정적으로 링크 된 파일에 대해서만 작동합니다. 예를 들어 post (또는 유사한) 요청을 기반으로 생성되는 fille가 아닙니다.
Todor Minakov

예, 마일리지는 다를 수 있습니다. 일반적으로 개발자와 협력하여 이러한 부가적인 경우에서 무언가를 파악할 수 있습니다.
djangofan

0

나는 당신의 목표를 취소하지 않았습니다. 테스트가 실행될 때 테스트가 자동으로 파일을 다운로드하기를 원하십니까? 그렇다면 테스트 실행에서 사용자 정의 Firefox 프로필을 사용해야합니다.

사용자 지정 프로필에서 처음으로 테스트를 수동으로 실행하고 다운로드 대화 상자가 나타나면 디스크에 저장으로 설정하고 다음에 테스트를 실행할 때 파일이 자동으로 다운로드되도록 항상이 작업 수행 확인란을 선택합니다.


0

또한 추가 할 수 있습니다

      profile.setPreference("browser.download.panel.shown",false);

기본적으로 표시되고 웹 페이지의 일부를 가리는 다운로드 된 파일 목록을 제거합니다.

내 총 설정은 다음과 같습니다.

        DesiredCapabilities dc = DesiredCapabilities.firefox();
        dc.merge(capabillities);
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setPreference("browser.download.folderList", 4);
        profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath());
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.closeWhenDone", true);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.panel.shown",false);
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        this.driver = new FirefoxDriver(dc);

1
안녕하세요 Neil Ellis, 이미지 버튼을 클릭하면 "내보내기"팝업 창이 열립니다. 팝업 창에서 파일 다운로드가 트리거되고 팝업이 닫힙니다. 가능하면이 시나리오에서 자동 파일 다운로드를 수행하도록 안내해주십시오.
AVA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.