2017-07-20 10 views
0

.NET以外の場所からDocuWare Platform SDKを使用しようとしています。 DocuWareフォーラムは役に立たず、サポートチケットは私がSDKのサポートのための特定のライセンスを購入していないと言われていました。グレート。その他の使用Internet Explorerの自動化 - 提出するフォームを取得できません

"InternetExplorer.Application" COMオブジェクトを使用してDocuWareログインページへのログインを自動化するので、そのセッションをCookieベースの認証でさらに使用することができます。クッキーの永続性と同じくらい)。

私はウェブページを開き、フィールドに記入することができますが、私が試したことに関係なく送信するフォームを取得することはできません。

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がIEのインスタンスのreadyStateのは、それが正常に動作します。4.されるまで、単にループするルーチンである。)

私はコードが原因loInput.Click()ラインに達して知っている:ここでは、コード(Visual FoxPro)があります私はそれを踏んだ。だから、これは私が知る限り見つからない要素ではありません。

投稿の際には、私もloDocument.Forms(0).Submit()を試しましたが、それでも動作しません。準備が整ったらログインボタンがあると、loInput.Form.Submit()も試しました。まだ運がありません。

私が言ったように、フォーム要素のナビゲーションと塗りつぶしはうまく機能します。私は提出するフォームを得ることができません。

私はInternet Explorer 11を使用しています。IEの最新バージョンでは、この種のことはもはや不可能ですか?どのような他のオートメーションオブジェクトを使用することができ、クッキーを保持することができますか?私は掘り下げることができないServiceConnectionオブジェクトのすべてをラップするので、SDKの.NET実装がどのように機能するかはわかりません。

誰かがアクセスできるウェブページなので、誰かが投稿することができれば、私はどのように聞くことに興味があります!事前に

おかげで、

sutekh137は

UPDATE:

まあ、私はそれ以前のソリューションを見つけることによって、このスレッドに答えた人のおかげで、すでに他の場所で掲載されていた答えを逃したので、 !

なお、私はもはやIEの自動化は必要ありません。私は最終的に基本的なPOSTを使用してDocuWareサーバーにログインする方法を理解しました。クッキー認証を永続的に保つように見えます。さらに、DocuWare Logonリソースには、returnUrlパラメータを使用して、1回の呼び出しで簡単なGETを実行できます。 POSTなどのようにデータを送信する必要がある追加要求については、XMLHTTPリクエストオブジェクトを再度使用するだけで、認証されたままであるように見えます。要約すると

、.NETの外DocuWareプラットフォームSDKを使用するコードは次のようになります。

#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 

(私のサンプルはFoxProであることについて申し訳ありませんが、読んで何が起こっているかを確認するために非常に簡単です

これはDocuWareが提供する.NETラッパーの外でDocuWareのPlatform SDKを使用しようとする人に役立つことを望みます。

答えて

1

の投稿に目を通す:(チェックマーク付き)のほとんどは特に認められた回答
FoxPro Internet Explorer COM Automation: Clicks not working in IE 10 and Later?

+0

ありがとうございました。私の検索では、誰もFoxproを使いこなしていないと仮定していたので、検索条件に "foxpro"を追加できませんでした。しかし、これは特にFoxproの問題です。 click()やsubmit()の呼び出しに偽のパラメータを追加することで、自動化が大きく機能しました。とても有難い! – sutekh137

関連する問題