Firefox에서 파일 다운로드 대화 상자를 조작 할 수있는 API가 있습니까? (사용자가 직접 시작하는 것이 아니라 사용자가 무언가를 할 때 나타나는 항목에 액세스하고 싶습니다.)
내가하고 싶은 것은 Selenium에서이 대화 상자에 액세스하는 것입니다 (그리고 Selenium "권한 모드"가 크롬 인터페이스에 액세스하기에 충분한 지 여부도 확실하지 않습니다).
Firefox에서 파일 다운로드 대화 상자를 조작 할 수있는 API가 있습니까? (사용자가 직접 시작하는 것이 아니라 사용자가 무언가를 할 때 나타나는 항목에 액세스하고 싶습니다.)
내가하고 싶은 것은 Selenium에서이 대화 상자에 액세스하는 것입니다 (그리고 Selenium "권한 모드"가 크롬 인터페이스에 액세스하기에 충분한 지 여부도 확실하지 않습니다).
답변:
내가 아는 한에서는 아니다. 그러나 Firefox가 자동으로 다운로드를 시작하고 특정 위치에 파일 을 저장 하도록 구성 할 수 있습니다 . 그러면 테스트에서 파일이 실제로 도착했는지 확인할 수 있습니다.
이 문제에 대한 해결책이 있습니다. 코드를 확인하십시오.
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");
Content-Disposition: attachment
. 이 경우 Firefox는 항상 대화 상자를 팝업하는 것 같습니다!
setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
나는 같은 문제에 시달렸지만 해결책을 찾았습니다. 나는이 블로그 와 같은 방식으로 했다.
물론 이것은 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 가지 유형의 팝업을 생성합니다. 즉,
1| JavaScript PopUps
2| Browser PopUps
3| Native OS PopUps [e.g., Windows Popup like Upload/Download]
일반적으로 JavaScript 팝업은 웹 애플리케이션 코드에 의해 생성됩니다. Selenium은 이러한 JavaScript 팝업을 처리하기위한 API를 제공합니다.Alert
.
결국 브라우저 팝업을 무시하고 파일을 다운로드하는 가장 간단한 방법은 브라우저 프로필을 사용하는 것입니다. 이를 수행하는 몇 가지 방법이 있습니다.
브라우저 프로필에서 팝업 작업을 시작하기 전에 다운로드 옵션이 기본적으로 파일 저장으로 설정되어 있는지 확인하십시오.
(Firefox 열기) 도구> 옵션> 애플리케이션
아래 스 니펫을 사용하고 필요할 때마다 편집하십시오.
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);
나는 같은 문제에 직면했다. 애플리케이션에서 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);
모르겠지만 Firefox 다운로드 애드온 중 하나의 소스를 확인할 수 있습니다.
다음은 Download Statusbar를 사용하는 소스입니다 .
나는 같은 문제가 있었고 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");
다음과 같이 기본 파일 다운로드 대화 상자를 트리거하는 대신 :
By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();
대신 기본 파일 다운로드 대화 상자를 건너 뛰기 위해이 작업을 수행합니다. 이렇게하면 모든 브라우저에서 작동합니다.
String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);
getFileFromURL
Apache HttpClient를 사용하여 파일을 다운로드하고 파일 참조를 반환하는 메서드를 구현 하면됩니다.
마찬가지로 Selenide를 사용하는 경우 download()
파일 다운로드를 처리 하는 내장 함수를 사용하여 동일한 방식으로 작동합니다 .
나는 당신의 목표를 취소하지 않았습니다. 테스트가 실행될 때 테스트가 자동으로 파일을 다운로드하기를 원하십니까? 그렇다면 테스트 실행에서 사용자 정의 Firefox 프로필을 사용해야합니다.
사용자 지정 프로필에서 처음으로 테스트를 수동으로 실행하고 다운로드 대화 상자가 나타나면 디스크에 저장으로 설정하고 다음에 테스트를 실행할 때 파일이 자동으로 다운로드되도록 항상이 작업 수행 확인란을 선택합니다.
또한 추가 할 수 있습니다
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);