2012-03-21 2 views
0

JavaコードからアプリケーションのブラウザDOMを取得しようとしています。 対象はWebアプリケーションをWebブラウザで表示することです。ユーザーはフィールドを入力するか、アプリケーションをナビゲートするための操作を行います。 Webアプリケーションがナビゲートする各ページのブラウザDOMをキャプチャするスタンドアロンのJavaコードがあります。 HtmlUnitはヘッドレスなので、HtmlUnitを使用してDOMとSelenium WebDriverをキャプチャしてWebアプリケーションをレンダリングしています。Javaコードでブラウザ上のユーザーアクションをキャプチャするにはどうすればよいですか?

問題は、私は、私がアプリケーションの新しいページの午前かどうかを追跡することはできませんよです。 HtmlPageオブジェクトが変更されないため、HtmlPage page = webClient.getCurrentWindow()。getEnclosedPage()は機能しません。

私はDomChangeListenerを実装しようとしているが、データ集団はすなわちJavaコードの外で、手作業で行われている場合には、何のDomChangeEventが存在しないようです。内容を入力してコードからページを送信すると、DomChangeListenerが機能します。しかし、それは私が望むものではありません。

どのような提案、これを達成するには?これに便利な他のAPIはありますか?

よろしく

答えて

0

は残念ながら、私はHtmlUnitまたはセレンwebdriverを精通していないですので、この答えは、あなたにとって有用ではないかもしれません。しかし、一般に、この種のことは比較的容易に達成できます。ブラウザ側で

は、あなたがキャプチャする必要があるユーザーの入力があり、いつでもイベントハンドラを実装します。これらのイベントハンドラは、サーバ上でキャプチャする必要のあるデータをWebサーバにAjaxコールで送信します。データがすべて複雑な場合は、Jsonを使用してデータをオブジェクトとして渡すことをお勧めします。いくつかの標準Javascriptのストリンジェライザがあります( https://github.com/douglascrockford/JSON-jsを参照)。Java側では、json文字列をJavaオブジェクトに変換するツールがあります( http://code.google.com/p/google-gson/参照)。あなたはまた、より多くの選択肢のためにここに行くことができます。サーバー側で http://www.json.org/

、Javaコードは、単にのJSPやサーブレットに存在します。それはデータを処理する。データが一時的な場合は、セッション(javax.servlet.http.HttpSession)を使用してメモリに残すことができます。永続的な場合は、データベースまたはデータファイルに書き込むことができます。一般的に

、私は多くの場合、それが役に立つ自分自身をthiingではなく、ソフトウェアパッケージを使用して、この種のを実装するために見つけます。私のソリューションは通常、デバッグやメンテナンスがはるかに簡単で簡単です。お役に立てれば。

1

セレン/ webdriverを持つ簡単な作業ではありません。私は非常に似たようなことをして、それを働かせました(私はすぐにそれをリリースします)。基本は、JavaScriptイベントハンドラとJavaからのデータのポーリングです。

はJavaScript:

var events = []; 
var eventQueue = []; 
var eventHistory = {}; 
var processing = false; 

var nativeEvents = { 
    'submit': 'HTMLEvents', 
    'keypress': 'KeyEvents', 
    'click': 'MouseEvents', 
    'dblclick': 'MouseEvents', 
    'dragstart': 'MouseEvents', 
    'dragend': 'MouseEvents', 
} 

for(var eventName in nativeEvents) { 
    document.addEventListener(eventName, processEvent, true); 
}; 

processEvent = function(event) { 
    if(event.triggeredManually) { 
     return true; 
    } 
    if(event.type in nativeEvents) { 
     storeEvent(event); 
     event.stopPropagation(); 
     event.preventDefault(); 
     return false; 
    } 
} 
storeEvent = function(event) { 
    ev = convertEvent(event); 
    if(processing) { 
     eventQueue.push(ev); 
    } else { 
     events.push(ev); 
    } 
} 

convertEvent = function(event) { 
    var ev = {}; 
    var id = new Date().getTime() + ":" + Math.random(); 
    ev['id'] = id; 
    ev['type'] = event.type; 
    ev['target'] = event.target; 
    ev['button'] = event.button; 
    ev['charCode'] = event.charCode; 
    ev['keyCode'] = event.keyCode; 
    ev['altKey'] = event.altKey; 
    ev['ctrlKey'] = event.ctrlKey; 
    ev['shiftKey'] = event.shiftKey; 
    ev['clientX'] = event.clientX; 
    ev['clientY'] = event.clientY; 
    ev['offsetX'] = event.offsetX; 
    ev['offsetY'] = event.offsetY; 
    eventHistory[id] = ev; 
    return ev; 
} 

これらの機能は、ユーザーイベントを検出して保存するためのものです。 Javaでイベントを取得し、その後イベントをトリプルするには、以下のものが必要です。 unloadイベントがすべてのブラウザで安全に動作していないため、ページのアンロードにはこれが必要です。

getEvents = function() { 
    processing = true; 
    events = events.concat(eventQueue); 
    eventQueue = []; 
    setTimeout(resetEvents, 10); 
    return events; 
}; 

resetEvents = function() { 
    events = []; 
    processing = false; 
}; 

triggerEvents = function(idsAsJson) { 
    // trigger pending events 
    var ids = JSON.parse(idsAsJson); 
    for (var i = 0; i < ids.length; i++) { 
     var event = eventHistory[ids[i]]; 
     if(event) { 
      var evObj = null; 
      var evObjType = null; 
      var bubbling = true; 
      var cancelable = false; 

      if(event['type'] in nativeEvents) { 
       evObjType = nativeEvents[event['type']]; 
       evObj = document.createEvent(evObjType); 

       // more info: http://www.howtocreate.co.uk/tutorials/javascript/domevents 
       if(evObjType == 'KeyEvents') { 
        evObj.initKeyEvent(event['type'], bubbling, cancelable, window, event['ctrlKey'], event['altKey'], event['shiftKey'], false, event['keyCode'], event['charCode']); 
       } else if(evObjType == 'MouseEvents') { 
        evObj.initMouseEvent(event['type'], bubbling, cancelable, window, 1, event['offsetX'], event['offsetY'], event['clientX'], event['clientY'], event['ctrlKey'], event['altKey'], event['shiftKey'], false, event['button'], null); 
       } else { 
        evObj.initEvent(event['type'], bubbling, cancelable); 
       } 
       evObj.triggeredManually = true; 
       event['target'].dispatchEvent(evObj); 
      } 
     } 
    } 

}; 

は、その後、あなたはgetEvents()機能をループするJavaコードを必要とし、あなたが必要なものを保存することができます。その後、ユーザインタラクションを処理するには、triggerEvents()関数を実行する必要があります。

+0

あなたがキャプチャし、保存し、triggger /ブラウザ上で、これらの保存されたイベントを再生することができています、私は同じのためにあなたの調査結果や提案をお聞かせください。私はそれに非常に感謝しています。どうもありがとう。 – SmartSolution

+0

まだ準備ができていません。 Github:['Abmash'](https://github.com/alp82/abmash)で開発状況に従うことができます。録音/トリガー/リプレイアプリケーションは「Abmash Recorder」としてリリースされます。あなたがしたい場合は、私は電子メールで私に連絡することができます(私のGithubページを参照してください) – Alp

関連する問題