文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家分享下自己处理文件上传的经验,希望能够帮助到广大被文件上传坑住的seleniumer。

首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js、flash等实现,标签非input

我们分别对这两种进行分析:

1.input标签

众所周知,input标签是可以直接send_keys的,这里也不例外,来看代码示例:

示例网址:http://www.sahitest.com/demo/php/fileUpload.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = driver.find_element_by_id('file')
upload.send_keys('d:\\baidu.py')  # send_keys
print upload.get_attribute('value')  # check value

driver.quit()

结果:

baidu.py

很明显,对于input上传,直接send_keys是最简单的解决方案。

2.非input型上传

接下来难度要升级了,对于那些不是input框实现的上传怎么办,这种上传千奇百怪,有用a标签的,有用div的,有用button的,有用object的,我们没有办法通过直接在网页上处理掉这些上传,唯一的办法就是打开OS弹框,去处理弹框。

问题又来了,OS弹框涉及的层面已经不是selenium能解决的了,怎么办?很简单,用OS层面的操作去处理呗,到这里我们基本找到了问题的处理方法。

大体上有以下几种解决方案:

  1. autoIT,借助外力,我们去调用其生成的au3或exe文件。
  2. Python pywin32库,识别对话框句柄,进而操作(推荐!)
  3. SendKeys库
  4. keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…

目前我只知道以上四种办法,有其他方法的请留言告诉我,让我学习一下。

我们依次看一下:

1. autoIT

关于autoIT上传以及参数化的方法我已经在另一篇博文中讲过了,请参见selenium之 autoit命令行参数。这里不再赘述。

2.win32gui

你得先安装pywin32的库,你可以到这里找到对应你Python版本的库,注意32位还是64位一定要和你安装的Python版本对应。或者使用以下方式安装:pip install pypiwin32

示例网址:http://www.sahitest.com/demo/php/fileUpload.htm

代码:

 # -*- coding: utf- -*-
 from selenium import webdriver
 import win32gui
 import win32con
 import time

 dr = webdriver.Firefox()
 dr.get('http://www.sahitest.com/demo/php/fileUpload.htm')
 upload = dr.find_element_by_id('file')
 upload.click()
 time.sleep()

 # win32gui
 # 一级顶层窗口 - 第二个参数Title会因为浏览器不同,而会不同。只需要修改第二个值就好。
 dialog = win32gui.FindWindow('#32770', u'打开')
 # 二级窗口,固定写法
 ComboBoxEx32 = win32gui.FindWindowEx(dialog, , 'ComboBoxEx32', None)
 # 三级窗口,固定写法
 ComboBox = win32gui.FindWindowEx(ComboBoxEx32, , 'ComboBox', None)
 # 四级窗口 - 文件路径输入区域,固定写法
 Edit = win32gui.FindWindowEx(ComboBox, , 'Edit', None)  # 找到输入框Edit对象的句柄
 button = win32gui.FindWindowEx(dialog, , 'Button', "打开(&O)")  # 找到打开按钮
 win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\test.html')  # 输入文件路径
 win32gui.SendMessage(dialog, win32con.WM_COMMAND, , button)  # 点击打开按钮

结果:

baidu.py

在这里你需要一个非常重要的小工具:Spy++,百度一下有很多,当然你也可以用autoIT自带的工具,不过没有这个好用,建议去下一个吧。

使用方法:

拖动风扇图标到上传窗口,title是打开,class是#32770,对应代码第15行

拖动风扇图标到文件输入框,text是空,class是Edit,对应代码第21行

拖动风扇图标到打开按钮,text是打开(&O),class是Button,对应代码第22行

安装完成之后在【开始菜单Python的文件夹】里看到PyWin32的文档【Python for Windows Documentation】,你能从中找到对应的方法API。

简单介绍几个用到的:

win32gui.FindWindow(lpClassName=None, lpWindowName=None):

  • 自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄。
  • lpClassName:类名,在Spy++里能够看到
  • lpWindowName:窗口名,标题栏上能看到的名字
  • 代码示例里我们用来寻找上传窗口,你可以只用其中的一个,用classname定位容易被其他东西干扰,用windowname定位不稳定,不同的上传对话框可能window_name不同,怎么定位取决于你的情况。

