web-dev-qa-db-ja.com

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

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

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

81
Andrey Shchekin

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

31
Aaron Digulla

私はこの問題の解決策を持っています、コードを確認してください:

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");
70
dlopezgonzalez

私は同じ問題に悩まされていましたが、解決策を見つけました。これと同じ方法でやりました 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

39
Akendo

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を提供します。

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

  • ブラウザーのプロパティの変更を手動で行う(または)
  • プロファイルsetPreferenceを使用してブラウザーのプロパティをカスタマイズする

方法1

ブラウザプロファイルのポップアップの操作を開始する前に、ダウンロードオプションがデフォルトで[ファイルを保存]に設定されていることを確認してください。

(Firefoxを開く)[ツール]> [オプション]> [アプリケーション]

enter image description here

方法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);
7
Prashanth Sams

私は同じ問題に直面していました。アプリケーションでは、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);
5
Sanjay Bharwani

わかりませんが、Firefoxのダウンロードアドオンのソースを確認できます。

ここに私が使用するもののソースがあります ステータスバーをダウンロード

3
Nifle

私は同じ問題を抱えていました。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");
3
Pratik Patel

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

ネイティブファイルダウンロードダイアログを次のようにトリガーする代わりに:

_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()関数を使用してファイルのダウンロードを処理するのと同じように機能します。

2
djangofan

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

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

0
Ruturaj

さらに追加できます

      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);
0
Neil Ellis