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.