私のC#コードではWatin
、Webをナビゲートし、ページにログインするために使用しています。ログインボタンをクリックする必要がありますが、ログアウトしたい直後にログアウトボタンをクリックしますが、ログアウト部分が機能しません。ログイン後にブラウザを閉じる(closeメソッドを使用)ことも試みましたが、うまくいきませんでした。ページが変更されるとすぐに (つまり、ログイン後)、c# からのコマンドが機能しなくなります。
誰が何が悪いのか知っていますか?
別の回答で述べたように、 Thread.Sleep(milliseconds) は、何かがロードされるまで一定期間待機する方法です。実装は非常に簡単ですが、ロード時間が変動するため、最適とは言えません。また、常に十分に長く待機するように長くすると、多くの無駄な時間が発生します。1 つのテストでは、これは大したことではありませんが、たとえば、5 秒間待機する必要があり、1000 個のテストがある場合....などなど.
私が行ったルートは次のとおりです。
私にとっての待機の大きな原因は、ASP.NET での JQuery 非同期呼び出しであり、非同期呼び出しが完了するまで待機するのに適した静的ヘルパー クラスを作成しました。これらは、テストしているサイトが記述されているフレームワークに非常に固有である傾向があります.
watin clickコマンドは、ブラウザがロードされるまで待機するため、実際にはポストバックを待機します。ClickNoWait()コマンドを使用する場合、待機しません。したがって、コードが次のようになっている場合は、次のように機能するはずです。
browser.GoTo("www.your-site.com");
// fill user/pass
browser.Button(Find.ByClass("login-class")).Click();
browser.Button(Find.ByClass("logout-class")).Click();
それでも機能しない場合は、ログイン後にこれを追加できます。browser.WaitForComplete();をクリックします。
Watin では、コードがブロックされていない (コード行を実行し、すぐに続行する) 多くの状況に遭遇するため、そのような場合には、次のページ (アクション、など) はすでに存在します。たとえば、ログイン ページで、そのページに UserName というテキスト ボックスがあるかどうかを確認できます。
<code>
TextField uName = browser.TextField(Find.ByName("userName"));
if(uName.Exists)
{
// Then do the login code....
}
</code>
同様に、コードの実行を続ける前に、ログイン後のページがそこにあることを制御する必要があります。たとえば、「アカウントの詳細」というテキストが含まれていることがわかっているページにログインしている場合は、次のようにします。
<code>
browser.GoTo("http://www.yourdomain.com/login.aspx");
//do your login code
browser.WaitUntilContainsText("Your Account Details", 240); // the second parameter indicates the seconds it will wait before it times out.
// your code to deal with the page after the login.
</code>
Thread.Sleep の使用は混乱のレシピであり、それは確かに問題です。Web ページで適切なタイミングを取得することは決してありません (10 秒かかると思っても、決して戻ってこない可能性があり、その時点でサーバーは開いている接続を終了します)。
それが役に立てば幸い。
スクリプトでThread.sleepを使用して、ログアウトおよびログインと同期します...または、ログアウトする代わりに、アプリケーションを直接閉じて、インスタンスを使用してアプリケーションに再ログインします。