2013-02-02 34 views
2

在我的C#代碼中,我使用Watin來導航網頁,登錄到一個頁面,我需要點擊登錄按鈕,但是當我想要註銷後,所以我有點擊註銷按鈕的權利之後,但註銷部分不起作用。我甚至在登錄後嘗試關閉瀏覽器(使用close方法),但它不起作用。感覺就像一旦頁面被改變(即登錄後),沒有更多的命令來自C#將工作。如何等待Watin的帖子?

有誰知道最新錯誤?

回答

0

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()後,添加此;

-1

使用的Thread.sleep在你的腳本與註銷同步和登錄... 或 而不是註銷你直接關閉應用程序,並使用IE實例重新登錄到應用

+0

Thread.Sleep是簡單的方法,但它不是「正確」的方式。 – OCary

+0

OCary,你說得對,但Thread.Sleep的次數不得不用於像所述的情況。如果網站給出了不可預知的響應時間。 – user2017677

+0

尤其是如果出現不可預知的響應時間,您希望等待什麼花費時間來加載,而不是等待任意長度的時間。我通過等待正確的項目而不是使用sleep()來從測試套件中刪除大量的執行時間。 – OCary

1

作爲另一個答案線程提及。睡眠(毫秒)是一種等待某個時間段加載的方法。非常非常容易實現,但由於加載時間不同,它不是最優的,而且如果時間足夠長以便它總是等待足夠長的時間,那麼最終會浪費大量時間。在一個測試,這是不是一個大問題,但對於例如,如果你要等待5秒鐘,你有1000個測試....等等等等等等

我已經走了這條路線是:

  1. 放入Thread.Sleep()以確定它是否爲「等待」問題。
  2. 如果帶有Sleep()的代碼將被多次使用,找出導致需要睡眠()的原因。
  3. 使用各種Wait ...()方法重構Sleep()。 WaitTilExists,WaitForAttributeEqualsWhatever,WaitForAsyncToFinish < - 不是真正的方法,但華廷內置了

等待對我來說最大的原因是現在在ASP.NET JQuery的異步調用了一堆,我做了一個靜態輔助類,效果很好讓我等待異步調用完成。這些往往是非常具體的,你正在測試的網站框架(S)

0

在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秒,它可能永遠不會回來,在這一點上,服務器將終止打開連接)。

希望它有幫助。