第一种情况
input标签
input标签可以直接使用send_keys(文件地址)上传文件
示例:
el = driver.find_element_by_id(‘fileid’)
el.send_keys(r"F:\Python\testcase.txt")
第二种情况
非input标签(如a标签,div标签,button标签等),无法通过selenium解决,面对系统弹出框,需要找到能调用系统api操作。以下介绍使用autoit工具解决。
autoit工具下载地址:https://www.autoitscript.com/site/autoit/downloads/
解决思路如下:
a. 识别使用aotoit工具对上传文件弹框的文件名输入框和上传按钮进行定位,取出文件名输入框和上传按钮的classname
b. 打开SciTE Script Editor,根据步骤a取出的classname编写、修改脚本,生成的文件格式为.au3
c. 打开Compile Script to.exe(64)即Auto2Exe v3 将.au3文件转换成.exe文件
d. os.system(r"C:\upfile.exe")【此代码要在打开文件上传弹出框后,目的是让文件上传弹出框为当前窗口】
第一步、识别Windows控件的信息(AutoIt Windows Info)
主要识别两个信息,一个是文件名输入框,另一个是打开按钮
第二步、编写AutoIt脚本(SciTE Script Editor)
ControlFocus("文件上传","","Edit1");
WinWait("[CLASS:#32770]","",10)
ControlSetText("文件上传","","Edit1","D:\picture.PNG");
Sleep(2000);
ControlClick("文件上传","","Button1");
在打开上传框后,先将文档保存,不保存是不能Go的,保存的格式也是默认的.au3。保存后Tools–Go。看看效果。
注意:每个浏览器的Title是不一样的,火狐的是“文件上传”,chrome是“打开”。需要具体问题具体分析。。
第三步、生成exe执行文件(Compile Script to.exe)
将刚刚保存的au3生成exe文件
第四步、通过selenium调用这个生成好的exe文件去执行自动上传啦。定位到上传按钮,然后.click()进行点击,接下来就是调用了,具体语句如下:
upload = driver.find_element_by_xpath("//div[@id='picker']/div[2]/label")
upload.click()
os.system("C:\\Users\admin\Desktop\Autolt3\ptest.exe")
批量上传
autolt3参数化可以用$CmdLine[1]变量来代替,1表示的是第一个参数,只需要在脚本中把路径换成这个变量就好:
ControlFocus("文件上传","","Edit1");
WinWait("[CLASS:#32770]","",10);
ControlSetText("文件上传","","Edit1",$CmdLine[1]);
Sleep(2000);
ControlClick("文件上传","","Button1");
for i in range(3):
upload = driver.find_element_by_xpath("//div[@id='picker']/div[2]/label")
upload.click()
file_path = "D:\\%s.png" %i
os.system("C:\\Users\zhangchao\Desktop\Autolt3\parameterFirefox.exe %s" %file_path)