有人可以帮助我,或者至少指出我正确的方向。
我正在尝试在VBA中编写一个自动化脚本,该脚本将登录到一个网站并点击该网站上的一些按钮和复选框,然后触发下载。
该网页正在使用ASP.net。
我可以通过使用InternetExplorer.Applicaion对象来实现我想要的,但问题是保存文件,因为我使用API和SendKeys到SaveAs对话框窗口,它工作但非常粗糙,很容易失败,我我真的希望能够自行运行而不会出现任何问题。
理想情况下,我希望能够使用HTTP请求/响应方法,但由于站点身份验证,我已经尝试了几个小时而没有任何成功,我也认为它有一些针对脚本的保护,因为cookie文件具有HttpOnly国旗套。
我要下载的文件是text / csv,输出的数据可以通过http响应标题访问,我可以通过Fiddler看到。
有没有办法从InternetExplorer.Applicaion对象获取HTTP响应头,我一直在查看MS文档,我没有看到任何明显的方法来实现这个目标?
以下是我目前正在使用的代码:
Private Function GetFile() As Scripting.File
On Error Resume Next
Dim objFso As Scripting.FileSystemObject: Set objFso = New Scripting.FileSystemObject
Dim strFileName As String: strFileName = Year(Now()) & Month(Now()) & Day(Now()) & Hour(Now()) & Minute(Now()) & Second(Now()) & ".csv"
Dim strFolder As String: strFolder = objFso.GetAbsolutePathName(Environ("TEMP")) & "\"
Dim strSaveAsFullPath As String: strSaveAsFullPath = strFolder & strFileName
Dim objIE As InternetExplorer: Set objIE = New InternetExplorer
With objIE
.Visible = True
.Navigate2 "WEB URL 1"
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Loop
.Document.getElementById("ctl02_txtUserId").value = "USER"
.Document.getElementById("ctl02_txtPassword").value = "PASS"
.Document.getElementById("ctl02_btnLogon").Click
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Loop
.Navigate2 "WEB URL 2"
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Loop
.Document.getElementById("ddlTables").selectedIndex = 8
.Document.forms(0).submit
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
Loop
.Document.getElementById("gvFields_lnkbtnSelectAll").Click
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Loop
.Document.getElementById("btnRetrieveData").Click
Do Until Not .Busy
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Loop
.Document.getElementById("btnRetrieveData").Focus
'''''''''''&#39 ;''''''''''''& #39;'''''''''''&#39 ;''''''''''''& #39;'''''''' '这就是我使用SENDKEYS下载文件的地方:( '我需要更好的解决方案请??? #&39;'''''''''''&# 39;'''''''''''' #&39;'''''''''''&# 39;'''''''''''' ''''''''
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Application.SendKeys "{TAB}", True
Application.SendKeys "{TAB}", True
Application.SendKeys "{DOWN}", True
Application.SendKeys "{DOWN}", True
Application.SendKeys "a", True
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Application.SendKeys strSaveAsFullPath, True
Application.SendKeys "{TAB}", True
Application.SendKeys "{TAB}", True
Application.SendKeys "{TAB}", True
Application.Wait Now + TimeValue("00:00:01")
DoEvents
Application.SendKeys "s", True
Application.Wait Now + TimeValue("00:00:02")
Application.SendKeys "y", True
'''''''''''&#39 ;''''''''''''& #39;'''''''''''&#39 ;''''''''''''& #39;''''''''
.Quit
End With
Dim objFile As Scripting.File: Set objFile = objFso.GetFile(strSaveAsFullPath)
Set GetTransworldFile = objFile
Set objIE = Nothing
Set objFso = Nothing
结束功能
答案 0 :(得分:0)
我终于弄清楚如何做到这一点,我使用XMLHTTP并设置各种标头伪装成合法的浏览器,然后拉出viewstate和事件验证并使用它来发布各种形式的数据。我很开心,我一天中大部分时间都在努力:)
我不会发布我的代码,因为它有点乱,但如果有其他人遇到这种问题你应该下载并使用Fiddler从浏览器捕获HTTP帖子和响应然后使用你的脚本尝试和模拟浏览器通过设置相同的标题和表单数据,这样做,它应该很容易..