2017-07-20 2 views
0

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.

Répondre

1

Regardez sur l'affichage à:
FoxPro Internet Explorer COM Automation: Clicks not working in IE 10 and Later?

Plus particulièrement la réponse acceptée (avec la Coche).

+0

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