点击文件下载时,弹出的那个框,webdriver是定位不到的,只有通过第三方工具或方法来操作

一、通过PyUserInput模拟键盘按键下载


 

PyUserInput是模拟鼠标和键盘的一个模块,替代了python2 中的SendKeys模块。

需要先安装:



pip install PyUserInput



如果用的是python3 32位版本,直接通过pip安装,可以安装成功;

如果用的是puthon3 64位版本,那就比较悲催了,各种报错。

1、查看本机python版本:

python selenium下载文件提示是否保留 selenium下载文件并命名_python

2、安装PyUserInput

如果是32位版本的python,那么就直接pip安装吧,下面的安装教程只针对64位版本的python

python selenium下载文件提示是否保留 selenium下载文件并命名_AutoIt_02

直接报错:No matching distribution found for pyHook (from PyUserInput)

既然直接用pip安装不了,那我们就通过pyHook来安装

pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

python selenium下载文件提示是否保留 selenium下载文件并命名_另存为_03

根据python版本来下载,如python3.6就下载cp36;python3.7就下载cp37

下载轮子到本地后,直接用pip安装



pip install C:\Users\Administrator\Desktop\pyHook-1.5.1-cp36-cp36m-win_amd64.whl



python selenium下载文件提示是否保留 selenium下载文件并命名_另存为_04

继续去刚才那个网址下载pyWin32:

python selenium下载文件提示是否保留 selenium下载文件并命名_操作系统_05

下载完后pip安装



pip install C:\Users\Administrator\Desktop\pywin32-223-cp36-cp36m-win_amd64.whl


python selenium下载文件提示是否保留 selenium下载文件并命名_python_06

现在终于安装PyUserInput了



pip install PyUserInput



python selenium下载文件提示是否保留 selenium下载文件并命名_python_07

OK,没报错,安装成功。

试一下:

python selenium下载文件提示是否保留 selenium下载文件并命名_python_08

成功导入。

我们以autoit的下载为例

python selenium下载文件提示是否保留 selenium下载文件并命名_AutoIt_09

既然没办法直接定位到这个下载框,我们就模拟键盘发送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 文件上传)

python selenium下载文件提示是否保留 selenium下载文件并命名_AutoIt_10

python selenium下载文件提示是否保留 selenium下载文件并命名_AutoIt_11

python selenium下载文件提示是否保留 selenium下载文件并命名_操作系统_12

通过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()