前言

selenium是一个很强大的web自动化框架,之前也有用它写过东西,详见
然而对于文件的上传与下载它却显得无力,它虽然可以通过web driver驱动对浏览器的元素进行操作,可当点击下载,浏览器弹出的窗口它无法与其进行交互。
当然在网上也查阅了大量资料去尝试,谷歌浏览器有一种设置可以直接下载,通过这种方式下载的文件有几点诟病:

  1. 无法重命名下载文件。
  2. 一旦文件被谷歌浏览器检验出有害(例如下载jar包格式的文件),浏览器会弹出另一层确认选项卡(该文件会损害您的电脑,是否保存),这样一来用selenium便实现不了功能了。
    此篇有些略长,若想实现功能,请静下心来慢慢看,比较详细,若有错误还望指出!

思路

对于selenium本身而言,通过驱动的方式不可行,但是还有另一种方式,就是通过右键超链接位置,有个另存为的选项,沿着这个思路下去,便解决了selenium的无力。

过程

环境

  • python3
  • selenium(web自动化测试框架)
  • pypiwin32(windows的api库,可以对键盘事件进行操作)
  • autoit(操作windows的窗口软件)
  • chrome(56.0.2924.87)

selenium实现右键另存为

按照网上查阅的资料,是这样的写法:

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
chromedriver = "D:\python3.6\Scripts\chromedriver.exe"
driver = webdriver.Chrome(chromedriver)
#超链接元素定位
element = '//*[@id="Dialog"]/p[1]/span[2]/a'
#通过ActionChains的context_click进行对link元素右键操作,在按下另存为的快捷键K
ActionChains(driver).context_click(link).send_keys('K').perform()

上面的写法,经过测试发现并不能实现,也不知道是谷歌版本的问题还是什么原因ActionChains(driver).context_click(link).perform(),这行代码是执行成功的,而调用‘K’键却是失败的

说下正确的写法:

/**
* 首先你需要安装pypiwin32这个库,它是一个windows对
* 外提供api的接口库,可以对键盘进行操作,例如触发K键
*/
pip install pypiwin32
from selenium.webdriver.common.action_chains import ActionChains
import win32api
import win32con
#右键超链接另存为
ActionChains(driver).context_click(link).perform()
#延时2s
time.sleep(2)
#按下K键,这里用到了win32api,win32con
win32api.keybd_event(75,win32con.KEYEVENTF_KEYUP,0)#75的含义就是键盘的K

下面给出两个图:

python3+selenium+autoit【实现右键文件另存为】功能_autoit

python3+selenium+autoit【实现右键文件另存为】功能_自动化_02

可以根据上面的图去对应你想要的快捷键。

python selenium帮你实现的功能如下图:

python3+selenium+autoit【实现右键文件另存为】功能_文件下载_03

到这步,selenium便无法操作了,这时需要依赖的是下面的软件,autoit(小众化脚本语言的一个软件),它可以实现对弹框进行操作。这里多说一句,大家不要看到这个就不往下看了,因为很抵触新东西,我刚开始查资料也是这样的,确实是因为没有办法了被逼无奈才选择的autoit,但是发现学习起来并没有多难,半个小时即可研究出来。

autoit自动化操作windows弹框

这里给出官网:
​​​https://www.autoitscript.com/site/​​​
我这会儿下载已经是3.3.14.3版本了。。。

1.进站

python3+selenium+autoit【实现右键文件另存为】功能_autoit_04


2.下载

python3+selenium+autoit【实现右键文件另存为】功能_自动化_05

3.安装,一路默认即可,除了安装位置大家自己选择下就行,这里不上图了。反正windows下安装东西就是无脑next。。。哈哈哈

4.安装好如下图:

AutoIt Windows Info   用于帮助我们识Windows控件信息。

Compile Script to.exe 用于将AutoIt生成 exe 执行文件。

Run Script 用于执行AutoIt脚本。

SciTE Script Editor 用于编写AutoIt脚本。

python3+selenium+autoit【实现右键文件另存为】功能_自动化_06

