Firefoxのファイルダウンロードダイアログへのアクセス


83

Firefoxでファイルダウンロードダイアログを操作できるAPIはありますか?(自分で開始するのではなく、ユーザーが何かをしたときに表示されるものにアクセスしたい)。

私がやりたいのは、Seleniumからこのダイアログにアクセスすることです(そして、Seleniumの「特権モード」がChromeインターフェイスにアクセスするのに十分かどうかもわかりません)。


3
私は3週間の大部分を初めて自分のApache仮想プライベートサーバーを構成し(共有ホスティングでSeleniumを実行するのは少し難しいため)、Firefox、Selenium、Pythonを連携させ、実際のP​​ythonコードを作成するのに費やしました。非常にJavaScriptを多用するサイトを介して、すべてのサイトの最後にファイルをダウンロードします。その後、ダウンロードしたファイルに実際にアクセスする方法がわからないことに気づきました。最初に質問してくれて本当にうれしいです。
Paul D. Waite 2011

FirefoxにまともなAppleScript辞書があれば、AppleScriptはそのために素晴らしいでしょう。
Nicolas Barbulesco 2013年

缶誰の助けを私に[このサイトで質問] [1] [1]:stackoverflow.com/questions/27058053/...
たYevgeniy Semashko

回答:


33

私が知っていることではありません。ただし、ダウンロード自動的に開始してファイルを特定の場所に保存するようにFirefoxを構成することはできます。次に、テストでファイルが実際に到着したことを確認できます。


わかりました、私はこの解決策で行くと思います。
Andrey Shchekin 2009

1
ただし、seleniumはデフォルトのプロファイルでFirefoxを起動するため(プロファイルが指定されていないため)、構成するたびに起動します。代わりに、好みで新しいプロファイルを作成して、簡単にします。
Vignesh Dhamodaran 2016年

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日の時点で、Ubuntu12.04上のFirefoxでは完全には機能していません。「browser.helperApps.neverAsk.saveToDisk」プロパティの値を「text / csv、application / vnd.ms-excel」に変更すると、Ubuntuで機能します。
bakoyaro 2013

2
値の名前が変更された可能性があります。これは1年以上経過しています。
dlopezgonzalez 2013

1
同じ方法を使用してファイルを自動保存していますが、機能しません。私のFirefoxのバージョンは20.0です。そして私はpdfファイルをダウンロードしようとしています(使用されるMIMEタイプ-> application / pdf、application / x-pdf)
Yatin 2015

3
これがで機能していないわけではありませんContent-Disposition: attachment。この場合、Firefoxは常にダイアログをポップアップするようです。
マーティン大声

Linuxでxlsファイルをダウンロードする場合、これは私のために機能しました:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
donfuxx 2016年

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 2013年

1
おかげで、最後の好みはクラッチでした: "application / pdf"
user2426679 2015

1
同じ方法を使用してファイルを自動保存していますが、機能しません。私のFirefoxのバージョンは20.0です。そして、私はpdfファイルをダウンロードしようとしています(使用されるMIMEタイプ-> application / pdf、application / x-pdf)
Yatin 2015

1
@Akendoありがとうございます。これは、Python 3.4.3、セレン2.52とFirefox 44を使用して私のために働いている
イゴール

8

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

最終的に、ブラウザのポップアップを無視してファイルをダウンロードする最も簡単な方法は、ブラウザのプロファイルを利用することです。これを行うには、いくつかの方法があります。

  • ブラウザのプロパティを手動で変更する(または)
  • プロファイル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ダウンロードアドオンの1つのソースを確認できます。

これが私がダウンロードステータスバーを使用しているもののソースです。


おかげで、それは非常に興味深いものです(ただし、xulパーツを使用して拡張機能を作成しない限り、それは不可能であるか、めちゃくちゃ難しいことを証明しています)。
Andrey Shchekin 2009

3

ほとんどのブラウザ(私の場合は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);

3

同じ問題が発生しました。[ダイアログを保存]にアクセスしたくありませんでした。

以下のコードが役立ちます:

    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で静的にリンクされたファイルに対してのみ機能します。たとえば、投稿(または同様の)リクエストに基づいて生成されたファイルは機能しません。
Todor Minakov 2018

ええ、走行距離は異なる場合があります。通常、開発者と協力して、これらのフリンジケースで何かを理解することができます。
djangofan 2018

0

私はあなたの目的を理解していませんでした。テストの実行時にファイルを自動的にダウンロードするようにしますか?はいの場合、テストの実行でカスタムFirefoxプロファイルを使用する必要があります。

カスタムプロファイルで、初めて手動でテストを実行し、ダウンロードダイアログが表示されたら、[ディスクに保存]を設定し、[常にこのアクションを実行する]チェックボックスをオンにします。これにより、次回テストを実行したときにファイルが自動的にダウンロードされます。


0

さらに、追加することができます

      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);

1
こんにちはニールエリス、画像ボタンをクリックして、「エクスポート」はポップアップウィンドウを開きます。ポップアップウィンドウからファイルのダウンロードがトリガーされ、ポップアップが閉じます。可能であれば、このシナリオでサイレントファイルのダウンロードを実現するためのガイドを教えてください。
AVA 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.