我们有一个通过Ajax调用填充的表。在我们的Watin测试中,我们想检查该表的内容。我们已经设法找出填充表的javascript何时停止运行,以便该部分正常工作。 然而,在IE中,填充DOM的javascript完成之时和为Watin完全更新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 :(得分: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);
});
在WatiN方面:
Table table = Browser.Table("myID");
table.OwnTableRow(Find.ByClass("newRow")).WaitUntilExists();
说明:
Find.Any
Find.ByClass
不起作用(我知道它有问题),请使用其他特定约束:Find.ByIndex
,Find.ById
等。答案 1 :(得分:1)
我认为没有这样的事件。如果是的话,WatiN会使用它。但是,当WatiN等待某事时,例如。当您使用WaitUntil
方法时(有时您可以间接使用它,例如在阅读Exists
属性时),WatiN只是在循环中进行Thread.Sleep
调用(请参阅TryFuncUntilTimeOut
类)。
使用WaitUntil
方法几乎可以实现所需的一切,但有时它确实非常棘手。如果我是你,我会尝试使用这种方法(特别是如果你是WatiN的新手),但是如果需要花费太多时间我只会使用Thread.Sleep(500)
并忘掉它。
我想补充一点,如果有可能在示例代码的末尾添加一些用于测试目的的javascript代码,则可以设置某种标记,例如loadingCompleted = 1
,并使用{{ 1}}(我不记得是否有适当的TryFuncUntilTimeOut
方法)等到WaitUntil
设置为1.您当然可以使用WatiN来读取此变量 - 请参阅loadingCompleted
方法
答案 2 :(得分:0)
这是与prostynick建议的答案相同的答案。
为什么不给tbody一个像data-uniqueId这样的属性,并在每次javascript代码的末尾给它一个不同的值。它可能就像当前的日期时间一样简单,只要它与以前的值不同。
现在你有了这个属性和值,你可以在WatiN中使用它:
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);
在第一行中,我们检索data-uniqueId的值。在最后一行中,WatiN等待,直到没有具有此属性的tbody具有该值(因为您的javascript代码更改了data-uniqueId值)。现在我们可以继续了。
HTH, 的Jeroen