在WEB页面上上传文件一般有以下两种方式:
- 普通上传:将本地文件的路径作为一个值放在input标签中,通过表单将这个值提交给服务器。
- 插件上传:基于前端技术,如Flash,JavaScript实现的上传。
一、普通上传
就以博客园个人资料中的上传头像为例:
代码:
# coding = utf-8
from selenium import webdriver
from time import sleep
# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 个人资料路径
user_data_dir = r'--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data'
# 加载浏览器配置数据
option = webdriver.ChromeOptions()
option.add_argument(user_data_dir)
# 启动浏览器
driver = webdriver.Chrome(chrome_options=option, executable_path=driverfile_path)
driver.get(r'')
driver.implicitly_wait(20)
# 定位上传图片按钮,通过send_keys()方法提交图片地址
driver.find_element_by_css_selector("input[name='file']").send_keys(r"C:\Users\Administrator\Desktop\tx.png")
# 退出
sleep(5)
driver.quit()
二、插件上传
对于有些上传,点击上传后,弹出的是一个控件
这种就没法通过普通上传的那种方式去提交图片路径了。必须的借助第三方工具AutoIt来解决了。
登录官网下载:https://www.autoitscript.com/site/autoit/downloads/
下载完成后安装。
安装好了之后在程序中可以找到AutoIt
- AutoIt Windows Info: 识别Windows控件信息。
- Compile Script to.exe: 将AutoIt生成 exe 执行文件。
- Run Script: 执行AutoIt脚本。
- SciTE Script Editor: AutoIt脚本编辑器
1、打开AutoIt Windows Info工具,鼠标点击Finder Tool,鼠标将变成一个小风扇形状的图标,按住鼠标左键拖动到需要识别的控件上。
通过AutoIt Windows Info工具获得以下信息:
- 窗口的Title为“选择要上载的文件,通过: 172.21.13.83”,Class为“#32770”
- 文件名的输入框的Class为"Edit",Instance为"1",ClassnameNN为"Edit1”
- 打开按钮的Class为“Button”,Instance为"2",ClassnameNN为"Button2”
2、打开SciTE Script Editor编辑器,根据获得的信息编写脚本
;ControlFocus()方法用于识别Window窗口
ControlFocus("选择要上载的文件,通过: 172.21.13.83", "","Edit1")
; WinWait()设置1秒钟用于等待窗口的显示
WinWait("[CLASS:#32770]","",1)
; ControlSetText()用于向“文件名”输入框内输入本地文件的路径,如果是在桌面第三个参数直接写文件名
ControlSetText("选择要上载的文件,通过: 172.21.13.83", "", "Edit1", "C:\Users\Administrator\Desktop\ADI.xml")
Sleep(1000)
; ControlClick()用于点击上传窗口中的“打开”按钮
ControlClick("选择要上载的文件,通过: 172.21.13.83", "","Button2");
脚本写好后,可以通过菜单栏“Tools”-->“Go” (或按键盘F5)来运行脚本!注意在运行时上传窗口当前处于打开状态。
脚本运行正常,保存为upfile.au3
3、Compile Script to.exe工具,将其生成为exe可执行文件
4、通过Python调用upfile.exe程序实现上传
代码:
# coding = utf-8
import os
from selenium import webdriver
from time import sleep
# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe'
# 启动浏览器
driver = webdriver.Ie(executable_path=driverfile_path)
driver.get(r'http://172.21.13.83:28080/')
driver.implicitly_wait(20)
# 登录
driver.find_element_by_css_selector("input[name='admin.loginName']").send_keys("autotest")
driver.find_element_by_css_selector("input[name='admin.password']").send_keys("111111")
driver.find_element_by_css_selector("input#imageField").click()
driver.switch_to.frame("leftFrame")
driver.find_element_by_link_text("媒资编辑").click()
driver.switch_to.default_content()
driver.switch_to.frame("mainFrame")
driver.find_element_by_link_text("导入").click()
driver.switch_to.frame("framelist")
driver.find_element_by_css_selector("#demo-browse").click()
# 通过os模块调用可执行文件
os.system(r"C:\Users\Administrator\Desktop\upfile.exe")
driver.find_element_by_css_selector("a#demo-upload").click()
sleep(3)
driver.find_element_by_css_selector("input#closeButton").click()
# 退出
driver.quit()