selenium+python自动化77-autoit文件上传

前言

关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素)。autoit工具处理windows的控件窗口是专业的,所以这个需借助AutoIt来解决了。

一、环境准备

1.可以autoit官网上下载,安装 http://www.autoitscript.com/site/

2.下载到本地后傻瓜式安装,安装完之后在应用程序找到这个Autoit v3

3.AutoIt里面几个菜单功能介绍:

- SciTE Script Editor   编辑器,在这里编写AutoIt脚本

- AutoIt Windows Info   元素定位器,用于识Windows控件信息

- Run Script                执行AutoIt脚本

- Compile Script to.exe   将AutoIt生成 .exe 可执行文件

4.autoit [在线文档](http://www.autoitx.com/Doc/),是中文版http://www.autoitx.com/Doc/

二、脚本实现

1.先准备好web页面的环境,以博客园的上传图片为例:新建博客>点图片上传>上传本地图片>弹出选择图片界面,在这里不要动了

2.打开 SciTE Script Editor编辑器,开始写脚本,代码非常简单只有四行

```

WinActivate("文件上传");

ControlSetText("文件上传", "", "Edit1", "D:\1.png" );

Sleep(2000);

ControlClick("文件上传", "", "Button1");

```

3.编辑完成后执行,tools>go ;或者按f5执行,执行完之后就能看到图片上传成功了。

4.autoit几个常用的语法

- WinActivate("title")         聚焦到指定活动窗口

- ControlFocus ( "title", "窗口文本", controlID)   设置输入焦点到指定窗口的某个控件上;

- WinWait ( "title" , "窗口文本" , 超时时间 )  暂停脚本的执行直至指定窗口存在(出现)为止;

- ControlSetText ( "title", "窗口文本", controlID, "新文本" )   修改指定控件的文本;

- Sleep ( 延迟 )   使脚本暂停指定时间,单位是毫秒;

- ControlClick ( "title", "窗口文本", 控件ID , 按钮 , 点击次数 )   向指定控件发送鼠标点击命令;

四、元素定位

1.Find Tool 查看元素属性,用鼠标按住Find Tool下的图标,然后拖拽到你想定位的元素上

2.查看title,title即AutoIt Window Info识别出的Title字段

3.查看controlID,controlID即AutoIt Window Info识别出的Class和Instance的拼接

> 如这里的“打开”按钮的Class属性是Button,Instance属性是1,那么controlID属性就是Button1

五、导出为exe文件

1.第三步执行成功后,先把脚本保存到本地

2.在应用程序里面找到打开Compile Script to.exe工具,将刚才导出的.au3文件转化成.exe文件

3.为了验证这个生成的.exe文件是有效的,先在cmd去执行一次

> 直接把生成的这个.exe文件拽到cmd里面,回车就能执行了

六、python执行

1.把上传文件的动作已经弄成了一个.exe的文件了,接下来用python去执行这个.exe文件就能实现文件上传了

> python调用dos,用这个方法os.system("需执行的指令")

```python

# coding:utf-8

from selenium import webdriver

import time

import os

# 加载配置文件实现免登录

profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'  # 你自己电脑的配置文件路径,不要抄我的

profile = webdriver.FirefoxProfile(profileDir)

driver = webdriver.Firefox(profile)

driver.implicitly_wait(30)

driver.get("http://www.cnblogs.com/yoyoketang/")

driver.find_element_by_link_text("新随笔").click()

time.sleep(3)

# 点开编辑器图片

driver.find_element_by_css_selector("img.mceIcon").click()

time.sleep(3)

# 定位所有iframe,取第二个

iframe = driver.find_elements_by_tag_name('iframe')[1]

# 切换到iframe上

driver.switch_to_frame(iframe)

# 点开文件上传按钮

driver.find_element_by_name('file').click()

# 执行autoit上传文件

os.system("C:\Users\Gloria\Desktop\sendjpg.exe")  # 你自己本地的这个.exe文件绝对路径

```

七、autoit命令行参数

1.上面打包的exe文件把上传文件的路径给写死了,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片,这样就需要参数化文件路径了。

想要参数化传入的参数,可以通过autoit的命令行参数:

```

myProg.exe param1 “This is a string parameter” 99

```

在脚本中,可用以下变量获取命令行参数:

```

$CmdLine[0] ; = 3

$CmdLine[1] ; = param1

$CmdLine[2] ; = "This is a string parameter"

$CmdLine[3] ; = 99

$CmdLineRaw ; = 'param1 "This is a string parameter" 99'

```

$CmdLine[0] 获取的是命令行参数的总数,在上例中$CmdLine[0]=3

$CmdLine[1]~$CmdLine[63] 获取的是命令行参数第1到第63位,这个方式最多只能获取63个参数,不过正常情况下是足够用的

$CmdLineRaw 获取的是未拆分的所有参数,是一个长字符串,这种情况下不局限与63个参数

```

WinActivate("文件上传");

ControlSetText("文件上传", "", "Edit1", $CmdLine[1] );

Sleep(2000);

ControlClick("文件上传", "", "Button1");

```

2.问题来了,如果想批量上传图片,又如何实现呢??参数化后是不是so easy了。

(0)

相关推荐

  • Python爬虫:Scrapy从脚本运行爬虫的5种方式!

    Python爬虫:Scrapy从脚本运行爬虫的5种方式! Python编程学习圈 1周前 关注+星标,每天学习Python新技能 测试环境 一.命令行运行爬虫 1.编写爬虫文件 baidu.py 图片 ...

  • Selenium Webdriver上传文件,别傻傻的分不清得3种方法

    Selenium上传文件 在Selenium中处理文件上传可以简化人工工作,并只需使用发送键()方法即可完成.上载文件后显示一条消息,确认文件是否已成功上载.还有更多此类文件上传的自动化方法. 本教程 ...

  • AutoIt 函数(转)

    AutoIt 函数(转)原文链接:http://blog.51cto.com/itxwh/1265383ClipGet 获取剪贴板保存的数据ClipPut 向剪贴板写入数据EnvGet       返 ...

  • python测试开发django-rest-framework-95.文件上传接口开发

    前言 django-rest-framework 开发文件上传接口 新建模型 models.py 创建模型 from django.db import models # 作者-上海悠悠 QQ交流群:7 ...

  • Selenium2+python自动化75-非input文件上传(SendKeys)

    前言 不少小伙伴问非input标签如何上传文档,这个本身就是一坑,无奈很多小伙伴非要跳坑里去,那就介绍一个非主流的上传文件方法吧,用第三方库SendKeys. (本篇基于python2.7版本的,py ...

  • selenium+python自动化78-autoit参数化与批量上传

    前言 前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片. 这样每次调用的时候,在命令行里面加一个文件路径的参数就行. 一.命令行参数 ...

  • SpringBoot 多文件上传、携带参数

    参考文章: https://stackoverflow.com/questions/36005436/the-request-was-rejected-because-no-multipart-bou ...

  • 文件上传的单元测试怎么写?

    早上有个群友问了一个不错的问题:文件上传的单元测试怎么写?后面也针对后端开发要不要学一下单元测试的话题聊了聊,个人是非常建议后端开发能够学一下单元测试的.所以,今天特地拿出来写一篇说说,并不是因为这有 ...

  • 文件upload 文件上传深入

    我记录这篇文章是因为开发过程中,发现上传业务有时候感觉不同平台自己有时一脸懵逼不知道咋样去优化这块业务,不同的后台实现咋样做不同的处理,以下介绍后台实现主要node和java为主,比如:手机端app图 ...

  • Appium+python自动化14-查看webview上元素(DevTools)

    前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式,是可以方便调试的. 一.环境准备 1.手机上装一个 ...

  • Appium+python自动化16-启动ios上Safari浏览器

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了.本篇介绍如何用appium启动ios上的safari浏览器,然后可以用手机上浏览器做w ...

  • Appium+python自动化20-查看iOS上app元素属性

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...