Selenium图片上传

 

方式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

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

代码:

# -*- 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):

  • 自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄。
  • 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文档。

2.

SendKeys

首先要安装SendKeys库,能够用pip安装

pip install SendKeys

代码示例:

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

代码:

# -*- 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 

是否是很麻烦,固然,你甚至能够用按键把整个路径输入进去,不过,我想没人愿意这么作的。并且在此过程当中你不能随意移动鼠标,不能使用剪贴板,太不稳定了,因此很是不建议你用这种办法。

相关文章
相关标签/搜索