win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)

  • 搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。找不到就返回0。
  • hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。
  • hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。
  • lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
  • lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
  • 代码示例里我们用来层层寻找输入框和寻找确定按钮

win32gui.SendMessage(hWnd, Msg, wParam, lParam)

  • hWnd:整型,接收消息的窗体句柄
  • Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)
  • wParam:整型,消息的wParam参数
  • lParam:整型,消息的lParam参数
  • 代码示例里我们用来向输入框输入文件地址以及点击确定按钮

至于win32api模块以及其他的方法,这里不进行更多描述,想要了解的自行百度或看pywin32文档。

selenium之文件上传的更多相关文章

  1. web自动化之selenium(三)文件上传

    1.上传标签为input #若上传文件的标签为<input>可以直接定位标签,然后send_keys(文件路径)可以直接上传 2.利用第三方软件Autoit上传 1.下载Autoit:ht ...

  2. selenium+python-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  3. selenium之 文件上传所有方法整理总结【转】

    本文转自:https://blog.csdn.net/huilan_same/article/details/52439546 文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家 ...

  4. python3 + selenium 之文件上传下载

    文件上传 文件上传下载的联系html: uplad.html <html> <head> <meta http-equiv="content-type" ...

  5. selenium实现文件上传方法汇总(AutoIt、win32GUI、sengkeys)---基于python

    在使用selenium进行UI自动化测试时,经常会遇到一个关于本地文件上传的问题,解决此问题一般分两种情况: 1. 元素标签为input 2.非input型上传 下面我们分别对着两种情况进行实例分析 ...

  6. selenium之 文件上传方法

    文件上传是所有UI自动化测试都要面对的一个头疼问题 首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js.flash等实现,标签非input 我们分别 ...

  7. selenium之 文件上传所有方法整理总结

    本文转载“灰蓝”的原创博客.http://blog.csdn.net/huilan_same/article/details/52439546 文件上传是所有UI自动化测试都要面对的一个头疼问题,今天 ...

  8. selenium java 文件上传、下载

    1.webdriver对页面文件的下载 我们一般操作浏览器下载时会让我们选择下载的目录然后经过一系列操作后才进行文件下载操作,但是用webdriver不能按这样的方式操作.经过查询资料找到了如下的实现 ...

  9. Selenium的文件上传JAVA脚本

    在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = drive ...

随机推荐

  1. solr查询优化【转】filtercache

    solr查询优化(实践了一下效果比较明显) 什么是filtercache? solr应用中为了提高查询速度有可以利用几种cache来优化查询速度,分别是fieldValueCache,queryRes ...

  2. 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

    再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...

  3. Asp.net 字符(一)

    1.字母大小写处理 private string GetChangedStr(string oldStr, strType type) { string newStr = ""; ...

  4. 各 Android 平台版本支持的 API 级别

    平台版本 API 级别 VERSION_CODE 备注 Android 7.0 24 N 平台亮点 Android 6.0 23 M 平台亮点 Android 5.1 22 LOLLIPOP_MR1 ...

  5. codeforces415D. Glad to see you!(交互)

    题意 交互题. 有$k$个值域为$[1, n]$的数. 请在不超过$60$次询问内找出其中的两个数. 每次询问形式为1 x y 交互库会返回$|x - a| <= |y - b| ? " ...

  6. 8 Explicit Animations 指明的动画 笔记

    8 Explicit Animations 指明的动画 笔记     If you want something done right, do it yourself. 如果你想让事情做好,那就自动来 ...

  7. vue项目中快捷语法糖

    1.Vue.js是渐进式框架,采用自底向上增量开发的设计基于MVVM思想. 2.Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用. 3.Vue.js 的目标是通过尽可能简 ...

  8. win10忘记wifi记录

    1.点击桌面右下角无线图标 2.点击网络设置 3.点击管理WIFI设置 4.点击要管理的账户,忘记或者共享该wifi.

  9. COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)

    ★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...

  10. 语音行业技术领先者Nuance诚招ASR/NLP研发工程师和软件工程师

    Nuance is a leading provider of voice and language solutions for businesses and consumers around the ...