[Selenium] ヘッドレスモードでCSVファイルをダウンロードしたい時の対処法

ITpython, Selenium

Selenium はヘッドレスモードで起動すると、CSV ファイルがダウンロードできないみたいで、その際の対処法です。

こちらのコードをそのまま拝借してます。(@taapo.com のご担当者様?ありがとうございます。)
参考:https://bugs.chromium.org/p/chromium/issues/detail?id=696481#c86

headless_test.py

# coding:utf-8
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options

def enable_download_in_headless_chrome(browser, download_dir):
    #add missing support for chrome "send_command"  to selenium webdriver
    browser.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

    params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}}
    browser.execute("send_command", params)

options = Options()
options.add_argument('--headless')

DOWNNLOAD_DIR = "put your download path here"

driver = webdriver.Chrome(executable_path='/Applications/chromedriver',chrome_options=options)

# Selenium の WebDriver に Chrome の send_command を付ける
enable_download_in_headless_chrome(driver, DOWNNLOAD_DIR)

# 参考サイト:IT DASHBOARD 様の CSV ダウンロード画面
driver.get('http://www.itdashboard.go.jp/DataFeeds/csv')

sleep(1)
# CSV ダウンロードをクリック
driver.find_element_by_xpath('/html/body/div[2]/div[3]/table/tbody/tr[2]/td[5]/form/input[3]').click()

# ダウンロード中にブラウザが閉じないよう長めに待機
sleep(10)
# ブラウザを閉じる
driver.quit()

注意点もおっしゃってくれてまして、挙動を確認してましたら、おっしゃる通りでした。

– make sure you put the download directory into the method call. It will not use the normal default download location.

– don’t close the browser until the download is done, or it will abort the download.

・ダウンロードしたいパスを指定しないとデフォルトのダウンロード先にダウンロードされる

・ダウンロードが終わる前にブラウザを閉じると、ダウンロードが中断される

以上になります。

おかげでヘッドレスでもCSVファイルがダウンロードできるようになりました。

それでは快適な Selenium ライフを

ひとこと

コード内のメソッド enable_download_in_headless_chrome を書くには Selenium、Chrome の仕様を把握してないとできないと思うのですが、これが書けるってすごい。

スポンサーリンク

Posted by nobuhiro harada