2010-12-15 90 views
1

我們有一個通過Ajax調用進行填充的表。在我們的Watin測試中,我們想檢查這張表的內容。我們已經設法找出填充表的JavaScript何時停止運行,以便部分工作正常。 然而,在IE瀏覽器中,似乎在填充DOM的JavaScript完成和DOM完全更新Watin以檢測更改之間存在延遲。Javascript:DOM處理完成時的事件

現在我們有一個Thread.Sleep(500)使這項工作,但我不喜歡這個。是否有事件或什麼東西趕上DOM完全更新的時刻?

編輯:示例代碼

var tbody = $("#myID tbody"); 
tbody.empty(); 
$.each(item.Producten, function (i, item) { 
    var row = "<tr><td>" + item.Property + "</td></tr>"; 
    tbody.append(row); 
}); 
+0

你能包括一些示例代碼來說明你是如何加入JavaScript中的新內容? – 2010-12-15 11:36:34

回答

1

我不認爲有這樣一個事件。如果是這樣,WatiN會使用它。但是當WatiN等待某件事時,例如。當您使用WaitUntil方法時(有時您可以間接使用它,例如在閱讀Exists屬性時),WatiN只是在循環中調用Thread.Sleep調用(請參閱TryFuncUntilTimeOut類)。

幾乎所有你需要的東西都可以通過使用WaitUntil方法來實現,但有時候它確實很棘手。如果我是你,我會嘗試更多這種方法(尤其是如果你是WatiN的新手),但是如果需要太多時間,我只會使用Thread.Sleep(500)而忘了它。

我想補充一點,如果有可能爲測試目的添加一些javascript代碼到您的示例代碼的末尾,您可以設置某種標誌,如loadingCompleted = 1,並使用TryFuncUntilTimeOut(我可以'請記住是否有適當的WaitUntil方法)等到loadingCompleted設置爲1.您當然可以使用WatiN來讀取此變量 - 請參閱Document.Eval方法。

+0

好的建議,但可悲的是,他們都沒有工作。必須使用'Thread.Sleep(2500)'... – Lodewijk 2010-12-20 11:47:48

1

你嘗試的方法.WaitUntilExist

編輯:添加代碼示例

在你的JS,你可以添加一個類:

var tbody = $("#myID tbody"); 
tbody.empty(); 
$.each(item.Producten, function (i, item) { 
    var row = "<tr class='newRow'><td>" + item.Property + "</td></tr>"; 
    tbody.append(row); 
}); 

在華廷方:

Table table = Browser.Table("myID"); 
table.OwnTableRow(Find.ByClass("newRow")).WaitUntilExists(); 

備註:

  • 如果您表是空的,您可以使用Find.Any在約束
  • 如果Find.ByClass不工作(我知道它有一些問題),使用其他特定約束:Find.ByIndexFind.ById
+0

可悲的是,不,因爲我們向tablebody添加行(請參閱代碼添加到問題中) – Lodewijk 2010-12-15 12:58:40

+0

我添加了一些代碼,您可以嘗試 – 2010-12-15 13:18:46

+0

想到了這一點,但表中總是有行。我沒有看到新行是否已經添加到表中。我正在尋找的是來自客戶端的一些事件,我可以聽到,表示IE已經完成更新dom – Lodewijk 2010-12-15 15:52:33

0

這是一個與prostynick建議相同的答案。

爲什麼不給tbody一個像data-uniqueId這樣的屬性,並且每次在javascript代碼的末尾都給出一個不同的值。它可能與當前日期時間一樣簡單,只要它與以前的值不同即可。

既然你有這樣的屬性和值,你可以使用,在華廷:

var currentUniqueId = browser.Table("myID").TableBody.GetAttributeValue("data-uniqueId"); 
.... do something to trigger the AJAX call 

browser.Table("myID").TableBody.WaitUntil(!Find.By("data-uniqueId", currentUniqueId); 

在第一行中,我們檢索數據UNIQUEID值。 WatiN在最後一行中等待,直到沒有該屬性具有該值的tbody(因爲data-uniqueId值已由您的javascript代碼更改)。現在我們可以繼續。

HTH, 吉榮

相關問題