2009-04-15 22 views
1

watiNでWaitforComplete()を使用していますが、うまく機能していないようです。待つ時間が長くても、次の文を実行します。私はそれが目的のページまたは要素を取得するまで、私のアプリケーションを停止するためにthread.sleep()を使用しています。しかし、ページが非常に動的であるため、指定された時間がかかることがあります。ページ上の要素を待つより良い方法Waitforcomplete()またはsystem.threading.thread.sleep()

より良い解決策。ページをキャッチするものは、動的に戻り、アプリケーション内で次のステートメントを実行しないでください。私は動的にページの復帰を検出する何かをしたいコード

'Show Details page 
    Assert.AreEqual("Confirmation", _internetExplorer.Title) 

    If (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists) Then 
     _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click() 
    Else 
     Assert.Fail("Could not Find Finish Booking Button on Confirmation Page") 
    End If 

    System.Threading.Thread.Sleep(100000) 

「ショー予約概要ページ Assert.AreEqual( "表示予約"、_internetExplorer.Title)

サンプル。いくつかの一定の値を与える代わりに。

答えて

4

WaitForComplete方法はesentiallyブラウザが設定されていたら、それはcomlleteしreadyStateのだとfalseにビジー状態に移行します。

私が一般的にしているのは、必要なものにアクセスしてから、thread.sleepを0.5秒間実行してからもう一度やり直すことです。私はまた、10秒後に終了するグローバルタイムアウトを持っています。

int timeout = 20; 
    bool controlFound = false; 
    for (int i = 0; i < timeout; i++) 
    { 
     if (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists) 
     { 
      _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click(); 
      controlFound = true; 
      break; 
     } 
     else 
     { 
      System.Threading.Thread.Sleep(500); 
     } 
    } 


    if (!controlFound) 
    { 
     Assert.Fail("Control not found"); 
    } 
0

次の文を実行している場合は、対応する要素を見つける必要があります。私はあなたが試みているコードのサンプルを投稿することをお勧めします。

5

WaitForCompleteは、何らかのアクションの後にポストバックがある場合にのみうまく動作します。そうでなければ、待つべき何かを見つけなければなりません。指定されたタイトルを待つ方法についての例を以下に示します。

_internetExplorer.Element("title", "Confirmation").WaitUntilExists(); 

私はいつもcontraintが満たされるまでWaitXXX方法だけ待ってください起こす代わりのThread.sleepのWaitXXXの方法のいずれかを使用することを好むだろう。あなたが指定した時間を睡眠として待つところ。それが長く続くならば、時間はウエストされています。短くすると、問題が発生します。

HTH、 イェルーンは

関連する問題