2010-12-15 75 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, 吉荣

相关问题