好多天没有按部就班地学习,这几天进行了高强度地探究实践:

上周天下午接了一个单子,客户目前重复做着一项工作,没有技术含量但特别消耗心理能量:

每天从固定网站上下载200多份文件,操作只是“查询--点另存为--修改文件名--保存”。不描述客户感受,大家脑补吧。

一直认为自己的主战场应该是用python做数据分析吧,但我遇到类似的重复工作时,写过一些脚本,完美地解决过问题,所以答应客户试试。

详情不述,说说过程中遇到的问题和解决方案吧:问题1:“另存为”弹窗不出来的问题我在使用python+selenium+Chrome模拟下载数据时,我的机器居然不弹出任何“另存为”的窗口,而是以默认名称和默认路径直接下载。这就无法按客户要求修改文件名和路径了。此后发现,我每次打开的Chrome浏览器,和我日常用的浏览器设置不同,“下载前询问每个文件的保存位置”的开关每次打开都是关闭的。查了资料,原因是:为提升速度,selenium每次打开的浏览器都是初始的开净浏览器,想要修改,需要设置webdriver.ChromeOptions()的参数。

【难度级别】:高。

原因:网上没有对python如何修改“下载前询问每个文件的保存位置”的现成答案。(环境:python+selenium+Chrome)

【解决方案】:

