方式1:php
若是是input类型的标签则可直接赋值python
部分代码:web
driver.find_element_by_name("file").send_keys("E:\\test.jpg")windows
*************api
多种图片上传时路径与路径之间用“,”分开,只限于统一路径下编辑器
*************ide
方式2:工具
利用AutoIT实现学习
一、AutoIT介绍ui
AutoIT是一个相似脚本语言的软件,利用此软件咱们能够方便的实现模拟键盘、鼠标、窗口等操做,实现自动化。
二、实现原理
利用AutoIT编写合适的脚本,而后将脚本编译成可执行文件,在自动化实现时,直接调用此脚本实现文件上传。
备注:编写脚本和编译,须要借助AutoIT提供的工具,可是脚本编译成可执行文件后,能够直接使用,再也不须要安装AutoIT。
三、自动化调用
AutoIT脚本编译成可执行文件后,放到本地的某一个目录下
自动化实现过程当中,须要上传图片时,首先定位到【上传】字样文本,点击此按钮
执行编辑后的可执行文件,实现文件上传
4.安装后的工具介绍
AutoIT Window Info用来识别Windows控件,根据识别的控件信息编写脚本;
Complie Script to .exe,用来将利用AutoIt编写的脚本,编译成可执行文件;
Run Script 用来执行AutoIT的脚本信息;
SciTE Script Editor用来编写AutoIt脚本。
接下来就是利用以上四种工具,来编写AutoIT脚本,而后编译成可执行文件
5.操做
1) AutoIt Window Info
打开此工具,利用此工具来识别Windows控件信息,如输入框、按钮等。
用鼠标拖住工具上的Finder Tool的图标(即图中蓝色圈圈部分)到要识别的控件上,控件的惟一标识信息会显示在工具的左侧部分(图中红框标出的部分)。
从显示的结果得知,此控件的Title=“打开”,Class为Button,Instance=1。咱们就是利用控件的这些信息,定位控件,编写脚本。
2) SciTE Script Editor
根据以上所识别的空间信息,利用此编辑器,利用此软件根据AutoIT的语法编写脚本。
附实现文件上传须要的几个方法:
ControlFocus ( "窗口标题", "窗口文本", 控件ID) 设置输入焦点到指定窗口的某个控件上
WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] ) 暂停脚本的执行直至指定窗口存在(出现)为止
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本" ) 修改指定控件的文本
Sleep ( 延迟 ) 使脚本暂停指定时间段
ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] ) 向指定控件发送鼠标点击命令
其中,title即AutoIt Window Info识别出的Title字段,controlID即AutoIt Window Info识别出的Class和Instance的拼接,如上图拼接后的结果应为:Button1
AutoIT脚本编写完成后,能够经过菜单栏“Tools”-->“Go” 运行一下脚本。注意,运行的时候,上传窗口需处于打开状态。
3)AutoIT脚本编译成可执行文件
脚本编辑运行无误后,将其保存。而后打开Complie Script to .exe工具,将保存的脚本编译成exe可执行文件。
点击“Browse”选择保存的脚本文件,点击“Convert”将其生成exe文件。
至此,利用AutoIT实现图片上传的流程结束。
4)代码引用
需先导入os
import os
如下方法为网上搜索的,未实践
1.
win32gui
代码:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # win32gui dialog = win32gui.FindWindow('#32770', u'文件上传') # 对话框 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次寻找对象,直到找到输入框Edit对象的句柄 button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 肯定按钮Button win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\baidu.py') # 往输入框输入绝对地址 win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按button print upload.get_attribute('value') dr.quit()
结果:
baidu.py
在这里你须要一个很是重要的小工具:Spy++,百度一下有不少,固然你也能够用autoIT自带的工具,不过没有这个好用,建议去下一个吧。
并且,你得安装pywin32的库,你能够到这里找到对应你python版本的库,注意32位仍是64位必定要和你安装的Python版本对应。
安装完成以后在【开始菜单Python的文件夹】里看到PyWin32的文档【Python for Windows Documentation】,你能从中找到对应的方法API。
简单介绍几个用到的:
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
至于win32api模块以及其余的方法,这里不进行更多描述,想要了解的自行百度或看pywin32文档。
2.
SendKeys
首先要安装SendKeys库,能够用pip安装
pip install SendKeys
代码示例:
代码:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # SendKeys SendKeys.SendKeys('D:\\baidu.py') # 发送文件地址 SendKeys.SendKeys("{ENTER}") # 发送回车键 print upload.get_attribute('value') dr.quit()
结果:
baidu.py
经过SendKeys库能够直接向焦点里输入信息,不过要注意在打开窗口是略微加一点等待时间,不然容易第一个字母send不进去(或者你能够在地址以前加一个无用字符),不过我以为这种方法很不稳定,不推荐。
3.
keybd_event
win32api提供了一个keybd_event()方法模拟按键,不过此方法比较麻烦,也不稳定,因此很不推荐,下面给出部分代码示例,若是想要研究,本身百度去学习吧。
# 先找一个input框,输入想要上传的文件的地址,剪切到剪贴板 video.send_keys('C:\\Users\\Administrator\\Pictures\\04b20919fc78baf41fc993fd8ee2c5c9.jpg') video.send_keys(Keys.CONTROL, 'a') # selenium的send_keys(ctrl+a) video.send_keys(Keys.CONTROL, 'x') # (ctrl+x) driver.find_element_by_id('uploadImage').click() # 点击上传按钮,打开上传框 # 粘贴(ctrl + v) win32api.keybd_event(17, 0, 0, 0) # 按下按键 ctrl win32api.keybd_event(86, 0, 0, 0) # 按下按键 v win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按键 v win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按键 ctrl time.sleep(1) # 回车(enter) win32api.keybd_event(13, 0, 0, 0) # 按下按键 enter win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按键 enter
是否是很麻烦,固然,你甚至能够用按键把整个路径输入进去,不过,我想没人愿意这么作的。并且在此过程当中你不能随意移动鼠标,不能使用剪贴板,太不稳定了,因此很是不建议你用这种办法。