#javascript #ajax #vba #xmlhttprequest
Вопрос:
Я бьюсь головой уже неделю, не имея возможности продвинуться вперед, я пытаюсь автоматизировать запрос отчета oralce erpd с помощью xmlhttp, так как мы знаем, что IE скоро будет прекращен, и мне нужно искать альтернативный метод для получения автоматических отчетов от oracle.
я знаю, что у нас есть selenium, который сделает это с помощью vba, но установка его на каждом компьютере пользователя и наша политика организации затрудняют использование основ selenium.
не так хорошо разбираясь в AJAX, я только начал изучать его и двигался в правильном направлении, пока не возникла необходимость нажать кнопку, чтобы активировать скрытую форму.
есть ли какой-либо способ добиться этого с помощью XMLhttp, любая помощь в этом будет высоко оценена.
альтернативные методы, такие как Jscript, работающие с браузером chrome или edge, также будут работать, но они должны быть динамическими и должны иметь возможность передавать параметры в соответствии с пользователем
Dim XMLHTTP As MSXML2.XMLHTTP60, htmldoc As MSHTML.HTMLDocument
Dim htmldiv As MSHTML.IHTMLElement, htmltable As MSHTML.htmltable
Dim htmlelement As MSHTML.HTMLDivElement, htmlelem As IHTMLElementCollection
Dim tabrows As MSHTML.HTMLTableRow, tabcell As MSHTML.HTMLTableCell
Dim URL As String, strCookie As String
Set XMLHTTP = New XMLHTTP60
'visiting homepage
URL = "https://erpprd.ABC_company.com/OA_HTML/OA.jsp?OAFunc=OANEWHOMEPAGE"
XMLHTTP.Open "Get", URL, False
XMLHTTP.send
strCookie = XMLHTTP.getAllResponseHeaders
strCookie = Split(Split(strCookie, "Cookie:")(1), ";")(0)
XMLHTTP.Open "GET", URL, False
XMLHTTP.setRequestHeader "Cookie", Trim(strCookie)
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
XMLHTTP.setRequestHeader "Content-Type", "text/html; charset=UTF-8"
XMLHTTP.setRequestHeader "sec-ch-ua", "Chromium;v=92, Not A;Brand;v=99, Google Chrome;v=92"
XMLHTTP.setRequestHeader "Sec-Fetch-Mode", "navigate"
XMLHTTP.setRequestHeader "Sec-Fetch-Site", "none"
XMLHTTP.setRequestHeader "Sec-Fetch-User", "?1"
XMLHTTP.setRequestHeader "Host", "erpprd.jacobs.com"
XMLHTTP.setRequestHeader "Connection", "keep-alive"
XMLHTTP.setRequestHeader "Accept-Language", "en-US,en;q=0.9"
XMLHTTP.setRequestHeader "Accept", "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
XMLHTTP.send
If XMLHTTP.Status <> 200 Then MsgBox "Oops Failed": Exit Sub
'info of main menu and folder ID details which will be used for getting parameters
URL = "https://erpprd.abc_company.com/OA_HTML/RF.jsp?function_id=MAINMENURESTamp;security_group_id=0"
XMLHTTP.Open "POST", URL, False
XMLHTTP.send
strCookie = XMLHTTP.getAllResponseHeaders
strCookie = Split(Split(strCookie, "Cookie:")(1), ";")(0)
XMLHTTP.Open "POST", URL, False
XMLHTTP.setRequestHeader "Cookie", Trim(strCookie)
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
XMLHTTP.setRequestHeader "Sec-Fetch-Site", "same-origin"
XMLHTTP.setRequestHeader "Sec-Fetch-Mode", "cors"
XMLHTTP.setRequestHeader "Host", "erpprd.abc_company.com"
XMLHTTP.setRequestHeader "Origin", "https://erpprd.abc_company.com"
XMLHTTP.setRequestHeader "Content-Type", "application/xml"
XMLHTTP.setRequestHeader "sec-ch-ua", "Chromium;v=92, Not A;Brand;v=99, Google Chrome;v=92"
XMLHTTP.setRequestHeader "Sec-Fetch-Dest", "empty"
Dim body As String
body = "<params><param>RESPLIST</param>"
body = body "<param>HOMEPAGE</param></params>"
XMLHTTP.send (body)
If XMLHTTP.Status <> 200 Then MsgBox "Oops Failed": Exit Sub
Set htmldoc = New MSHTML.HTMLDocument
'htmldoc.body.innerHTML = XMLHTTP.responseText
'Module1.save_htm XMLHTTP.responseText
''looping thorugh dom document to get the dynamic ID's for sending report request
Dim xDoc As MSXML2.DOMDocument60
Set xDoc = New MSXML2.DOMDocument60
If Not xDoc.LoadXML(XMLHTTP.responseText) Then
Err.Raise xDoc.parseError.ErrorCode, , xDoc.parseError.reason
End If
Dim list As IXMLDOMNodeList
Set list = xDoc.SelectNodes("//RESP")
Dim attr As IXMLDOMAttribute
Dim node As IXMLDOMNode
Dim childNode As IXMLDOMNode
For Each node In list
If (node.HasChildNodes) Then
For Each childNode In node.ChildNodes
Debug.Print childNode.BaseName amp; " " amp; childNode.Text
If childNode.Text = ThisWorkbook.Worksheets(1).Range("A2").Value Then
' if find the GL inquiry for that OU then get its id for future response
Dim resp_nam As String, resp_id As String, appl_id As String, secgrp_id As String, mackey_id As String
resp_nam = node.ChildNodes(0).Text
resp_id = node.ChildNodes(1).Text
appl_id = node.ChildNodes(2).Text
secgrp_id = node.ChildNodes(3).Text
mackey_id = node.ChildNodes(4).Text
GoTo end_process_getting_id
End If
Next childNode
End If
Next node
end_process_getting_id:
'processing request for that particular item selected by user
URL = "https://erpprd.abc_company.com/OA_HTML/RF.jsp?resp_id=" amp; resp_id amp; "amp;resp_appl_id=" amp; appl_id amp; "amp;security_group_id=0amp;lang_code=US"
XMLHTTP.Open "GET", URL, False
XMLHTTP.send
strCookie = XMLHTTP.getAllResponseHeaders
strCookie = Split(Split(strCookie, "Cookie:")(1), ";")(0)
XMLHTTP.Open "GET", URL, False
XMLHTTP.setRequestHeader "Accept", "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
XMLHTTP.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
XMLHTTP.setRequestHeader "Accept-Language", "en-US,en;q=0.9"
XMLHTTP.setRequestHeader "Connection", "keep-alive"
XMLHTTP.setRequestHeader "Cookie", Trim(strCookie)
XMLHTTP.setRequestHeader "Host", "erpprd.abc_company.com"
XMLHTTP.setRequestHeader "Referer", WorksheetFunction.EncodeURL("https://abc_company.com/OA_HTML/OA.jsp?page=/oracle/apps/fnd/framework/navigate/webui/HomePGamp;homePage=Yamp;oapc=2")
XMLHTTP.setRequestHeader "sec-ch-ua", "Chromium;v=93, Not A;Brand;v=99, Google Chrome;v=93"
XMLHTTP.setRequestHeader "sec-ch-ua-mobile", "?0"
XMLHTTP.setRequestHeader "sec-ch-ua-platform", "Windows"
XMLHTTP.setRequestHeader "Sec-Fetch-Dest", "document"
XMLHTTP.setRequestHeader "Sec-Fetch-Mode", "Navigate"
XMLHTTP.setRequestHeader "Sec-Fetch-Site", "same-origin"
XMLHTTP.setRequestHeader "Sec-Fetch-User", "?1"
XMLHTTP.setRequestHeader "Upgrade-Insecure-Requests", "1"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
XMLHTTP.setRequestHeader "Content-Type", "application/xml"
XMLHTTP.send
If XMLHTTP.Status <> 200 Then MsgBox "Oops Failed": Exit Sub
в настоящее время дошло до этой страницы
необходимо заполнить информацию и нажать на кнопку ПЕРЕЙТИ, чтобы сделать форму видимой
после того, как форма станет видимой, необходимо снова отправить этот запрос для отправки отчета. Любая помощь, альтернативные идеи помогут!!!- Спасибо.