情景:

在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示

图1

这种情况超出了selenium的能力范围,需要借助其他工具来实现,这里介绍AutoIt这个工具:

1.下载并安装

进入AutoIt官网,选择AutoIt -> Downloads,如图2:

图2

然后选择Full Installation版本,里面包含了所需的所有工具,如图3:

图3

下载后直接安装即可。

2.探测控件

(1).首先从“开始”菜单里找到"Au3Info_x64.exe" 打开,如图4:

图4

(2).打开需要上传的页面,点击上传,弹出上传窗口,如上面图1所示

(3).在AutoIt上面,用鼠标按住Finder Tool不放(鼠标图标变成一个轮子的样子),移动到上传窗口的文本输入框中,然后松开,如图5

图5

松开后查看探测结果,如图6:

图6

主要关注图6中红色标注的信息:

窗口标题,即Title,图中是“文件上传”

窗口的class,图中是32770

控件的类型以及编号,图中类型是Edit,编号(Instance)是1,表明是窗口中第一个文本输入框

类似地,重复上面的一步,获取“打开”按钮的信息,图如7:

图7

由于是同一个窗口,因此标题和class都和上面的一样,不同的是,这里的"打开"按钮的类型是Button,编号为1(如果是“取消”按钮,编号就是2)。获取到这些必须信息后,就可以开始编写脚本了。

3.编写脚本

从开始菜单中打开SciTE Script Editor,编写如图8的内容:

图8

脚本内容如下,分号开头的是注释:

; 等待5秒钟,让上传窗口出现   WinWait("[CLASS:#32770]","",5)

;把输入焦点定位到上传输入文本框中,类型为Edit,编号为1,也就是上面获取到内容   ControlFocus("文件上传", "","Edit1")

;在文件名那里,输入需要上传的文件绝对路径

ControlSetText("文件上传", "", "Edit1", 'D:\files\file_name')

;等待上传时间,单位是毫秒 1秒 = 1000 毫秒,文件大的话需要设置长点   Sleep(5000)

;点击"打开"按钮,也就是上传,完成整个上传过程   ControlClick("文件上传", "","Button1");

保存为.au3脚本,然后在浏览器中点击上传,使上传窗口出现,如图1所示,然后在SciTe Scripts Editor里面选Tools -> Go (或直接按F5) 即可看到自动上传效果。

4.转换为exe文件

在开始菜单中打开"Compile sctrip to .exe x64"(32位的机器选x86),然后选择要装换的.au3文件和输出的exe文件路径和名称,最后点击下面的"Convert"即可,如图9:

图9

5.使用python调用

使用配Python调用是,首先用python控制selenium,打开上传窗口(图1),然后用

import os

os.system(r'C:\Users\dell\Desktop\no_argument.exe')  #这里是保存的exe文件,根据自己的实际情况修改

然后跑python脚本,即可完成文件上传。

6.参数化

上面的过程虽然可以上传文件,但是路径、文件名都是写死在脚本里面的,如果要上传其它路径、其它文件,就要要重新修改脚本,编译成exe文件;如果上传多个文件,每个文件都要写个脚本然后转成exe

那岂不是很蛋疼? 参数化可以解决这个问题。

控件探测过程还和原来一样,脚本参数化只需要修改脚本,如图10:

图10

脚本内容如下,注意黄色背景的内容:

; 等待5秒钟,让上传窗口出现 WinWait("[CLASS:#32770]","",5)

;把输入焦点定位到上传输入文本框中 ControlFocus("文件上传", "","Edit1")

;判断是否有参数IF $CmdLine[0] > 0 Then ;有参数$file = $CmdLine[1];Else ;无参数,传递默认的文件;$file = 'D:\work\1.png'EndIf

;在文件名那里,使用参数 ControlSetText("文件上传", "", "Edit1", $file)

;等待上传时间,单位是毫秒 1秒 = 1000 毫秒 Sleep(5000)

;点击"打开"按钮,也就是上传 ControlClick("文件上传", "","Button1");

同样保存为.au3文件,然后打开上传窗口,按F5运行,成功后转换为exe文件

注意:

参数化之后,调用时需要传递参数,再用os.system(r'C:\Users\dell\Desktop\upload.exe  参数') 这种绝对路径调用,并不能生效,解决办法是把生成的exe文件,放到PATH里面,然后不带路径,直接调用

