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

selenium控制文件下载位置的更多相关文章

  1. 通过selenium控制浏览器滚动条

    目的:通过selenium控制浏览器滚动条 原理:通过 driver.execute_script()执行js代码,达到目的 driver.execute_script("window.sc ...

  2. selenium控制超链接在当前标签页中打开或重新打开一个标签页

    selenium控制超链接在当前标签页中打开或重新打开一个标签页 在web页面源码中,控制超链接的打开是在当前标签页还是重新打开一个标签页,是由属性target=“_black”进行控制的.如果还有属 ...

  3. Java&Selenium控制滚动条方法封装

    Java&Selenium控制滚动条方法封装 package util; import org.openqa.selenium.JavascriptExecutor; import org.o ...

  4. selenium控制浏览器操作

    selenium控制浏览器操作 控制浏览器有哪些操作? 控制页面大小 前进.后退 刷新 自动输入.提交 ........  控制页面大小,实例: # -*- coding:utf-8 -*- from ...

  5. Selenium系列(22) - 通过selenium控制浏览器滚动条的几种方式

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  6. 使用selenium控制滚动条(非整屏body)

    方法原理:     (1)使用jQuery CSS 操作 - scrollTop() 方法,设置 <div> 元素中滚动条的垂直偏移,语法:$(selector).scrollTop(of ...

  7. BDD测试之selenium控制滚动条

    一.对于页面存在滚动条,可以通过插入JS控制滚动条(最常用的方法) (1)将滚动条移动到指定坐标位置处 ((JavascriptExecutor) driver).executeScript(&quo ...

  8. 【WP8】键盘弹出时控制Frame位置

    WP上,当使用TextBox输入文字的时候,键盘会把TextBox向上推一段距离 当编辑第二个TextBox的时候,页面被上推,键盘刚好和TextBox靠在一起 当编辑第一个TextBox的时候,页面 ...

  9. selenium+Python(文件下载)

    webdriver允许我们设置默认的文件下载路径,也就是说,文件会自动下载并保存到设置的目录中 下面以Firefox浏览器为例: from selenium import webdriver from ...

  10. 使用python+selenium控制手工已打开的浏览器

    我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...

随机推荐

  1. Ubuntu 22.04 安装 VMWare 16.2.3 后无法启动

    异常日志: 2022-06-13T03:49:56.019Z In(05) host-29676 In file included from /tmp/modconfig-XR2GVI/vmmon-o ...

  2. loadrunner写webservice接口

    先用soupUI调试  fiddler抓包 然后再写: web_custom_request("createSoapOrder",         "URL=http:/ ...

  3. Https交互原理

    Http超文本传输协议 基于tcp和Ip实现的一种可靠的传输协议,可靠的保证了客户端和服务器之间的传输不会丢失,但是却没办法保证传输数据的安全性. Https是Http的升级版本,用于解决Http数据 ...

  4. OSPF之Router id冲突

  5. Apache和Nginx有什么区别,如何选择?

    Apache和Nginx都是大名鼎鼎的Web服务器软件. 网上已经有非常多关于apache和nginx区别的文章了,笔者就不从专业技术的角度进行解说,而按照目前比较流行的架构方式进行阐述. 1.安全性 ...

  6. 一文学会Flex布局

    参考: <CSS权威指南>(第四版) flex布局教程-语法篇-阮一峰 1.Flex布局是什么 FlexBox,弹性盒布局,顾名思义,就是元素具有弹性,能根据可用空间大小增减尺寸. 2.基 ...

  7. java常用的数据类型有哪些

    前言 在上一篇文章中,壹哥给大家讲解了Java中变量的定义.使用及基本原理等内容,这个内容并不是很难,但却是我们走向Java大神的第一步!壹哥希望你从第一天就要认真对待哦. 在前面讲解变量时,壹哥给大 ...

  8. StyleGAN 调整面部表情,让虚拟人脸更生动

    目录 人脸表情 调整步骤 调整结果 人脸表情 通过上一篇文章 StyleGAN 生成的人脸:https://www.cnblogs.com/tinygeeker/p/17236264.html 人脸图 ...

  9. vue2双向绑定原理及源码解析

    首先我们要知道VUE实现双向绑定的步骤是什么: 实现一个监听器 Observer 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 sett ...

  10. nodejs,,一些基本操作--server。js

    1.解决中文乱码问题: const http = require('http') const server = http.createServer((req, res) => { // 设置字符 ...