selenium上传文件

文件上传操作也比较常见功能之一,上传功能操作 webdriver 并没有提供对应的方法,关键上传文件的思路。
对于 web 页面的上功能,点击“上传”按钮需要打开本地的 Window 窗口,从窗口选择本地文件进行上传,那么 WebDriver 对于 Windows 的控件是无能为力的。所以,对于初学者来说一般思路会卡在如何实别 Window 控件的问题上。
对于 web 页面的上传功能一般会有以下几种方式。
             普通上传:普通的附件上传都是将本地文件的路径作为一个值放 input 标签中,通过 form 表单提交的时候将这个值提交给服务器。
             插件上传:一般是指基于 Flash 与 JavaScript 或 Ajax 等技术所实现的上传功能或插件。

  • send_keys 实现上传(仅支持到2.7版本)

对于通过 input 标签实现的通过上传,可以将其看作一个输入框,通过 send_keys()传入本地文件路径从而模拟上传功能。

from selenium import webdriver
import os
driver = webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
driver.quit()

通过这种方法上传,就绕开了操作 Windows 控件的步骤。如果能找上传的 input 标签,那么基本都可以通过 send_keys()方法向其输入一个文件地址来实现上传。 

  •  AutoIt 实现上传

AutoIt 目前最新是 v3 版本,这是一个使用类似 BASIC 脚本语言的免费软件,它设计用于 Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。
官方网站:https://www.autoitscript.com/site/
从网站上下载 AutoIt 并安装,安装完成在菜单中会看到图 4.13 的目录:

AutoIt Windows Info 用于帮助我们识 Windows 控件信息。
Compile Script to.exe 用于将 AutoIt 生成 exe 执行文件。
Run Script 用于执行 AutoIt 脚本。
SciTE Script Editor 用于编写 AutoIt 脚本。
下面以操作 upload.html 上传弹出的窗口为例讲解 AutoIt 实现上传过程。
1、首先打开 AutoIt Windows Info 工具,鼠标点击 Finder Tool,鼠标将变成一个小风扇形状的图标,
按住鼠标左键拖动到需要识别的控件上。

通过 AutoIt Windows Info 获得以下信息。
窗口的 title 为“选择要加载的文件”,标题的 Class 为“#32770”。
文件名输入框的 class 为“Edit”,Instance 为“1” ,所以 ClassnameNN 为“Edit1”。
打开按钮的 class 为“Button”,Instance 为“1” ,所以 ClassnameNN 为“Button1”。
2、根据 AutoIt Windows Info 所识别到的控件信息打开 SciTE Script Editor 编辑器,编写脚本。

;ControlFocus("title","text",controlID) Edit1=Edit instance 1
ControlFocus("选择要加载的文件", "","Edit1")
; Wait 10 seconds for the Upload window to appear
WinWait("[CLASS:#32770]","",10)
; Set the File name text on the Edit field
ControlSetText("选择要加载的文件", "", "Edit1", "D:\\upload_file.txt")
Sleep(2000)
; Click on the Open button
ControlClick("选择要加载的文件", "","Button1");

            ControlFocus()方法用于识别 Window 窗口。WinWait()设置 10 秒钟用于等待窗口的显示,其用法与WebDriver 所提供的 implicitly_wait()类似。ControlSetText()用于向“文件名”输入框内输入本地文件的路径。这里的 Sleep()方法与 Python 中 time 模块提供的 Sleep()方法用法一样,不过它是以毫秒为单位,Sleep(2000)表示固定休眠 2000 毫秒。ControlClick()用于点击上传窗口中的“打开”按钮。AutoIt 的脚本已经写好了,可以通过菜单栏“Tools”-->“Go” (或按键盘 F5)来运行一个脚本吧!注意在运行时上传窗口当前处于打开状态。

3、脚本运行正常,将其保存为 upfile.au3,这里保存的脚本可以通过 Run Script 工具将其打开运行,但我们的目的是希望这个脚本被Python程序调用,那么就需要将其生成exe程序。打开Compile Script to.exe工具,将其生成为 exe 可执行文件。如图 

点击“Browse”选择 upfile.au3 文件,点击“Convert”按钮将其生成为 upfile.exe 程序。
4、下面就是通过自动化测试脚本调用 upfile.exe 程序实现上传了。

from selenium import webdriver
import os
driver = webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#点击打开上传窗口
driver.find_element_by_name("file").click()
#调用 upfile.exe 上传程序
os.system("D:\\upfile.exe")
driver.quit()

通过 Python 的 os 模块的 system()方法可以调用 exe 程序并执行。 

下载文件:将所有设置信息在调用 webdriver 的 Firefox()方法时作为参数传递给浏览器。FireFox 浏览器在下载时就根据这些设置信息将文件下载的当前脚本的目录下。那么对于上面的方法只适用于Firefox 浏览器,对于其它浏览器浏览设置方法会有所不同。那么比较通用的方法的还是借助AutoIt 来操作Windows 控件进行下载。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值