关闭

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

标签: pythonselenium自动化autoit文件下载
546人阅读 评论(0) 收藏 举报
分类:

前言

selenium是一个很强大的web自动化框架,之前也有用它写过东西,详见:
http://blog.csdn.net/s740556472/article/details/78150666
然而对于文件的上传与下载它却显得无力,它虽然可以通过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

下面给出两个图:

这里写图片描述

这里写图片描述

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

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

这里写图片描述

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

autoit自动化操作windows弹框

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

1.进站

这里写图片描述
2.下载

这里写图片描述

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

4.安装好如下图:

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

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

Run Script            用于执行AutoIt脚本。

SciTE Script Editor   用于编写AutoIt脚本。

这里写图片描述

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

这里写图片描述

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

再来一张图,与上面的操作一样:
这里写图片描述

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

这里写图片描述

打开后长这样:
这里写图片描述

;该脚本的语法是:  ;分号代表注释,为了博客好看,我先把;换成#
#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文件了!如下图操作

打开最后一道手续:

这里写图片描述

如下图:
这里写图片描述

串烧操作

到这里,大部分操作已经完成,通过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弹框的操作。如果有什么好办法能实现,欢迎留言。。。


至此完!

1
0
查看评论

selenium webdriver 右键另存为下载文件(结合robot and autoIt)

首先感谢Lakshay Sharma 大神的指导 最近一直在研究selenium webdriver右键菜单,发现selenium webdriver 无法操作浏览器右键菜单,如图 如果我想右键另存为,根本操作不了。 也有在网上看到webdriver right click ...
  • wanglha
  • wanglha
  • 2015-04-07 13:25
  • 1200

asp.net调用浏览器右键菜单“另存为”

asp.net调用网页右键另存为图片方法,这样可以点击图片的时候默认是下载而不是简单的打开图片功能。 网页根目录新建一个DownloadFile.aspx页面,下面代码直接放去DownloadFile.aspx前台页面。其他页面需要用到下面功能,超链接中使用:   ...
  • zhao19890429
  • zhao19890429
  • 2013-01-24 17:30
  • 2370

文件的打开保存另存为功能代码实现

(效果图) import java.awt.BorderLayout; public class NotePad {     private JFrame jf;          private JMenuBar m...
  • msyqmsyq
  • msyqmsyq
  • 2016-06-01 09:30
  • 911

点击链接模拟右键另存为

总结:折腾了好长的时间,一直是想用JS来实现,在网上找了半天,以下是JS实现的代码 音乐下载 function SaveAs5(imgURL) { var oPop = window.open(imgURL, "", "width=1, height=1...
  • a2459956664
  • a2459956664
  • 2017-07-03 21:51
  • 491

通过office 自带功能进行批量另存为

场景:由于通过java代码生成的word文档,打开后另存为时总是保存为后缀是.xml的文件格式。 现通过offic 自带的宏 命令进行批量转换。 此存不在讲解如何录制宏。 可以参考百度文档: 编辑宏命令 内容如下: Sub 另存为() '...
  • chen978616649
  • chen978616649
  • 2015-03-21 09:21
  • 1673

文件另存为

描述:将已有文件另存为一个新的文件。综合文件的创建和读写操作。要求:输入文件名以及要另存为的新文件名,输出是否成功的信息。知识点:FILE *fopen(const char *path, const char *mode);size_t fread(void *ptr, size_t size, ...
  • u013012494
  • u013012494
  • 2014-06-14 15:15
  • 805

web文件另存为 服务器端

private void exportData(HttpContext context) { try { string fileName = "postion.txt"; string RealFile = context.Server.MapPath("~/PosFi...
  • qq503690160
  • qq503690160
  • 2014-10-17 14:13
  • 610

JS打开文件另存为窗口如何实现

String serverName = request.getServerName(); String realPath = request.getRealPath(serverName);// 取得互联网程序的绝对地址 realPath = realPath.substring(0, real...
  • name_liweibin
  • name_liweibin
  • 2013-04-24 11:29
  • 3546

禁止图片另存为、禁止右键、禁止打印

客户可以会提出的要求,虽然不能完全禁止,但基本满足需求。http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/1999/xhtml">   &...
  • sven_xu
  • sven_xu
  • 2015-06-02 09:16
  • 880

js网页另存为功能代码

【另存为】 【另存为HTML文档】 【打印文章】
  • flynetcn
  • flynetcn
  • 2007-05-15 17:12
  • 4391
    个人资料
    • 访问:92075次
    • 积分:1859
    • 等级:
    • 排名:千里之外
    • 原创:93篇
    • 转载:9篇
    • 译文:0篇
    • 评论:66条
    最新评论