os.system('upload.exe upload_filename') 即可(过程中会有命令提示符窗口一闪而过,请无视)。

举一反三:如果连窗口id,文本输入框都变化,该怎么办?如果上传的文件比较到,需要等待较长时间怎么办?

提示:控件标识,比如类型、编号,等待时间,都可以参数化。

python selenium下载图片_Python Selenium Web自动化上传/下载文件图文详解相关推荐

  1. HTML5 多图片上传(前端+后台详解)

    HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...

  2. autoIT 自动化上传/下载文件图文详解【python selenium】

    转载:原文地址 情景: 在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图所示 使用AutoIt这 ...

  3. web页面上传大文件有没有好的解决方案

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  4. html实现照片添加功能,HTML5 Canvas调用手机拍照功能实现图片上传功能(图文详解上篇)...

    这篇文章主要为大家详细介绍了HTML5 Canvas,和jquery技术,调用手机拍照功能实现图片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 因为最近一段时间,一直在弄微信项目,其中涉及到 ...

  5. linux ftp匿名只能下载,04. 创建匿名用户能够上传下载,或只能下载的目录

    Re:FTP 文件传输服务 ========================== FTP 服务不论在企业或教学中,是很常用的文件共享方式,它既可以做到匿名访问,也可以做到用户名和密码访问,更可以做到只 ...

  6. python调用百度网盘开放平台接口上传本地文件

    本文章是为如何在没有GUI的环境下,使用指令行上传文件到百度网盘提供一个思路,其他操作请自行查询官方文档拓展. 前期工作 申请成为开发者 创建应用 记录AppKey和SecreKey,后续开发需要使用 ...

  7. win8 64 mysql下载教程_windows下安装mysql-8.0.18-winx64的教程(图文详解)

    1.下载安装包 安装包现在地址: https://dev.mysql.com/downloads/mysql/ 2.解压缩至安装目录 解压缩下载之后的zip,我这里使用的安装路径为: C:\Progr ...

  8. linux lftp下载目录,linux中使用lftp上传下载文件

    lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...

  9. python用selenium 验证码图片_Python +Selenium解决图片验证码登录或注册问题(推荐)

    1. 解决思路 首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载. 解决方案:截图然后根据该图片的定位和长高,使用工具进行裁剪 裁剪完毕之后,使用工具解析该图片. ...

最新文章

  1. mybatis的简单查询用语句吗_面试官:Mybatis中的TypeHandler你用过吗?
  2. 借呗利息为什么比银行信用贷款高很多?
  3. php 正则匹配 %3e,在shell脚本中使用正则表达式
  4. 7-5 素数判断 (10 分)
  5. linux shell 基本规范
  6. java 五大原则_面向对象五大原则
  7. [Google Guava]学习--新集合类型BiMap
  8. SQL连接两张或多张表
  9. 《智慧工地单点解析系列(一)—— 劳务实名制》
  10. 考试用计算机反思800字,期中考试反思800字(5篇)
  11. 你不会还不知道数组里面有这些好用的方法吧!(JavaScript)
  12. 中信建投计算机行业周报
  13. Msg 15138 The database principal owns a schema in the database, and cannot be dropped.
  14. 【kafka】Error while fetching metadata xxx: {TEST=LEADER_NOT_AVAILABLE}
  15. 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...
  16. Leetcode_35_Search Insert Position
  17. 解决:Godaddy域名解析很慢,网站经常打不开或者解析失败
  18. 标称属性样本相似性度量
  19. 机器学习中在线学习、批量学习、迁移学习、主动学习的区别
  20. 张爱玲经典语录100句

热门文章

  1. UG后处理 三菱 法兰克三轴带刀库备刀通用后处理
  2. 米家扫地机器人是石头代工_石头扫地机器人T6悬崖检测及障碍翻越功能体验:这都不会掉?...
  3. 【FFmpeg在Intel GPU上的硬件编解码实现】
  4. PageAdmin,织梦DedeCms和Wordpress—CMS建站系统怎么选
  5. python qt gui教程_Python GUI教程(四):安装并使用Qt设计师设计Python GUI
  6. 基于MATLAB的神经网络(ANN)回归
  7. 数据库连接池-c3p0
  8. c3p0连接池使用完毕后连接返还
  9. HDU 4526.威威猫系列故事——拼车记
  10. Django之富文本编辑器的使用,超级简单~