这是我的情况:我必须登录到一个网站并从那里下载一个CSV,无头从linux服务器。页面使用JS,没有它就无法工作。
经过一些研究,我用硒和幻影。 登录、设置CSV的参数以及使用Selenium/PhantomJS/Py3找到下载按钮都没有问题,实际上令人非常愉快。
但是点击下载按钮什么也没做。经过一些研究,我发现PhantomJS似乎不支持下载对话框和下载,但它在即将到来的特性列表中。
因此,当我发现下载按钮只是在调用REST API Url时,我想我使用了一个urllib
的解决方法。问题是,它只在您登录到站点时才起作用。
因此第一次尝试失败,因为它返回了:b'{"success":false,"session":"expired"}'
,这很有意义,因为我希望Selenium和urllib使用不同的会话。
所以我想我使用urrlib中Seleniums驱动程序的头来尝试:
...
url = 'http://www.foo.com/api/index'
data = urllib.parse.urlencode({
'foopara': 'cadbrabar',
}).encode('utf-8')
headers = {}
for cookie in driver.get_cookies():
headers[cookie['name']] = cookie['value']
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
page = response.read()
driver.close()
不幸的是,这产生了与过期会话相同的结果。我做错了什么,有没有办法解决这个问题,其他的建议,或者我是在死胡同?提前谢谢。
如果您要下载的按钮具有文件链接,则可以使用python代码测试下载,因为PhantonJs本身不支持下载。因此,如果下载按钮不提供文件链接,则无法进行测试。
要使用文件链接和phyton(断言文件存在)进行测试,可以遵循以下主题。由于我是一个C#开发人员和测试人员,我不知道用python编写代码而不出错的更好方法,但我相信您可以:
Basic http file downloading and saving to disk in python?
我最近使用Selenium来利用ChromeDriver从web下载一个文件。这是因为Chrome会自动下载文件并将其存储在下载文件中。这比使用幻影更容易。
我建议研究使用含硒的ChromeDriver,并遵循以下路线:https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver
编辑-正如下面指出的,我忽略了如何设置ChromeDriver以在无头模式下运行。这里有更多信息:http://www.chrisle.me/2013/08/running-headless-selenium-with-chrome/
或: https://gist.github.com/chuckbutler/8030755
我找到了一个解决方案,想和大家分享。 有一个需求改变了,我不再使用
PhantomJS
,而是使用chromedriver
,它在虚拟帧缓冲区中无头工作。同样的结果也能完成任务。你需要的是:
pip install selenium pyvirtualdisplay
apt-get install xvfb
下载ChromeDriver
我使用Py3.5和ovh.net中的一个测试文件,其中包含一个标记,而不是一个按钮。 脚本等待页面上出现,然后单击它。如果您不等待该元素并且位于异步站点上,则您尝试单击的元素可能还不存在。下载位置是相对于脚本位置的文件夹。如果文件已下载,脚本将检查该目录,并再次延迟。如果我没有错,那么在下载过程中文件应该是.part,一旦它成为
filename
中指定的.dat,脚本就会完成。如果在下载无法完成之前关闭虚拟帧缓冲区和驱动程序。 完整的脚本如下:我希望这对将来的人有帮助。
相关问题 更多 >
编程相关推荐