Selenium+Python 下载文件与上传文件
目录
本文记录了我做的使用Selenium编写的自动化测试脚本,功能是从网页下载文件,并将下载的文件上传至另一页面。同时记录了一些编写过程中遇到的问题及解决方法
下载文件功能
谷歌浏览器下载设置
进入设置页面->高级,勾选下载内容的【下载前询问每个文件的保存位置】为勾选,以确保后面能够更改下载文件的名称以及保存地址。
切换iframe框架
在定位导出按钮时出现webdriver在处理定位元素报错,提示没有这样的元素的问题。查询后发现页面使用了frame技术。网页划分成多个子页面。webdriver默认查找的元素都是Top window这层。导出元素内嵌在了frame内部,需要先使用switch to语句,切换到frame内部,然后去操作元素,操作完了之后,需要switch out到default区域,也就是Top window。 上图红框位置标签后的内容均在iframe框架中,通过标签的name属性,定位此标签,代码如下
driver.switch_to.frame("671a7d8e-d2a0-43fd-8b23-0901a7b8f687")
定位元素进行操作后,需要回到Top window
driver.switch_to.default_content()
鼠标悬浮元素定位
使用悬停实现鼠标放置在导出元素上,弹出选项
鼠标悬停 move_to_element()
mouse = driver.find_element_by_xpath('//*[@class="bi-show bi-abs"]/div[2]/div/div[2]/div')
# a = driver.find_elements_by_xpath('//body/*[@id="wrapper"]/div[2]/div/div[2]/div')
time.sleep(1)
ActionChains(driver).move_to_element(mouse).perform()
try:
driver.find_element_by_xpath("//*[@id='wrapper']/div[2]/div/div[2]/div[2]/div/div/div/div[2]").click()
print("导出成功")
except:
time.sleep(1)
鼠标悬浮后出现的元素定位
需要定位鼠标悬停才显示的元素,如果直接点击获取元素地址,鼠标移开后选项就会消失从而无法定位。首先使鼠标悬停并出现需要定位的选项,然后在谷歌浏览器F12,选择Sourses点击下图红框按钮,进入Debugger paused模式。此时再进行元素定位,选项不会消失。
上传文件
切换句柄
当弹出新的页面,需要获取新的页面元素,需要首先切换页面到新的网页窗口 1.获取所有句柄
currentWin = driver.window_handles
print(f"获取到当前所有的handle:{currentWin}")
2.切换至新的页面
driver.switch_to.window(currentWin[-1])
handle = driver.current_window_handle
print(f"获取到当前的handle:{handle}")
利用AutoIt进行桌面元素定位
1.AutoIt下载安装使用 官方网站:https://www.autoitscript.com/site/autoit/ 使用参考链接文章:https://www.cnblogs.com/generalli2019/p/11451211.html 编辑器代码如下
WinActivate("打开");
;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:\Users\00762856\Downloads\审核不通过.pdf")
Sleep(2000)
; Click on the Open button
ControlClick("打开", "","Button1");
自动化代码增加如下语句
import os
os.system(r'D:\work\uitest2\test_zhifu2\autoit\test.exe')
2.传参参数化(未实现) 将编辑器代码中的文件地址 “D:\Users\00762856\Downloads\审核不通过.pdf”,修改成一个参数$CmdLine[1] 在代码中增加
file_path = "D:\Users\00762856\Downloads\审核不通过.pdf"
os.system(r'D:\work\uitest2\test_zhifu2\autoit\test.exe' % file_path) # 你自己本地的地址
3.批量上传(未实现) 方法一:先把要上传的图片放到一个list下,然后for循环
# 把需要上传的图片放到一个list下
all_png = ["D:\\1.png", "D:\\2.png", "D:\\3.png", "D:\\4.png"]
# 循环点击上传图片
for i in all_png:
# 1点开编辑器图片
# 2点开文件上传按钮
# 执行autoit上传文件
os.system("C:\Users\Gloria\Desktop\cmdjpg.exe %s" % i) # 你自己本地的.exe路径
time.sleep(3)
方法二:把要上传的图片编号,如:0.png , 1.png, 2.png这种(从0开始编号),放到同一目录下,然后for循环
# 循环点击上传图片
for i in range(4):
# 1点开编辑器图片
# 2点开文件上传按钮
# 文件名
file_name = "D:\\%s.png" % i # 参数化路径名称
# 执行autoit上传文件
os.system("C:\Users\Gloria\Desktop\cmdjpg.exe %s" % file_name) # 你自己本地的.exe路径
time.sleep(3)
整体代码
driver = webdriver.Chrome()
driver.get('http://10.39.168.111/webroot/decision')
time.sleep(2)
driver.maximize_window()
time.sleep(1)
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div[2]/div/div/div[1]/div[1]/div[1]/div[1]/div[2]/input").clear()
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div[2]/div/div/div[1]/div[1]/div[1]/div[1]/div[2]/input").send_keys("00744521")
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div[2]/div/div/div[1]/div[2]/div[1]/div[1]/div[2]/input").clear()
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div[2]/div/div/div[1]/div[2]/div[1]/div[1]/div[2]/input").send_keys("fwD.342p9IerwK")
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div/div[2]/div/div/div[1]/div[4]/div").click()
time.sleep(3)
driver.find_element_by_xpath("//*[@id='wrapper']/div[1]/div[1]/div[2]/div/div[2]/div[2]/div[1]/div[5]/div/div/div[1]/div/div/div/div/div/div/div[4]").click()
driver.find_element_by_xpath("
|