Selenium 文件下载
点击文件下载时,弹出的那个框,webdriver是定位不到的,只有通过第三方工具或方法来操作
一、通过PyUserInput模拟键盘按键下载
PyUserInput是模拟鼠标和键盘的一个模块,替代了python2 中的SendKeys模块。
需要先安装:
pip install PyUserInput
如果用的是python3 32位版本,直接通过pip安装,可以安装成功;
如果用的是puthon3 64位版本,那就比较悲催了,各种报错。
1、查看本机python版本:
2、安装PyUserInput
如果是32位版本的python,那么就直接pip安装吧,下面的安装教程只针对64位版本的python
直接报错:No matching distribution found for pyHook (from PyUserInput)
既然直接用pip安装不了,那我们就通过pyHook来安装
pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
根据python版本来下载,如python3.6就下载cp36;python3.7就下载cp37
下载轮子到本地后,直接用pip安装
pip install C:\Users\Administrator\Desktop\pyHook-1.5.1-cp36-cp36m-win_amd64.whl
继续去刚才那个网址下载pyWin32:
下载完后pip安装
pip install C:\Users\Administrator\Desktop\pywin32-223-cp36-cp36m-win_amd64.whl
现在终于安装PyUserInput了
pip install PyUserInput
OK,没报错,安装成功。
试一下:
成功导入。
我们以autoit的下载为例
既然没办法直接定位到这个下载框,我们就模拟键盘发送Tab和Enter键来下载
代码:
# coding = utf-8 from selenium import webdriver from time import sleep from pykeyboard import PyKeyboard # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe' # 启动浏览器 driver = webdriver.Ie(executable_path=driverfile_path) driver.get(r'https://www.autoitscript.com/site/autoit/downloads/') driver.maximize_window() driver.implicitly_wait(20) # 拖动滚动条到页面中部 js = "var q=document.body.scrollTop=55555" driver.execute_script(js) sleep(2) driver.find_element_by_css_selector("img[title='Download AutoIt']").click() # 建立一个键盘对象 sleep(2) k = PyKeyboard() # 按两次Tab键,焦点定位到“运行”按钮上 k.press_key(k.tab_key) sleep(1) k.press_key(k.tab_key) # 按下Enter键,开始下载 sleep(1) k.press_key(k.enter_key) # 退出 sleep(5) driver.quit()
二、通过AutoIt下载
我们还可以通过AutoIt工具(不知道这个工具怎么用的请查看 Selenium 文件上传)
通过AutoIt Windows Info工具获得以下信息:
- 窗口的Title为“文件下载 - 安全警告”,Class为“#32770”“保存”按钮的ClassnameNN为"Button2"
- ”文件名”路径输入框的ClassnameNN为"Edit1"
- 保存窗口的Title为“另存为”,Class为“#32770”
- “保存”按钮的ClassnameNN为"Button1"
根据以上信息编写脚本:
ControlGetFocus("文件下载 - 安全警告") ControlFocus ( "文件下载 - 安全警告", "", "" ) ControlFocus ( "文件下载 - 安全警告", "保存(&S)", "Button2") Sleep(2000) ControlClick ( "文件下载 - 安全警告", "保存(&S)", "Button2","left",1) WinWaitActive("另存为") ControlGetFocus("另存为") ControlFocus ("另存为", "", "" ) ;获取下载包的名称 $text=ControlGetText("另存为","","Edit1") ;输入保存路径 ControlSend("另存为","","Edit1","C:\Users\Administrator\Desktop\test\"&$text) Sleep(2000) ControlFocus ("另存为", "保存(&S)", "Button1") ControlClick ("另存为", "保存(&S)", "Button1" ) Sleep(2000) ;当前路径下如果有重名的文件则替换 If WinExists("确认另存为","") Then WinWaitActive("确认另存为") ControlGetFocus("确认另存为") ControlFocus ("确认另存为", "", "" ) ControlFocus ("确认另存为", "是(&Y)", "Button1") ControlClick ("确认另存为", "是(&Y)", "Button1" ) EndIf
生成exe文件,再用python调用
代码:
# coding = utf-8 from selenium import webdriver from time import sleep import os # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe' # 启动浏览器 driver = webdriver.Ie(executable_path=driverfile_path) driver.get(r'https://www.autoitscript.com/site/autoit/downloads/') driver.maximize_window() driver.implicitly_wait(20) # 拖动滚动条到页面中部 js = "var q=document.body.scrollTop=55555" driver.execute_script(js) sleep(2) driver.find_element_by_css_selector("img[title='Download AutoIt']").click() # 调用downfile.exe os.system(r"C:\Users\Administrator\Desktop\downfile.exe") # 退出 sleep(60) driver.quit()
三、FireFox浏览器下载
通过FireFox浏览器来下载文件时,可以设置其Profile:
browser.download.dir
:指定下载路径browser.download.folderList
:设置成0
表示下载到桌面;设置成1
表示下载到默认路径;设置成2
表示使用自定义下载路径;browser.download.manager.showWhenStarting
:在开始下载时是否显示下载管理器browser.helperApps.neverAsk.saveToDisk
:对所给出文件类型不再弹出框进行询问
代码:
# coding = utf-8 from selenium import webdriver from time import sleep # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\geckodriver.exe' # 设置profile profile = webdriver.FirefoxProfile() # 设置下载路径 profile.set_preference("browser.download.dir",r"C:\Users\Administrator\Desktop\test") # 设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径 profile.set_preference("browser.download.folderList",2) # 是否显示下载管理器 profile.set_preference("browser.download.manager.showWhenStarting",False) # 设置成不弹框 profile.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream") # 启动浏览器 driver = webdriver.Firefox(executable_path=driverfile_path,firefox_profile=profile) driver.get(r'https://www.autoitscript.com/site/autoit/downloads/') driver.maximize_window() driver.implicitly_wait(20) # 拖动滚动条到显示下载按钮的地方 target = driver.find_element_by_css_selector("img[title='Download AutoIt']") driver.execute_script("arguments[0].scrollIntoView();", target) sleep(2) driver.find_element_by_css_selector("img[title='Download AutoIt']").click() # 退出 sleep(60) driver.quit()
Firefox需要针对每种文件类型进行设置,这里需要我们查询对应文件的MIME类型,可以用以下链接进行查询:MIME 参考手册
四、Chrome浏览器下载
通过Chrome浏览器来下载文件时,需设置options:
download.default_directory
:设置下载路径profile.default_content_settings.popups
:设置为0
禁止弹出窗口
代码:
# coding = utf-8 from selenium import webdriver from time import sleep # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe' # 设置options options = webdriver.ChromeOptions() # 设置下载路径 prefs = {"profile.default_content_settings.popups":0,"download.default_directory":r"C:\Users\Administrator\Desktop\test"} options.add_experimental_option("prefs",prefs) # 启动浏览器 driver = webdriver.Chrome(executable_path=driverfile_path,chrome_options=options) driver.get(r'https://www.autoitscript.com/site/autoit/downloads/') driver.maximize_window() driver.implicitly_wait(20) # 拖动滚动条到显示下载按钮的地方 target = driver.find_element_by_css_selector("img[title='Download AutoIt']") driver.execute_script("arguments[0].scrollIntoView();", target) sleep(2) driver.find_element_by_css_selector("img[title='Download AutoIt']").click() # 退出 sleep(60) driver.quit()