如何让WatiN扫描动态加载的内容?

时间:2011-09-01 21:04:48

标签: testing watin

情况是我有一个页面使用一些AJAX调用从服务器检索内容,然后将这些结果放入另一个脚本生成的一大块html中。问题是,我不能用watin选择这个新的html的任何元素。它可以在浏览器中查看,当我点击F12并扫描代码时出现,但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 个答案:

答案 0 :(得分: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)&lt; - 这是不是最好的方式,但它非常简单。一旦确定等待是您需要做的,更好的等待方法是轮询状态而不是每次 numberOfMilliseconds 。我相信不同的AJAX库以不同的方式做事,但对我有用的是真的类似于:http://pushpontech.blogspot.com/2008/04/ajax-issues-with-watin.html

我将JavaScript放在我的基本Page类中的辅助函数中的Eval()中,而不是像文章那样将它注入到每个页面中。

我的基页类包含:

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

然后我的WaitForAsyncPostback与链接帖子基本相同,但我添加了最长等待时间。在进入Page类之前(很棒;做到了!)我在其他地方创建了这些静态函数,它也有效。

答案 1 :(得分:2)

这几乎肯定是时间问题。测试时jQuery没有更新。而不是引入任何人工暂停或等待最好等待某些东西来表明你的AJAX已按预期工作。

在这种情况下, WaitUntil 可以很好地完成工作:

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

这适用于大多数更新等。另一种常见的等待模式是数据加载,例如,你有一个旋转轮显示。然后你可以等到这个轮子消失了,如:

WaitUntil(c => c.Style.Display == "none");
相关问题