0

C#アプリケーション内から非表示のブラウザーを使用してページに移動し、リンクをクリックして、クリックが機能したことを確認しようとしています。フロー:-「http:// mypage」に移動します-リンクをクリックすると、リンクHTMLコードは(ComponentArt CallBackを呼び出します):

<div id="ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd" onclick="colleagueCallback.callback('SOMENAME'); return false;">

同僚を追加します-クリックが結果を取得してページを更新するのを待ちます-クリックが機能したことを確認します

私の問題:WebBroser.Print()を呼び出さない限り、クリックは完全には完了していないようです(これは必要ありません。クリック後に何が起こっているかを理解するために何百万もの方法を試しただけで、Printだけがクリックを行っています完了)。

コードは完全に正常に機能し、ナビゲートは機能し、探しているタグを見つけることができ、クリックイベントが発生しています(中間の変更があります)が、WebBrowserのみを使用していることが判明したため、コールバックは完了しません.Print()、他のすべてのWebBrowser.Invalidate()、WebBrowser.Update()、WebBrowser.DocumentStream.Flush()、またはWebBroser.ResumeLayout()は、ページ内のASPコールバックを終了しません...:

tempIE = new WebBrowser();
tempIE.Navigate( "http:// mypage");
while(tempIE.ReadyState!= WebBrowserReadyState.Complete)
{{
      Application.DoEvents();
}
tempIE.AllowNavigation = true;
HtmlElement addDivTag = tempIE.Document.GetElementById( "ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd");
if(addDivTag == null)
    throw(new Exception( "Session.FollowPerson:Addタグが見つかりませんでした"));
if(addDivTag.FirstChild == null)
    throw(new Exception( "Session.FollowPerson:追加リンクが見つかりませんでした"));
addDivTag.FirstChild.InvokeMember( "click");
while(tempIE.ReadyState!= WebBrowserReadyState.Complete)
{{
    Application.DoEvents();
}

この後、タグの1つがComponentArtサーバーのCallBackによって変更されたかどうかを確認していますが、中間タグのみを取得しています。私が監視している変更は次のとおりです。

<a href="javascript:void(0)">Add colleague</a>

中間を(コールバックで追加ロジックを作成している間)に変更します:

<img src="/images/loading.gif">

最終的には次のように変更する必要があります。

<br>Is your colleague</br>

ページがコールバックを完全に完了するようにするWebBroser.Print()でどのようなexacltyが行われているのか誰もが知っていますか?

4

1 に答える 1

0

WebBrowserは別のスレッドで機能すると思います。したがって、Printは、WaitXXXタイプの関数(GUIスレッドにイベントを待機させながらメッセージポンプを実行し続けることができる)のようなスレッド同期メカニズムを使用します。

DoEventsは、スレッドに実行の機会を与えていない可能性があります(シングルプロセッサCPUを使用していますか?)。Thread.Sleep(200)を挿入して、動作が変わるかどうかを確認してください。もしそうなら、WaitXXX関数の1つに変更することを検討してください(私が考えているものを調べて、編集を投稿します)。

編集 それらはMsgWaitXXX関数であり、それらを使用することを選択した場合は、それらをP/Invokeする必要があります。

WebBrowser.Navigatedイベントをフックすることをお勧めします。ロジックを2つの部分に分割します。最初の部分はNavigateを呼び出し、UIに何かを待機しているというフラグを立て、2番目の部分はイベントが発生したときにNavigateedハンドラーで実行されます。

于 2010-11-09T15:36:03.307 に答える