• Python Selenium Web自动化上传/下载文件图文详解


    情景:

          在用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:filesfile_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:UsersdellDesktop o_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:work1.png'
    EndIf

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

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

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

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

    注意:

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

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

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

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

  • 相关阅读:
    centos7安装node.js
    docker容器互联,实现目录、服务共享
    解决docker容器中Centos7系统的中文乱码
    修改centos7容器的时间和宿主机时间一致
    linux安装中文字体
    制作OpenOffice的Docker镜像并添加中文字体解决乱码问题
    centos容器yum安装JDK环境
    函数装饰器
    nc(NetCat)命令
    Linux源码包安装程序
  • 原文地址:https://www.cnblogs.com/txx403341512/p/9523816.html
Copyright © 2020-2023  润新知