2017-08-11 13 views
20

私はpython-seleniumとChrome 59を使用しており、簡単なダウンロードシーケンスを自動化しようとしています。ブラウザを正常に起動すると、ダウンロードは機能しますが、ヘッドレスモードでダウンロードするとダウンロードできません。クロムヘッドレスとセレンのダウンロード

# Headless implementation 
from selenium import webdriver 

chromeOptions = webdriver.ChromeOptions() 
chromeOptions.add_argument("headless") 

driver = webdriver.Chrome(chrome_options=chromeOptions) 

driver.get('https://www.mockaroo.com/') 
driver.find_element_by_id('download').click() 
# ^^^ Download doesn't start 

# Normal Mode 
from selenium import webdriver 

driver = webdriver.Chrome() 

driver.get('https://www.mockaroo.com/') 
driver.find_element_by_id('download').click() 
# ^^^ Download works normally 

私も、デフォルトのパスを追加しようとしました:デフォルトのパスを追加

prefs = {"download.default_directory" : "/Users/Chetan/Desktop/"} 
chromeOptions.add_argument("headless") 
chromeOptions.add_experimental_option("prefs",prefs) 

は、通常の実装で動作しますが、同じ問題がで存続ヘッドレスバージョン。

ヘッドレスモードでダウンロードを開始するにはどうすればよいですか?

+0

私も 'submit'を使用し、' Keys.ENTER'を送信しようとしました:ここに参考のため

def enable_download_in_headless_chrome(self, driver, download_dir): # add missing support for chrome "send_command" to selenium webdriver driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command') params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}} command_result = driver.execute("send_command", params) 

は、これを使用する方法を実証するために少しレポです。通常のブラウザでは動作しますが、ヘッドレスでは動作しません。 – TheChetan

+0

あなたはそれがクロムのみを使用して行われますか?またはfirefoxもやりますか? –

+0

クロムまたはファントムを好む – TheChetan

答えて

14

これは、ソフトウェアからコンピュータにファイルをダウンロードするのを防ぐChromeの機能です。しかし、回避策があります。 Read more about it here。これは、いくつかのいずれかが述べたトピックに与えたソリューションです

async function setDownload() { 
    const client = await CDP({tab: 'ws://localhost:9222/devtools/browser'}); 
    const info = await client.send('Browser.setDownloadBehavior', {behavior : "allow", downloadPath: "/tmp/"}); 
    await client.close(); 
} 

:あなたがする必要がどのような

は、デベロッパーツールを経由してそのようなことを、それを可能にします。 Here is his comment

+4

この解決策はChromeにパッチを適用する必要がありますが、回避策ではありません。 'Browser.setDownloadBehavior'コマンドはChrome v62.0.3186.0では**存在しません**。 –

+0

私は数ヶ月前に同じ問題に飛びついた。私の質問にコメントして、ここで私に指摘してくれたおかげで、今日まで何の解決策も見つけられていない。この回答を読んで私を幸せにしていますが、このコードを自分のソースにコピーまたは適用する方法については本当に手掛かりがありません。 – Nihvel

+0

@Nihvel、https://stackoverflow.com/a/36613546/4110233助けてください! – TheChetan

3

あなたが扱うウェブサイトがブラウザ用に別のHTMLページを返す場合は、ヘッドレスブラウザで多分異なることを望むXPathやIdを意味するかもしれません。 headlessブラウザでpageSourceをダウンロードし、HTMLページとして開き、必要なIDまたはXPathを表示してください。 これはc#example How to hide FirefoxDriver (using Selenium) without findElement function error in PhantomDriver?と表示されます。

+0

ページを取得した後、 'driver.get_screenshot_as_file( 'foo.png')'を実行すると、実際のもののイメージとそれは大丈夫です。また、ドライバーはボタンを見つけることができます。これを調査する。 –

8

はい、セキュリティのための「機能」です。前述のように、バグの議論があります:https://bugs.chromium.org/p/chromium/issues/detail?id=696481

クロムバージョン62.0.3196.0以上がサポートされており、ダウンロードが可能です。

ここはPythonの実装です。 chromedriverコマンドにコマンドを追加する必要がありました。私はPRを提出しようとしていますので、将来それは図書館に含まれています。 https://github.com/shawnbutton/PythonHeadlessChrome

+0

これは私のために働いた。ニースの回避策。 –

関連する問題