2017-08-11 66 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'也試過。它適用於普通的瀏覽器,但不適用於無頭的瀏覽器。 – TheChetan

+0

你是否希望使用chrome來完成?或者Firefox也會這樣做? –

+0

喜歡chrome或phantomjs – TheChetan

回答

14

這是Chrome的一項功能,可防止軟件將文件下載到您的計算機。儘管有一個解決方法。 Read more about it here

你需要做的是通過DevTools啓用它,類似的東西:

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,這不是一種解決方法。在Chrome v62.0.3186.0中,「Browser.setDownloadBehavior」命令不存在**。 –

+0

幾個月前,我跳入了同一個問題。直到今天還沒有找到任何解決方案,這要感謝一位老兄評論我的問題並指着我。閱讀這個答案讓我很開心,但我真的不知道如何複製或修改源代碼中的這些代碼。 – Nihvel

+0

@Nihvel,https://stackoverflow.com/a/36613546/4110233可能會有所幫助! – TheChetan

3

也許您處理的網站爲瀏覽器返回不同的HTML頁面,這意味着您希望在無頭瀏覽器中使用不同的XPath或Id。 嘗試在無頭瀏覽器中下載pageSource並將其作爲HTML頁面打開,以查看所需的Id或XPath。 您可以將此視爲c#示例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,以便將來將其包含在圖書館中。

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) 

僅供參考這裏是一個小回購來演示如何使用: https://github.com/shawnbutton/PythonHeadlessChrome

+0

這對我有用。很好的解決方法。 –