您的位置:首页 > 编程语言 > Python开发

23、Selenium + Python 实现 UI 自动化测试-文件上传

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

一、input 标签

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

网页如下:



代码如下:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(20)
driver.get("http://sahitest.com/demo/php/fileUpload.htm")
driver.find_element_by_id('file').send_keys('e:\python\\test1\day1\\1.txt')

time.sleep(10)
driver.quit()

send_keys 处,写要上传的文件绝对路径,注意转义。

二、非input 型上传文件 (参考灰蓝博客:http://blog.csdn.net/huilan_same/article/details/52439546)

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

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

原文作者大概讲解了以下几种方案:
autoIT,借助外力,我们去调用其生成的au3或exe文件。
Python pywin32库,识别对话框句柄,进而操作
SendKeys库
keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…

但是2、3、4作者说不太稳定,而AutoIT在前面我们又学过,所以,暂时研究其他方案,感兴趣的请看灰蓝博客。下面来看下AutoIT的实现方法。



driver.find_element_by_name('file').click()
sleep(5)
os.system("sc.exe")


三、多文件上传

如果html 网页中,有multiple属性,则代表一次可以选择多个文件上传

<input type="file" name="file" multiple>

如何用Selenium 实现控制上传多个文件呢?

1、一个一个上传,试验失败(想想确实不应该成功,毕竟手动点击的时候,上传第二个文件会把第一个文件覆盖掉,这个逻辑本身就这样)

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get(r'file:///E:\python\test1\day1\test0.html')

driver.find_element_by_name('file').send_keys('e:\python\\test1\day1\\1.txt')
sleep(5)
driver.find_element_by_name('file').send_keys('e:\python\\test1\day1\\storm.jpg')
sleep(5)
driver.quit()


2、一次上传多个文件,用逗号分隔

driver.find_element_by_name('file').send_keys("e:\python\\test1\day1\\1.txt","e:\python\\test1\day1\\storm.jpg")

试验失败,只会将最后一个文件上传

3、换成列表上传呢?

files = ["e:\python\\test1\day1\\1.txt","e:\python\\test1\day1\\storm.jpg"]
driver.find_element_by_name('file').send_keys(files)

失败,只传了最后一个文件

经搜索,通过sendkeys,并不能一次传多个文件。

如果有该需求的话,请参考灰蓝win32 用法。

小结:

遇到上传文件控件,看看是否是input标签,如果是,那恭喜你,用sendkeys解决;如果不巧碰到了div类的,用AutoIT实现也不难。如果还想验证同时上传多个文件,那么则只能采用pywin32 实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: