2011-09-01 20 views
1

這種情況是,我有一個頁面使用一些AJAX調用從服務器檢索內容,然後將這些結果放入由另一個腳本生成的html塊中。問題是,我不能用watin選擇這個新HTML片段的任何元素。它可以在瀏覽器中查看,當我點擊F12並掃描代碼時會出現,但WatiN仍然無法看到它。如何讓WatiN掃描動態加載的內容?

這是因爲WatiN只掃描頁面的html源代碼,而不是HTML的當前版本?我想類似的情況應該是:

HTML -

<script type="text/javascript"> 
    $('#foo').html("gak"); 
</script> 
... 
<div id="foo">bar</div> 

然後當我嘗試斷言 -

Assert.IsTrue(browser.Div("foo")).ContainsText("gak")); 

它會返回false。

對此的任何想法?或者是我最好的選擇,只寫一堆jQuery和browser.Eval()嗎?

回答

2

我測試AJAX頁面相當多。關鍵是要等到asnyc回傳完成。如果你有

Assert.IsFalse(browser.Div("foo")).ContainsText("gak"); 
browser_action_that_changes_bar_to_gak 
>> Here you need to wait << 
Assert.IsTrue(browser.Div("foo")).ContainsText("gak"); 

在「等待」部分,你可以做一個System.Threading.Thread.Sleep(numberOfMilliseconds)< - 這是不是最好的方式,但它是非常簡單的。一旦你確定等待是你需要做的,更好的等待方式是輪詢狀態,而不是每次都調用numberOfMilliseconds。我相信不同的AJAX庫做不同的事情,但什麼工作對我來說是真的與此類似:http://pushpontech.blogspot.com/2008/04/ajax-issues-with-watin.html

我把JavaScript插入一個eval()在我的Page基類的輔助功能,而不必像文章那樣將它注入到每個頁面中。

我的基本頁類包含:

public bool IsInAsyncPostBack() 
{ 
    const string isAsyncPostBackScript = "Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()"; 
    return bool.Parse(this.Document.Eval(isAsyncPostBackScript)); 
} 

然後我WaitForAsyncPostback基本相同鏈接的帖子,但我添加了一個最大的等待時間。在去Page類之前(真棒;做!)我在其他地方做了這些靜態函數,它也工作。

2

這幾乎肯定是時間問題。測試時jQuery沒有更新。而不是引入任何人造的停頓或等待,最好等待一些事情來表明你的AJAX已按預期工作。

在這種情況下,最好推遲應該做的工作很好:

Assert.IsTrue(browser.Div("foo")).WaitUntil(c => c.Text.Contains("gak"))); 

這適用於大多數的更新等。另一個常見的等待模式是數據加載,比如說,你將有一個紡車顯示。那麼你可以等到這個輪子消失了,就像這樣:

WaitUntil(c => c.Style.Display == "none");