Javascript:DOM操作完成时的事件

时间:2010-12-15 11:10:02

标签: javascript watin

我们有一个通过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);
});

3 个答案:

答案 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.ByIndexFind.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