python selenium chrome headless中的文件下载路径设置不适用
Posted
技术标签:
【中文标题】python selenium chrome headless中的文件下载路径设置不适用【英文标题】:The file download path setting in python selenium chrome headless does not apply 【发布时间】:2019-01-25 10:54:04 【问题描述】:我是韩国的一名网络开发人员。我们最近一直在使用这个 Python 来实现网站抓取功能。
我是 Python 新手。我们花了大约两天的时间寻找了很多东西,然后我们应用了它们。当前的问题包括:
-
单击 Excel 下载按钮以显示一个新窗口(弹出)。
在新窗口中单击“下载”会在父窗口中打开一个新选项卡,并在下载开始后立即关闭所有浏览器。
下载页面为php,数据通过header设置为Excel,以便浏览器自动识别下载。
问题是浏览器已关闭,下载未完成,文件也未保存。
我使用了以下源代码。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
chrome_driver = './browser_driver/chromedriver'
options = webdriver.ChromeOptions()
options.add_argument('--headless')
download_path = r"C:\Users\files"
timeout = 10
driver = webdriver.Chrome(executable_path=chrome_driver, chrome_options=options)
driver.command_executor._commands["send_command"] = (
"POST", '/session/$sessionId/chromium/send_command')
params = 'cmd': 'Page.setDownloadBehavior',
'params': 'behavior': 'allow', 'downloadPath': download_path
command_result = driver.execute("send_command", params)
driver.get("site_url")
#download new window
down_xls_btn = driver.find_element_by_id("download")
down_xls_btn.click()
driver.switch_to_window(driver.window_handles[1])
#download start
down_xls_btn = driver.find_element_by_id("download2")
down_xls_btn.click()
在没有无头模式的测试期间,一旦开始下载,浏览器本身就会关闭。 无头模式不下载文件本身。
注释与Page.setDownloadBehavior
相关的 DevTools 源会移除关闭但不会更改下载路径。
我英语不好,所以我把它翻译成了翻译。这太难了,因为我是初学者。请帮帮我。
我刚刚使用 Firefox 网络浏览器对其进行了测试。 Firefox 与 Chrome 不同,它以新形式而不是新选项卡显示下载窗口,它会运行自动下载并自动关闭窗口。
这里有问题。 事实上,即使在 Firefox 的无头模式下,下载也是成功的。 但是,之前定义的 driver.get() 的驱动在新窗口关闭时无法识别。
import os
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
import json
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir",download_path)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream, application/vnd.ms-excel")
fp.set_preference("dom.webnotifications.serviceworker.enabled",False)
fp.set_preference("dom.webnotifications.enabled",False)
timeout = 10
driver = webdriver.Firefox(executable_path=geckodriver, firefox_options=options, firefox_profile=fp)
driver.get(siteurl)
down_btn = driver.find_element_by_xpath('//*[@id="searchform"]/div/div[1]/div[6]/div/a[2]')
down_btn.click()
#down_btn Click to display a new window
#Automatic download starts in new window and closes window automatically
driver.switch_to_window(driver.window_handles[0])
#window_handles Select the main window and output the table to output an error.
print(driver.title)
也许这与我们之前提出的问题相同。 由于目前在 Firefox 中下载成功,我们编写了代码来定义一个新的驱动程序并继续进行后处理。
有人解决了这个问题吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,我设法以这种方式解决了它:
切换到另一个窗口后,您应该再次启用下载:
-
将此代码隔离到一个函数中
def enable_download_in_headless_chrome(driver, download_path):
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params =
'cmd': 'Page.setDownloadBehavior',
'params': 'behavior': 'allow', 'downloadPath': download_path
driver.execute("send_command", params)
-
当您需要从另一个窗口下载文件时调用它。
您的代码将是:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
chrome_driver = './browser_driver/chromedriver'
options = webdriver.ChromeOptions()
options.add_argument('--headless')
download_path = r"C:\Users\files"
timeout = 10
driver = webdriver.Chrome(executable_path=chrome_driver, chrome_options=options)
enable_download_in_headless_chrome(driver, download_path)
driver.get("site_url")
#download new window
down_xls_btn = driver.find_element_by_id("download")
down_xls_btn.click()
driver.switch_to_window(driver.window_handles[1])
enable_download_in_headless_chrome(driver, download_path) # THIS IS THE MISSING AND SUPER IMPORTANT PART
#download start
down_xls_btn = driver.find_element_by_id("download2")
down_xls_btn.click()
【讨论】:
以上是关于python selenium chrome headless中的文件下载路径设置不适用的主要内容,如果未能解决你的问题,请参考以下文章
关于python+selenium+Chrome的一些问题。get报错。请求大佬帮助
python selenium怎么配置IE和chrome的代理,求代码
python的selenium自动化打开chrome后自动和手工混合操作?