繁体   English   中英

python selenium chrome headless中的文件下载路径设置不适用

[英]The file download path setting in python selenium chrome headless does not apply

我是韩国的Web开发人员。 我们最近一直在使用此Python来实现网站抓取功能。

我是Python的新手。 我们在两天内寻找了很多东西,然后应用了它们。 当前的问题包括:

  1. 单击Excel下载按钮以显示一个新窗口(弹出)。
  2. 单击新窗口中的下载,将在父窗口中打开一个新选项卡,并在下载开始后立即关闭所有浏览器。
  3. 下载页面是PHP,数据通过标题设置为Excel,以便浏览器自动识别下载。
  4. 问题是浏览器已关闭,下载未完成,文件也未保存。

我使用了以下源代码。

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()

在没有无头模式的测试过程中,一旦开始下载,浏览器本身就会关闭。 无头模式不会下载文件本身。

注释涉及到DevTools源Page.setDownloadBehavior删除关闭,但不会更改下载路径。

我不会英语,所以我将其翻译成翻译。 太难了,因为我是一个初学者。 请帮我。


我刚刚使用Firefox Web浏览器对其进行了测试。 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)
  1. 每当您需要从另一个窗口下载文件时,都可以调用它。

您的代码将是:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM