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");
私は同じ問題に悩まされていましたが、解決策を見つけました。これと同じ方法でやりました blog と同じです。
もちろんこれは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は、Alert
などのこれらのJavaScriptポップアップを処理するAPIを提供します。
最終的には、ブラウザのポップアップを無視してファイルをダウンロードする最も簡単な方法は、ブラウザプロファイルを使用することによって行われます。これを行うには、いくつかの方法があります。
ブラウザプロファイルのポップアップの操作を開始する前に、ダウンロードオプションがデフォルトで[ファイルを保存]に設定されていることを確認してください。
(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のダウンロードアドオンのソースを確認できます。
ここに私が使用するもののソースがあります ステータスバーをダウンロード 。
私は同じ問題を抱えていました。SaveDialogueにアクセスしたくありませんでした。
以下のコードが役立ちます:
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");
ほとんどのブラウザ(私の場合はFirefox)は、デフォルトで[OK]ボタンを選択します。そのため、次のコードを使用してこれを解決しました。基本的に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);
ネイティブファイルダウンロードダイアログを次のようにトリガーする代わりに:
_By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();
_
私は通常、これを代わりに行い、ネイティブのファイルダウンロードダイアログをバイパスします。これにより、すべてのブラウザで動作します:
_String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);
_
これには、Apache HttpClientを使用してファイルをダウンロードし、ファイル参照を返すメソッドgetFileFromURL
を実装する必要があります。
同様に、たまたま 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);