selenium控制文件下载位置

selenium控制文件下载位置

我们在自动化下载文件的时候势必存在一种需求: 通过chrome将文件保存到指定位置

1. google窗口实现

​ 配置'prefs'将文件下载到指定位置, 并通过判断文件的大小来判断文件是否下载完成

import os
import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

options = Options()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': os.getcwd() + '\\download'}
options.add_experimental_option("prefs", prefs)
web = webdriver.Chrome(options=options)
web.get("https://pypi.org/project/selenium/#files")
time.sleep(5)
web.find_element_by_xpath('//*[@id="files"]/div/div[2]/a[1]').click()
# 获取下载文件的路径
download_dir = os.getcwd() + '\\download'
# 注意需要和 Chrome 浏览器设置的下载路径一致

# 文件名
file_name = 'selenium-4.9.0.tar.gz'

download_file_path = os.path.join(download_dir, file_name)

# 等待文件下载完成
wait = WebDriverWait(web, timeout=30)
wait.until(lambda driver: os.path.exists(download_file_path))

# 获取文件的初始大小
init_size = os.path.getsize(download_file_path)

# 等待指定时间,再次检查文件大小是否发生变化
time.sleep(2)
while True:
    cur_size = os.path.getsize(download_file_path)
    if cur_size == init_size:
        break
    else:
        init_size = cur_size
        time.sleep(2)

# 文件大小不再发生变化,认为下载完成
web.close()

2. 基于无头浏览器实现

​ 当我们需要将selenium部署到centos服务器上运行的时候, 就会存在无法打开google的情况, 此时我们必须要配置无头浏览器, 这时候想下载文件到指定位置就不是刚才配置一下'prefs', 因为我们在无头浏览器中是无法导出下载管理的可视化窗口的, 这意味着'prefs'将没有作用, 所以我们应该怎么做?

基于无头浏览器将文件下载到指定目录: 
    1. 配置无头浏览器并下载文件到google指定目录(配置options)
    2. 通过定时等待判断文件是否下载完成(os模块)
    3. 关闭浏览器

下面是代码部分:

import os
import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# # 设置 ChromeOptions 配置
options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--headless')
options.add_argument('blink-settings=imagesEnabled=false')
web = webdriver.Chrome(options=options)
# 配置浏览器
web.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior',
          'params': {'behavior': 'allow', 'downloadPath': r"%s" % os.path.join(os.getcwd(), 'download')}}
web.execute("send_command", params=params)

web.get("https://pypi.org/project/selenium/#files")
web.find_element(By.XPATH, '//*[@id="files"]/div/div[2]/a[1]').click()

# 等待下载完成
# 通过文件大小变化(在上面)或者定时等待的方式均可判断
# 这里用定时等待的方式
download_file = os.path.join('C://Users//86183//Downloads', "selenium-4.9.0.tar.gz")
while not os.path.exists(download_file):
    time.sleep(2)

# # 移动文件到指定的目录
# destination = os.path.join(os.getcwd(), 'download')
# shutil.move(download_file, destination)

# 关闭浏览器
web.quit()

posted on 2023-05-09 08:00  huxiaofeng  阅读(1068)  评论(0编辑  收藏  举报

导航