J'essaie d'utiliser le SDK DocuWare Platform depuis un autre endroit que .NET (où il fonctionne à merveille). Le forum DocuWare n'a été d'aucune aide, et un ticket de support a été rencontré lorsque j'ai été informé que nous n'avions pas acheté de licence spécifique pour le support du SDK. Donc, j'utilise l'objet COM "InternetExplorer.Application" pour automatiser la connexion à la page de connexion de DocuWare afin de pouvoir ensuite utiliser cette session avec l'authentification basée sur les cookies (rien d'autre ne peut fonctionner comme loin de la persistance des cookies).Internet Explorer automation - Impossible d'envoyer le formulaire
Je peux afficher la page Web et remplir les champs, mais je n'arrive pas à soumettre le formulaire, peu importe ce que j'essaie. Voici le code (Visual Foxpro):
lcURL = "https://docuware-online.com/DocuWare/Platform/Account/Logon?returnUrl=/DocuWare/Platform/Home/XSL"
loIE = CREATEOBJECT("InternetExplorer.Application")
loIE.Navigate(lcURL)
WaitForIE(loIE)
loDocument = loIE.Document
loDocument.getElementById("UserName").Value = "user"
loDocument.getElementById("Password").Value = "password"
loDocument.getElementById("Organization").Value = "My Organization"
loDocument.getElementById("RememberMe").Checked = .T.
loInputs = loDocument.getElementsByTagName("input")
FOR EACH loInput IN loInputs
IF UPPER(ALLTRIM(loInput.Value)) == "LOG ON"
loInput.Click()
ENDIF
ENDFOR
WaitForIE(loIE)
loIE.Visible = .T.
(WaitForIE est une routine qui boucle simplement jusqu'à ce que le ReadyState de l'instance IE 4. Il fonctionne très bien.)
Je sais que le code atteint la ligne loInput.Click()
parce que Je l'ai traversé. Donc, il ne s'agit pas d'un élément qui n'a pas été trouvé pour autant que je sache.
Pour la soumission, j'ai également essayé loDocument.Forms(0).Submit()
, mais cela ne fonctionne pas non plus. Et quand j'ai le bouton de connexion au prêt, j'ai également essayé loInput.Form.Submit()
. Toujours pas de chance.
Comme je l'ai dit, la navigation et le remplissage des éléments de formulaire fonctionnent correctement. Je n'arrive tout simplement pas à soumettre le formulaire. J'utilise Internet Explorer 11. Est-ce que ce genre de chose n'est tout simplement plus possible avec la dernière version d'Internet Explorer? Quel autre objet d'automatisation puis-je utiliser et conserver les cookies restent persistants pour ma session? Je ne sais pas comment fonctionne l'implémentation .NET du SDK car il enveloppe tout dans un objet ServiceConnection
dans lequel je ne peux pas creuser.
La page Web en question est accessible à tous, donc si quelqu'un peut obtenir la chose à soumettre, je serais intéressé à entendre comment!
Merci à l'avance,
sutekh137
MISE À JOUR:
Eh bien, j'ai raté la réponse qui avait déjà été écrit ailleurs, donc merci à la personne qui a répondu à ce sujet en concluant que la solution précédente ! Par ailleurs, je n'ai plus besoin d'automatisation IE. J'ai finalement compris comment utiliser un POST de base pour se connecter au serveur DocuWare, et il semble maintenir l'authentification des cookies persistante. En outre, la ressource DocuWare Logon
peut prendre un paramètre returnUrl
qui permet d'effectuer des tâches GET simples en un seul appel. Pour toute demande supplémentaire nécessitant l'envoi de données (comme un POST), il suffit d'utiliser à nouveau l'objet request XMLHTTP et il semble rester authentifié.
En résumé, le code à utiliser l'extérieur de .NET ressemble à la plate-forme DocuWare SDK ceci:
#DEFINE DW_ORG "<org name>"
#DEFINE DW_ORG_ID "<ord ID>"
#DEFINE DW_SERVER "<DocuWare server name/IP>"
#DEFINE DW_USERNAME "username"
#DEFINE DW_PASSWORD "password"
#DEFINE DW_PROTOCOL "http"
#DEFINE DW_INTEGRATION_ENTRY_POINT DW_PROTOCOL + "://" + DW_SERVER + "/DocuWare/Platform/WebClient/" + DW_ORG_ID + "/Integration"
#DEFINE DW_SDK_ENTRY_POINT DW_PROTOCOL + "://" + DW_SERVER + "/DocuWare/Platform"
FUNCTION DWSDKSendAndReturnRequest
LPARAMETERS pcSDKResource, pcRequestType, pcRequestData, plDontUseWindowsAuth, pcError
IF (VARTYPE(pcSDKResource) == "C") AND (NOT EMPTY(ALLTRIM(pcSDKResource)))
pcSDKResource = ALLTRIM(pcSDKResource)
ELSE
* If there is no resource to run, then we cannot proceed.
pcError = "No DocuWare SDK resource provided."
RETURN .NULL.
ENDIF
IF (VARTYPE(pcRequestType) == "C") AND (NOT EMPTY(ALLTRIM(pcRequestType)))
pcRequestType = UPPER(ALLTRIM(pcRequestType))
ELSE
* Default request type is a "GET".
pcRequestType = "GET"
ENDIF
IF (VARTYPE(pcRequestData) == "C") AND (NOT EMPTY(ALLTRIM(pcRequestData)))
pcRequestData = UPPER(ALLTRIM(pcRequestData))
ELSE
* Default data to send in a request is just an empty string.
pcRequestData = ""
ENDIF
* Our output variable for any error text should start out empty.
pcError = ""
* We can tidy up the resource parameter if the user has taken some shortcuts with what they passed in...
IF (LEFT(pcSDKResource, 1) <> "/")
* SDK Resource should always start with a slash.
pcSDKResource = "/" + pcSDKResource
ENDIF
IF (UPPER(LEFT(pcSDKResource, 18)) <> "/DOCUWARE/PLATFORM")
* Resource should always start with proper DocuWare platform location.
pcSDKResource = "/DocuWare/Platform" + pcSDKResource
ENDIF
LOCAL llAllInOneRequest, lcLogonVerb, loRequest, lcLoginURL, lcRequestURL, loErr
IF plDontUseWindowsAuth
lcLogonVerb = "Logon"
ELSE
lcLogonVerb = "LogonNTLM"
ENDIF
lcLoginData = "Organization=" + DW_ORG + "&UserName=" + DW_USERNAME + "&Password=" + DW_PASSWORD
lcLoginURL = DW_SDK_ENTRY_POINT + "/Account/" + lcLogonVerb
IF (pcRequestType == "GET")
* For a GET, we can call the resource request right inline wit hthe authentication request
* by utilizing the the "returnUrl" parameter in our login POST.
llAllInOneRequest = .T.
lcLoginURL = lcLoginURL + "?returnUrl=" + pcSDKResource
ELSE
llAllInOneRequest = .F.
ENDIF
TRY
loRequest = CREATEOBJECT("MSXML2.ServerXMLHTTP")
loRequest.Open("POST", lcLoginURL)
* The following line is critical for successful authentication via the POST.
loRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
loRequest.Send(lcLoginData)
* If our request type is NOT a "GET", then we should run the resource request
* as a second request because our Logon call was not "all in one".
IF (NOT llAllInOneRequest)
* We need to make our resource name into a full URL.
lcRequestURL = DW_PROTOCOL + "://" + DW_SERVER + pcSDKResource
loRequest.Open(pcRequestType, lcRequestURL)
loRequest.Send(pcRequestData)
ENDIF
CATCH TO loErr
SET CONSOLE OFF
pcError = loErr.Message
loRequest = .NULL.
ENDTRY
RETURN loRequest
ENDFUNC
(Désolé de mon échantillon étant en Foxpro, mais il est assez facile à lire et à voir ce qui se passe on.)
Espérons que cela aide tous ceux qui essaient d'utiliser le Kit de développement Platform SDK de DocuWare en dehors des encapsuleurs .NET fournis par DocuWare.
Merci beaucoup. Dans toutes mes recherches, je n'ai pas réussi à ajouter "foxpro" aux termes de recherche parce que je supposais que plus personne ne tripotait avec Foxpro. Mais il s'avère que c'est un problème Foxpro, en particulier! En ajoutant un paramètre bidon aux appels click() et/ou submit(), l'automatisation a bien fonctionné. Très appréciée! – sutekh137