我正在研究python和selenium。我想使用selenium从clickevent下载文件。我写了以下代码。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get("http://www.drugcite.com/?q=ACTIMMUNE")
browser.close()
我想下载这两个文件从链接与名称“导出数据”从给定的网址。如何实现它,因为它只与点击事件工作?
我承认这个解决方案比Firefox Profile saveToDisk替代方案更“黑”一些,但它同时适用于Chrome和Firefox,并且不依赖于随时可能更改的浏览器特定功能。如果没有别的,也许这会给人们一个不同的视角来看待如何解决未来的挑战。
先决条件:确保已安装selenium和pyvirtualdisplay。。。
sudo pip install selenium pyvirtualdisplay
sudo pip3 install selenium pyvirtualdisplay
魔法
说明
我们首先在要下载文件的域上加载一个URL。这允许我们在该域上执行AJAX请求,而不会遇到cross site scripting问题。
接下来,我们将向DOM中注入一些javascript,这将触发AJAX请求。一旦AJAX请求返回响应,我们就获取响应并将其加载到FileReader对象中。在那里,我们可以通过调用readAsDataUrl()来提取文件的base64编码内容。然后,我们获取base64编码的内容,并将其附加到
window
,一个全局可访问的变量。最后,因为AJAX请求是异步的,所以我们输入一个Python while循环,等待内容追加到窗口中。一旦它被追加,我们就解码从窗口检索到的base64内容并将其保存到一个文件中。
这个解决方案应该可以在Selenium支持的所有现代浏览器上运行,并且可以在文本或二进制以及所有mime类型上运行。
替代方法
虽然我还没有测试过,但是Selenium确实提供了等待元素出现在DOM中的能力。您可以在DOM中创建一个具有特定ID的元素,并使用该元素的绑定作为触发器来检索下载的文件,而不是在填充全局可访问的变量之前循环。
使用
find_element(s)_by_*
查找链接,然后调用click
方法。添加了配置文件操作代码以防止下载对话框。
在chrome中,我要做的是通过单击链接下载文件,然后打开
chrome://downloads
页面,然后从shadow DOM检索下载的文件列表,如下所示:此解决方案仅限于chrome,数据中还包含文件路径和下载日期等信息。(注意,此代码来自JS,可能不是正确的python语法)
相关问题 更多 >
编程相关推荐