Firefoxでファイルダウンロードダイアログを操作できるAPIはありますか?(自分で開始するのではなく、ユーザーが何かをしたときに表示されるものにアクセスしたい)。
私がやりたいのは、Seleniumからこのダイアログにアクセスすることです(そして、Seleniumの「特権モード」がChromeインターフェイスにアクセスするのに十分かどうかもわかりません)。
Firefoxでファイルダウンロードダイアログを操作できるAPIはありますか?(自分で開始するのではなく、ユーザーが何かをしたときに表示されるものにアクセスしたい)。
私がやりたいのは、Seleniumからこのダイアログにアクセスすることです(そして、Seleniumの「特権モード」がChromeインターフェイスにアクセスするのに十分かどうかもわかりません)。
回答:
私が知っていることではありません。ただし、ダウンロードを自動的に開始してファイルを特定の場所に保存するように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
Webアプリケーションは、3種類のポップアップを生成します。つまり、
1| JavaScript PopUps
2| Browser PopUps
3| Native OS PopUps [e.g., Windows Popup like Upload/Download]
一般に、JavaScriptポップアップはWebアプリケーションコードによって生成されます。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ダウンロードアドオンの1つのソースを確認できます。
これが私がダウンロードステータスバーを使用しているもののソースです。
同じ問題が発生しました。[ダイアログを保存]にアクセスしたくありませんでした。
以下のコードが役立ちます:
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);
デフォルトで表示され、Webページの一部を覆っているダウンロード済みファイルリストを削除します。
私の合計設定は次のとおりです。
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);