Selenium+Python:下载文件(Firefox 和 Chrome)
引自 https://blog.csdn.net/Momorrine/article/details/79794146
1. 环境
|
操作系统 |
Win10 |
|
IDE |
Eclipse (Oxygen 4.7)+ PyDev 5.9.2 (JDK1.8) |
|
Python |
3.5 |
|
Selenium |
selenium-3.9.0-py2.py3-none-any.whl |
|
FirefoxDriver |
0.20.0 |
|
Firefox浏览器 |
59.0.2(32位) |
|
ChromeDriver |
2.34 |
|
Chrome浏览器 |
63.0.3239.84 |
2. Firefox
这是虫师书里面的一个例子,我直接copy下来了
- from selenium import webdriver
- fp = webdriver.FirefoxProfile()
- fp.set_preference("browser.download.folderList", 2)
- fp.set_preference("browser.download.manager.showWhenStarting", False) # 不起作用
- fp.set_preference("browser.download.dir", os.getcwd())
- fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
- driver = webdriver.Firefox(firefox_profile=fp)
- driver.get("http://pypi.Python.org/pypi/selenium")
- driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
但是很不幸,我这儿运行了,还是会弹出确认下载对话框,虽然设置了browser.download.manager.showWhenStarting为Flase,而由于Selenium无法操作该对话框,程序就卡在那儿了没能下载文件。
我发现确认下载对话框,默认的焦点就在【确定】上,就试着在代码的最后添加这样一句:
ActionChains(driver).key_down(Keys.ENTER).perform()
当这个对话框出现的时候,手动键入ENTER是可以下载的,但这句代码并没有起作用,仍然没有下载文件。
3. Chrome
又试着增加了一些等待时间,始终没成功,就想着先换一个浏览器试试吧。
- options = webdriver.ChromeOptions()
- prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': os.getcwd()}
- options.add_experimental_option('prefs', prefs)
- driver = webdriver.Chrome(chrome_options=options)
- driver.get("http://pypi.Python.org/pypi/selenium")driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
对Chrome浏览器设置了profile.default_content_settings.popups为0是起作用的,运行这段代码,并没有弹出确认提示框,文件可以下载下来。
4. Firefox+Pywin32
总觉得Firefox应该也会有办法来操作那个确认下载对话框,百度了一下,有提到Pywin32,可以获取并操作Windows窗口。那就先安装一个吧。
Pywin32,我是直接在命令行切换到Python根目录\Scripts下,用pip install pywn32来安装的:
此外还用到一个可以获取Windows窗口属性的小工具Sky++,下载了解压缩就可以用了。运行Sky++后,点击【搜索】-【窗口搜索】菜单项打开【窗口搜索】对话框
按住其中的查找程序工具拖动到确认下载对话框后释放,【窗口搜索】对话框中会显示该窗口的句柄、标题、类等属性
通过后两个属性,就可以调用win32gui.FindWindow()获取该窗口的句柄,进而试着操作该窗口。注意 :虽然在Sky++中已经得到了句柄,但程序中不能直接用,因为每次运行窗口句柄是不同的。
于是我在之前的代码后面增加了下面这句代码
dialog = win32gui.FindWindow("MozillaDialogClass", u"正在打开 selenium-3.11.0-py2.py3-none-any.whl")
打印了一下dialog,是有值的,就说明成功地获取到了窗口句柄了。
在获取到对话框的句柄后,就应该进一步获取【确定】按钮的句柄,然后点击该按钮,这样就应该可以下载文件了
- button = win32gui.FindWindowEx(dialog,None, "Button",None)
- win32gui.PostMessage(button, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
- win32gui.PostMessage(button, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
可是一直没成功,打印button一直是0,没有能获取到按钮的句柄,我怀疑是因为类名不正确的原因,但Sky++上无法看到按钮的信息,将类名换了又换,或许是"MozillaButtonClass",但始终没有获取。
转而我又想,既然对话框获取到了,那对对话框键入ENTER呢,或许就可以了
win32gui.SendMessage(dialog,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
嗯,真的可以了。因此用Firefox下载文件的完整代码是
- from selenium import webdriver
- import win32gui, win32con
- fp = webdriver.FirefoxProfile()
- fp.set_preference("browser.download.folderList", 2)
- fp.set_preference("browser.download.dir", os.getcwd())
- fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
- driver = webdriver.Firefox(firefox_profile=fp)
- driver.get("http://pypi.Python.org/pypi/selenium")
- driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
- dialog = win32gui.FindWindow("MozillaDialogClass", u"正在打开 selenium-3.11.0-py2.py3-none-any.whl")
- win32gui.SendMessage(dialog,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
只是有一个问题,在import win32gui和win32con时,会有错误标识
但运行没问题,不知道为什么。。。。。。
还要注意的是,需要根据当前网络的状况,以及下载文件的大小,适当添加一些等待时间,不然会可能出现最后关闭浏览器驱动时文件还没下完的情况。
5. 再次Firefox
以上那些是昨天写的,是到昨天晚上为止的认识。今儿早上来了,在搜另外一个问题的时候,发现有博文说Firefox不能下载的原因,很可能是因为"browser.helperApps.neverAsk.saveToDisk"设置的文件类型不对的缘故,我把那个例子里面的类型"binary/octet-stream"贴过来试了一下,果然是可以的。但关于browser.download.manager.showWhenStarting设置为Flase不弹出提示框,其实代码中把文件类型设置正确了,没有设置browser.download.manager.showWhenStarting,也并没有弹出提示框。
- from selenium import webdriver
- fp = webdriver.FirefoxProfile()
- fp.set_preference("browser.download.folderList", 2)
- fp.set_preference("browser.download.dir", os.getcwd())
- fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "binary/octet-stream")
- driver = webdriver.Firefox(firefox_profile=fp)
- driver.get("http://pypi.Python.org/pypi/selenium")
- driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
有朋友友情提示,该加个参考资料小节。以前写东西的时候倒是每次都有注意引用这个问题,而最近写的也只是记录自己的一个学习Selenium+Python
Web自动化测试的过程。不过好习惯还是该保持,这篇已经不太记得自己到底搜了哪些文章了,就记下几篇还记得的吧。
6. 参考资料
[1] 《Selenium2自动化测试实战:基于Python语言》虫师编著 电子工业出版社 2016年1月
[2] 用selenium的webdriver下载文件(基于python,firefox和chrome) https://blog.csdn.net/cyjs1988/article/details/74988997
[3] Selenium 设置浏览器下载 http://www.cnblogs.com/fnng/p/7700620.html
Selenium+Python:下载文件(Firefox 和 Chrome)的更多相关文章
- 《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)
1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...
- 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...
- 【331】python 下载文件:wget / urllib
参考:python下载文件的三种方法(去掉-) 方法一:wget import wget, os # 设置下载路径 os.chdir(r"D:/tmp") url="ht ...
- python+selenium下载文件——firefox
修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...
- Python+Selenium学习--下载文件
场景 webdriver 允许我们设置默认的文件下载路径.也就是说文件会自动下载并且存在设置的那个目录中,下面以firefox及chrome为例 代码 Firefox下载 为了让Firefox浏览器能 ...
- Python+selenium之下载文件
一.Firefox文件下载 Web容许我们设置默认的文件下载路劲,文件会自动下载并且存放在指定的目录下. from selenium import webdriver import os fp = w ...
- Selenium+python+shell+crontab+firefox
最近在尝试一个自动打卡的脚本,发现了几个问题,特此记录一下. 环境: Ubuntu 12.04.4 LTS selenium 2.43.0 firefox 32.0.3 1 本来机器上selenium ...
- python下载文件的三种方法
Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...
- python下载文件(图片)源码,包含爬网内容(爬url),可保存cookie
#coding=utf-8 ''' Created on 2013-7-17 @author: zinan.zhang ''' import re import time import httplib ...
随机推荐
- Linux audit安全审计工具
/********************************************************************** * Linux audit安全审计工具 * 说明: * ...
- 使用Python中的log模块将loss输出到终端与保存到文件
记得之前对深度学习中得loss输出,经常自己会将输出流重新定向到一个文件中, 比如 python main.py > & | tee log.txt 对于caffe这种c++框架而言,用 ...
- AE1
i2.1 导入四种方式: 1.文件->导入 2.项目窗口空白区域双击 3.空白区域右键 4 ctrl+i 常用键: ctri+i ctrl shift alt delete 2.2移动属 ...
- UE4 IOS 开发之传感器输入
Iphone的传感器包括陀螺仪.加速计等. UE4提供了4个按键来收集这些传感器的3维数据.具体位置:ProjectSettings->Input. 其中Tilt数据可以反映Iphone目前的物 ...
- synchronized (string.intern())
在jdk7下慎用String.intern()作为synchronized的对象锁: https://www.cnblogs.com/yhlx/p/3498387.html String.intern ...
- Spring事务失效的原因
http://blog.csdn.net/paincupid/article/details/51822599 Spring事务失效的原因 5种大的原因 如使用mysql且引擎是MyISAM,则事务会 ...
- Linux配置浮动IP
在高可用集群环境中,一般都需要使用浮动IP来实现web高可用(High Availability). 浮动IP的概念以及为什么需要浮动IP请参考:https://blog.csdn.net/readi ...
- 普林斯顿数学指南(第一卷) (Timothy Gowers 著)
第I部分 引论 I.1 数学是做什么的 I.2 数学的语言和语法 I.3 一些基本的数学定义 I.4 数学研究的一般目的 第II部分 现代数学的起源 II.1 从数到数系 II.2 几何学 II.3 ...
- 日志插件 log4net 的配置和使用
文本格式说明 可以记载的日志类别包括:FATAL(致命错误).ERROR(一般错误).WARN(警告).INFO(一般信息).DEBUG(调试信息). 文本参数说明 %m(message):输出的日志 ...
- C#使用Xamarin开发Android应用程序 -- 系列文章
Xamarin开发Android应用程序 利用Xamaria构建Android应用-公交发车信息屏 Xamarin版的C# SVG路径解析器 C#使用Xamarin开发可移植移动应用(1.入门与Xam ...