first:AutoIt Windows Info,先来打开上图画框的这个图标,含义是帮助我们识Windows控件信息。
打开后可以看到下图。

python3+selenium+autoit【实现右键文件另存为】功能_python_07

这里蓝字需要特别注意下,用Finder Tool按住不放拖到'电脑>DeskTop'栏的边缘处,软件会聚焦识别
点到control可以看到具体信息

再来一张图,与上面的操作一样:

python3+selenium+autoit【实现右键文件另存为】功能_selenium_08

second:SciTE Script Editor,打开下图,让我们直接来用此软件撸脚本吧。

python3+selenium+autoit【实现右键文件另存为】功能_自动化_09

打开后长这样:

python3+selenium+autoit【实现右键文件另存为】功能_autoit_10

;该脚本的语法是:  ;分号代表注释,为了博客好看,我先把;换成#
#ControlFocus ( "title", "窗口文本", controlID) 设置输入焦点到指定窗口的某个控件上
#WinWait ( "title题" , "窗口文本" , 超时时间 ) 暂停脚本的执行直至指定窗口存在(出现)为止
#ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本
#Sleep ( 延迟 ) 使脚本暂停指定时间段
#ControlClick ( "title", "窗口文本", 控件ID , 按钮 , 点击次数 ) 向指定控件发送鼠标点击命令
#其中,title即AutoIt Window Info识别出的Title字段,controlID即AutoIt Window Info识别
出的Class和Instance的拼接,如上图拼接后的结果应为:Button1
小技巧------能看编辑函数api的方法:
例如:ControlFocus这个函数,写成下面这样,即可看到括号中的参数,括号写一半
ControlFocus(
这里的代码对照着上上个代码块看,很容易看懂的
;第一步:聚焦另存为窗口,title:另存为,"text",controlId:写ID可以识别
ControlFocus("另存为","text","40965")
;暂停脚本的执行直至指定窗口存在(出现)为止
WinWait("[CLASS:#32770]","",10)
;第二步:填充文件名地址,其中$CmdLine[1]代表exe执行时的动态参数,
;例如 kuang.exe "D:/test/a.html",这样就可以动态改变地址的名字,通过python
ControlSetText("另存为","","Edit1",$CmdLine[1])
;延时函数
Sleep(2000)
;第三步:点击保存按钮,进行下载,title:另存为,"text"写成空,controlId:写成Button2(ClassnameNN)也可以识别
ControlClick("另存为","","Button2")
third:写完脚本后,可以f5运行下脚本,前提是你的浏览器另存为框处于打开状态。以此来检验脚本哪里需要修改。
finally:以上步骤(first-third)都完成后,可以将脚本编译成exe文件了!如下图操作

打开最后一道手续:

python3+selenium+autoit【实现右键文件另存为】功能_autoit_11

如下图:

python3+selenium+autoit【实现右键文件另存为】功能_自动化_12

串烧操作

到这里,大部分操作已经完成,通过autoit生成的exe,大家有没有想到为什么要这么做。。。因为可以用python去调用啦!将以上操作连贯起来,python + selenium实现右键另存为,另存为的弹框,随后用autoit生成自动化windows的exe,在用python去调用exe,便可实现‘python3+selenium+autoit【实现右键文件另存为】功能’。python调用代码如下:

import os
#rule_name便是你的动态文件名,可根据上下文获取
os.system('autoit.exe '+ file_path + rule_name + '.jar')

上面的代码块就是通过cmd调用exe文件,并将python中的代码文件名作为参数传入到exe中….

接下来就可以愉快的玩耍了。。

总结

像实现这种功能,真的是绕过了各种不能实现的思路,编程编程!最重要的还是思路。。。而且发现外国人的编码思路能力确实很强,通过查找问题发现他们的脑回路确实强- -!!。。。

查阅大量资料,发现真的是没有什么好办法了,大部分人都是推荐使用autoit来实现对windows弹框的操作。如果有什么好办法能实现,欢迎留言。。。


至此完!