Selenium 文件上传
在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'https://upload.cnblogs.com/avatar/crop') 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()