我想用 win32ole 这个库来实现自动化生成报表。 但是制作报表其中一步是需要到公司内网上下载某个期间的数据(csv 格式)。 在用下面的代码打开内网并点击下载按钮后,ie11 会出现一个下载对话框。 我尝试了各种方法,均无法选中这个对话框。并且 Ruby 手册关于 win32ole 的记载感觉也不是很详细。 所以烦请对这块比较熟悉的大佬指教一下,谢谢!
require 'win32ole'
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
ie.navigate('http://www.example.com')
sleep 1 while ie.Busy
dn_btn = ie.Document.getElementById('download')
dn_btn.click
出现的下载对话框
另外,刚刚去看了下 watir. 似乎不支持用 ie 下载文件。
Downloads are problematic in Watir because they require interacting with the Operating System, and Watir automates a Browser, not an OS. As such if any file dialog boxes are displayed, Watir will be unable to handle them. Especially if you are executing your tests on a remote machine, realize that downloads will be sent to that machine, not the machine executing your Ruby code, which makes retrieving the file effectively impossible. Additionally, actually validating the content of a file is not trivial, especially for something like a PDF.
额……我根本不知道怎么选择这个对话框。 我只是用这个代码把所有能用的方法打印出来看了一下……
p ie.ole_methods
我手头上没有 pc, 这个下载对话框应该也是浏览器的一部分,你用 ie 浏览器去打开一个能够下载东西的网站,看不能把对话框的 dom 元素找出来
我一开始也觉得这个对话框应该是浏览器的一部分。不过刚刚看了 watir 的那段介绍,似乎这个对话框跟浏览器无关。
Downloads are problematic in Watir because they require interacting with the Operating System, and Watir automates a Browser, not an OS. As such if any file dialog boxes are displayed, Watir will be unable to handle them.
我用 Net::HTTP 试了一下。因为从来没用过,也不知道是不是代码写错了,还是没能成功。
require 'net/http’
require 'uri'
uri = URI("www.example.com/xxxxx.csv")
Net::HTTP.get(uri)
=>"<html><body>You are being <a href=\"http://www.example.com/login?back_url=http://www.example.com/xxxxx.csv">redirected</a>.</body></html>
另外,如果向 login 页面发送 post 请求的话,无论怎么发都不成功……
uri = URI("www.example.com/login")
Net::HTTP.post_form(uri, {:username => "username", :password => "password"})
=> #<Net::HTTPUnprocessableEntity 422 Unprocessable Entity readbody=true>
我试着获取了 post 的表单。
然后试着构造一个类似的散列传到 Net::HTTP.post_form 方法里 不知道是不是那个验证 token 不对,还是返回 422