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