在我的C#代碼中,我使用Watin
來導航網頁,登錄到一個頁面,我需要點擊登錄按鈕,但是當我想要註銷後,所以我有點擊註銷按鈕的權利之後,但註銷部分不起作用。我甚至在登錄後嘗試關閉瀏覽器(使用close方法),但它不起作用。感覺就像一旦頁面被改變(即登錄後),沒有更多的命令來自C#將工作。如何等待Watin的帖子?
有誰知道最新錯誤?
在我的C#代碼中,我使用Watin
來導航網頁,登錄到一個頁面,我需要點擊登錄按鈕,但是當我想要註銷後,所以我有點擊註銷按鈕的權利之後,但註銷部分不起作用。我甚至在登錄後嘗試關閉瀏覽器(使用close方法),但它不起作用。感覺就像一旦頁面被改變(即登錄後),沒有更多的命令來自C#將工作。如何等待Watin的帖子?
有誰知道最新錯誤?
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()後,添加此;
使用的Thread.sleep在你的腳本與註銷同步和登錄... 或 而不是註銷你直接關閉應用程序,並使用IE實例重新登錄到應用
作爲另一個答案線程提及。睡眠(毫秒)是一種等待某個時間段加載的方法。非常非常容易實現,但由於加載時間不同,它不是最優的,而且如果時間足夠長以便它總是等待足夠長的時間,那麼最終會浪費大量時間。在一個測試,這是不是一個大問題,但對於例如,如果你要等待5秒鐘,你有1000個測試....等等等等等等
我已經走了這條路線是:
等待對我來說最大的原因是現在在ASP.NET JQuery的異步調用了一堆,我做了一個靜態輔助類,效果很好讓我等待異步調用完成。這些往往是非常具體的,你正在測試的網站框架(S)
在Watin中,你會遇到許多情況代碼是非阻塞的(你會執行一行代碼,並會立即繼續),因此對於這些情況,您需要找到一種不同的方式來知道下一頁(操作等)已經存在。例如,登錄頁面上,你可以檢查是否是網頁有一個TextBox名爲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>
使用線程。睡眠是一個混亂的祕訣,這是一個肯定的問題,你永遠不會得到正確的時間與網頁(即使你認爲它會需要10秒,它可能永遠不會回來,在這一點上,服務器將終止打開連接)。
希望它有幫助。
Thread.Sleep是簡單的方法,但它不是「正確」的方式。 – OCary
OCary,你說得對,但Thread.Sleep的次數不得不用於像所述的情況。如果網站給出了不可預知的響應時間。 – user2017677
尤其是如果出現不可預知的響應時間,您希望等待什麼花費時間來加載,而不是等待任意長度的時間。我通過等待正確的項目而不是使用sleep()來從測試套件中刪除大量的執行時間。 – OCary