新手问题 用 win32ole 自动化控制 ie 时,如何选中到下载时的对话框对象

baboon · 2019年05月21日 · 最后由 baboon 回复于 2019年05月22日 · 1406 次阅读

我想用 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 来驱动,不要自己用 win32ole

lyfi2003 回复

谢谢回复。 能告知下不能自己用 win32ole 的具体原因吗? 是有什么安全方面的问题,还是代码规范之类的……

最好还是在 http 级别的 download 吧。。。 操作 UI 坑死人。。

"均无法选中这个对话框" 这个有点歧义,是指鼠标点不到下载对话框还是代码无法选择对话框?

kayakjiang 回复

不好意思。 应该是“不知道怎样用代码选择对话框”

lyfi2003 回复

另外,刚刚去看了下 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.

baboon 回复

你选择对话框的代码可以贴下吗?

kayakjiang 回复

额……我根本不知道怎么选择这个对话框。 我只是用这个代码把所有能用的方法打印出来看了一下……

p ie.ole_methods
baboon 回复

我手头上没有 pc, 这个下载对话框应该也是浏览器的一部分,你用 ie 浏览器去打开一个能够下载东西的网站,看不能把对话框的 dom 元素找出来

11 楼 已删除
kayakjiang 回复

我一开始也觉得这个对话框应该是浏览器的一部分。不过刚刚看了 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.

我用 watir + chrome

sevk 回复

公司内网……似乎只能用 ie 打开……

baboon 回复

看看 download 请求,然后直接 httpclient 去处理。。。。

pynix 回复

我用 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>
pynix 回复

我试着获取了 post 的表单。

然后试着构造一个类似的散列传到 Net::HTTP.post_form 方法里 不知道是不是那个验证 token 不对,还是返回 422

baboon 回复

查资料吧。

可以试试这个,Mechanize

首先登录,然后使用 download 方法下载

heroyct 回复

哇!!可以了!谢谢你,这个库很好用!!

baboon 关闭了讨论。 05月22日 15:43
需要 登录 后方可回复, 如果你还没有账号请 注册新账号