2
2

More than 3 years have passed since last update.

Selenium x GeckoDriverでダウンロードができなかったのを解決した関数

Last updated at Posted at 2020-06-29

Chromeが使えないPCが存在した

今回のはこれが原因でFirefox利用になりました。
https://forest.watch.impress.co.jp/docs/news/1226294.html

ダウンロード処理の際にダイアログが出てきてしまって詰まった

ざっくりと調べたところ、result.set_preference("browser.helperApps.neverAsk.saveToDisk", mimetypes)
でしっかりとMIMEタイプを指定できれば良いようです。今回ダウンロードしたいファイルはtxtなので、text/plainでいいと思ったのですがそれではうまくいかない....

MIMEタイプを調べる方法

解決にはこのページが役に立ちました。
https://stackoverflow.com/questions/39519518/python-selenium-firefox-neverask-savetodisk-when-downloading-from-blob-url
実際は上記のサイトとは微妙に異なっていました。
バージョンの関係なのか、mimetypes.rdfではなくhandlers.jsonの中にありました。
"mimeTypes"の中に"application/x-download"ってのがあったのでうまく解決しました。

解決したコード(関数)

ある程度MIMEタイプの種類をそろえたので、結構対応幅はあるのではないのでしょうか。


# 一時的なダウンロードフォルダ。相対パスで指定するのがうまくいかなかったために暫定処理として
DOWNLOAD_DIR = os.environ["USERPROFILE"] + r'\Desktop'

def open_browser(headless=True, width=0, height=0):
    print('\nブラウザを開く処理の開始')

    options = webdriver.FirefoxOptions()
    if(headless):
        options.add_argument('-headless')
    options.add_argument('--ignore-certificate-errors')

    profile = profile_for_download()
    driver = webdriver.Firefox(options=options, firefox_profile=profile)

    if (width > 0 and height > 0):
        driver.set_window_size(width, height)
    return driver

def profile_for_download():
    mimetypes = mimetypes_for_download()
    result = webdriver.FirefoxProfile()
    result.set_preference("browser.download.folderList", 2)
    result.set_preference("browser.download.dir", DOWNLOAD_DIR)
    result.set_preference(
        "browser.helperApps.neverAsk.saveToDisk", mimetypes)
    return result

def mimetypes_for_download():
    # ダウンロードのダイアログが出た場合はここを調整する。
    # 多分、プロファイルのフォルダのhandlers.jsonを見ればわかる。
    # プロファイルのフォルダは、設定 -> ヘルプ→ -> ラブルシューティング -> プロファイルフォルダーでわかる。
    result = ["text/xml","text/csv","text/plain",
    "image/png","image/jpeg","image/gif","audio/mpeg",
    "video/mpeg","video.mp4",
    "application/pdf","application/zip",
    "application/force-download","application/octet-stream","application/x-download"]
    return ",".join(result)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2