直接上脚本了:options=webdriver.ChromeOptions()pref={''download.default_directory':r'd:\downLoad',"download.prompt_for_download": True}options.add_experimental_option('prefs',pref)browser=webdriver.Chrome(chrome_options=options)

【说明】:

1、'download.default_directory': r'd:\downLoad'该语句解决下载的默认路径修改问题

2、"download.prompt_for_download": True 解决“下载前询问每个文件的保存位置” 的开关问题的,True为开

3、webdriver.Chrome(chrome_options = options) 这一点,网上有人写成webdriver.Chrome(options = options) ,网上这样的写法,我这儿调试不通过,一直报参数错误。所以这一点一定要注意哦。这个可能和webdriver的版本有关,我后来又试了,在另一台电脑上,会报“chrome_options = options”的warning,而options = options却能成功执行。问题2:python+selenium怎么处理修改“另存为”弹窗参数的问题

窗口弹出后,我发现弹出的“另存为”页面,好像不是模拟浏览器的子窗口,是不可以通过browser.switch_to.frame()这样的切换子窗口的方法解决问题的。百度了几乎一下午的时间,没有解决问题。

无意间和爱人聊起来这个问题,爱人说,那当然不能通过这种方式解决了,这个弹窗与模拟浏览器无关,是windows系统的组件。

OK,这个思路非常重要,沿着这个思路重新百度,发现了大量资料。输入“python win32ui 修改另存为对话框”的关键字,会出现很多资料,而且非常详细。感谢!

【解决方案】:

用win32gui捕获到弹出的窗口,用spy++工具查看窗口中控件的类及父窗口的类,再用win32gui的SendMessage()传递需要修改的文件名。

notPad=win32gui.FindWindow('#32770',u'另存为')########################################修改文件名,下面的各个类,是用spy++这个工具查来的。有的不能完全照搬,可能和弹出的窗口有关。a1=win32gui.FindWindowEx(notPad,None,"DUIViewWndClassName",None)a2=win32gui.FindWindowEx(a1,None,"DirectUIHWND",None)a3=win32gui.FindWindowEx(a2,None,"FloatNotifySink",None)a4=win32gui.FindWindowEx(a3,None,"ComboBox",None)hwnd_filename=win32gui.FindWindowEx(a4,None,"Edit",None)time.sleep(2)left2,top2,right2,bottom2=win32gui.GetWindowRect(hwnd_filename)win32api.SetCursorPos([left2,top2])win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP|win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0)win32gui.SendMessage(hwnd_filename,win32con.WM_SETTEXT,None,id)time.sleep(2)

'''########################################按保存hwnd_save=win32gui.FindWindowEx(notPad,None,"Button",u'保存(&S)')win32gui.PostMessage(hwnd_save,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)

【说明】:

1、win32gui.FindWindow('#32770', u'另存为') 该句中的类为#32770,但从spy++中查到的类为“#32770 (对话框)”, 我在这儿花了好长时间,类名写不对,窗口就找不到。

2、time.sleep() 个人认为比较重要,太快了,系统还没有反映过来呢,容易获得不到需要的数据。最好时间多设几秒,因为生成EXE文件后,可能比在pycharm中执行的还要快,很容易出现规定的动作没有执行,下一个动作又开始了,最终因异常动作导致程序不能正常运行。

python另存为_python+selenium修改“另存为”弹窗参数相关推荐

  1. python怎么另存为_python如何IE另存为附件

    python在使用selenium下载附件时,chrome,filefox都能自定义下载文件夹路径,而IE不行. 这样在自动化时,会相当麻烦,网上介绍了很多方法,都比较麻烦. 个人解决办法如下: # ...

  2. python文件怎么另存为_python+pywin32处理另存为弹出框保存文件

    1.首先先定位该弹出框: 用spy++查找到该弹出框的标题和类名: 弹出框的句柄是每次都会变的,所以通过标题和类名获取该句柄: # 获取另存为弹出框 calssname = u"#32770 ...

  3. python selenium 处理弹窗_Python+Selenium处理Windows弹窗(非IE弹窗问题)

    匿名用户 1级 2014-10-12 回答 兄弟你逗我么,你写着问题就可以解决了,但是内容又否认python可以处理这样的问题...安装好selenium的python,调用里面的API就可以完成操作 ...

  4. python另存为_python 将word另存为txt

    importosimportos.pathfrom win32com importclient as wc c=[] rootdir=["d:/77"] #以该路径为实验 deft ...

  5. python另存为_python+pywin32处理另存为弹出框保存文件

    1.首先先定位该弹出框: 用spy++查找到该弹出框的标题和类名: 弹出框的句柄是每次都会变的,所以通过标题和类名获取该句柄: # 获取另存为弹出框 calssname = u"#32770 ...

  6. dnf自动刷图python脚本_python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]...

    背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...

  7. 招聘网python职位_Python+selenium爬取智联招聘的职位信息

    整个爬虫是基于selenium和Python来运行的,运行需要的包 1 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的 ...

  8. python 非_Python函数的非固定参数

    一.概述 在原来的文章中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数制定一个默认的值.当我们调用函数时,默认参数是非必须传递 ...

  9. Python可视化matplotlib自定义:运行时参数修改、自定义样式、默认样式+plt.style.use()

    Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认样式+plt.style.use() 目录 Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认 ...

最新文章

  1. 安装Adventure Works 2008 R2演示数据库
  2. php 清除数据表中所有数据库,清除一个数据库里所有表的数据
  3. c#中Class和Struct使用与性能的区别
  4. Python 爬虫利器 Beautiful Soup 4 之文档树的搜索
  5. JVM(2)——JVM类加载机制
  6. Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】
  7. SpringBoot b2b2c 多用户商城系统 (一)构建第一个SpringBoot工程
  8. ubuntu安装vsftpd遇到的问题
  9. 类似构建的操作性工作,可以轮流值班
  10. tqdm的版本问题导致tensorflow_datasets无法加载
  11. step7设置pcpg_【图】西门子step7编程软件安装过程与pg/pc接口设置方法
  12. 网上一些《算法(第四版)》习题答案链接
  13. CruiseControl配置详解
  14. 数据库文件放在服务器哪里,服务器上数据库文件存放位置
  15. HDU 2022 海选女主角
  16. Wireshark抓包及常用过滤方法
  17. 四款软件,提高团队工作效率
  18. SybilFuse:Combining Local Attributes with Global Structure to Perform Robust Sybil Detect(论文笔记)
  19. 【数据可视化】十八年纵观十大编程语言之争,Java和C语言的榜首之战。
  20. 物联网的物流企业信息集成综合管理平台,主要有哪些特征?

热门文章

  1. ⚡️狂神Linux学习笔记
  2. HDU1431 素数回文(打表)[C,C++,Java]
  3. 【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
  4. Formality简单实用之1--RTLvsRTL
  5. 【无标题】profinet输入输出式分布式IP67总线IO模块
  6. 女子发现前夫外遇索要2000万
  7. Avoid mutating a prop directly子传父报错解决
  8. 关于Descriptors cannot not be created directly报错
  9. 报错信息:Avoid mutating a prop directly since the value will be overwritten
  10. 无线投影服务器连接投影仪,投影仪如何实现无线连接投影?