情况是我有一个页面使用一些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()的最佳选择吗?
答案 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");