引自  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

python selenium下载对话框_Selenium+Python:下载文件(Firefox 和 Chrome)相关推荐

  1. python selenium高级教程_selenium(python)教程

    Updated on Aug-11-2019 今天再试了一下,发现自己的chrome安装路径变成"C:\Users\Kevin\AppData\Local\Google\Chrome\App ...

  2. python + selenium在亚马逊下载产品主图

    python + selenium 在亚马逊下载产品主图 下载的图片是1000像素的,即卖家上传的图片 import requests import xlwings from selenium imp ...

  3. python selenium启动不了火狐浏览器(firefox)的解决办法

    本文章转载深圳SEO_广东SEO网站优化建设 » python selenium启动不了火狐浏览器(firefox)的解决办法,仅供记录,以备学习. selenium3.0之前的版本,是可以直接打开火 ...

  4. python的selenium自动化测试公路_selenium+python自动化测试

    F12: 右键   选择复制  path from selenium import webdriver import time driver = webdriver.Chrome() driver.g ...

  5. python自动化测试环境搭建_selenium+python自动化测试之环境搭建

    最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所以研究了一下,使用python来实现自动化脚本,从环境搭建到 ...

  6. python selenium 环境_配置Python Selenium环境

    1.安装Python (download Python exe file and install it, add path into home) 2.安装Selenium https://www.cn ...

  7. python自动部署环境_selenium + python 部署自动化测试环境

    选择selenium和python其实是怀有私心的:码两行python,熟悉熟悉. selenium优点很多,我最看重的是支持多语言,足够简单,同时支持浏览器. 实际工作中,简单实用真的太重要了,谁都 ...

  8. python selenium截图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  9. python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

最新文章

  1. Docker Hub 镜像加速器
  2. Java 常见的OOM类型总结
  3. 我的Go+语言初体验——ubuntu安装Go+环境问题锦集(二)
  4. 修改了/etc/systemd/system.conf以后必须使用daemon-reexec
  5. ST算法解决RMQ问题
  6. Firefox浏览器常见问题开讲
  7. Java开发利器:IntelliJ IDEA的安装、配置与使用
  8. mt4 python神经网络_迈达克软件公司承认Python运算对量化交易的重要性----将Python与Metatrader 5集成一体...
  9. 如何将字符串数组的空格去除_java中如何将数组转换为List
  10. 51单片机流水灯方法大全
  11. latex调整caption字体大小
  12. 安装一级计算机失败,Win7/Win8.1升级Win10提示“安装失败”的解决方法
  13. 为什么要架设移动基站
  14. Leetcode个人题解714
  15. (5.1)Typora——Typora 图像保存和上传( 本地 + PicGo + SMMS/Gitee)
  16. 树模型(1)-入门指南
  17. 搭建自己的无人值守本地影视点播系统
  18. 阿里心电图数据特征分析
  19. 《信息化项目文档模板二——项目启动会文档模板》
  20. EAUML日拱一卒-微信小程序实战:位置闹铃 (19)-发布微信小程序

热门文章

  1. 如何利用海关数据开发客户?
  2. IT人员饮食搭配必知的六大禁忌~~茶叶煮鸡蛋 相克吗?
  3. python填充红色_一起学opencv-python七(ROI,泛洪填充和颜色替换)
  4. 智能手机的发展有多猛?
  5. π122M30代替Si8621AB-B-IS 低功耗,高能效、抗干扰能力好的 双通道数字隔离器解决方案
  6. 微信sdk上传录音php,PHP端微信JS-SDK录音上传并转mp3和播放
  7. Python之中文字符问题
  8. 干货!7年投稿经验总结教你这样回复审稿意见更有效!
  9. 阿里云搭建frp(其他云,通用)内网穿透
  10. 跑赢阿里云和百度,腾讯云凭啥刷新大数据国际纪录?