我很快将致力于 AJAX 驱动的网页,这些网页具有从 Web 服务 (WCF) 生成的大量内容。
我过去测试过这种东西(并且发现它很容易),但没有这种级别的动态内容。
我正在使用 Visual Studio 2008 在 .NET 3.5 中进行开发。我设想在以下环境中进行此测试:
- 测试驱动.NET
- MBUnit(虽然这不是单元测试)
- 某种控制浏览器的自动化工具(也许是 Selenium,虽然它可能是 SWEA 或 Watin。我在想 IE、Firefox,可能还有 Opera 和 Safari。)
过去我在测试浏览器时使用过延迟。我不是特别喜欢这样做,而且会浪费时间。
有什么经验和实践可以比使用等待做得更好。也许引入回调和函数式编程来运行测试?
注释 1. 查看前 3 个回复后的详细信息。
1) 感谢 Alan、Eran 和 marxidad,您的回复让我走上了获得答案的道路,希望不会花费太多时间。
2) 另一个细节,我使用jQuery来运行 Ajax,所以这不是在 Asp.NET AJAX 中构建的。
3)我发现一篇文章很好地说明了这种情况。它来自http://adamesterline.com/2007/04/23/watin-watir-and-selenium-reviewed/
3.1) Selenium示例(这个和下一个,WatiN,代码示例没有显示在原始网页中(在 IE 或 Firefox 上),所以我已经提取它们并在此处列出它们。)
public void MinAndMaxPriceRestoredWhenOpenedAfterUsingBackButton(){
OpenBrowserTo("welcome/index.rails");
bot.Click("priceDT");
WaitForText("Price Range");
WaitForText("515 N. County Road");
bot.Select("MaxDropDownList", "$5,000,000");
WaitForText("Prewar 8 Off Fifth Avenue");
bot.Select("MinDropDownList", "$2,000,000");
WaitForText("of 86");
bot.Click("link=Prewar 8 Off Fifth Avenue");
WaitForText("Rarely available triple mint restoration");
bot.GoBack();
Thread.Sleep(20000);
bot.Click("priceDT");
WaitForText("Price Range");
Assert.AreEqual("$5,000,000", bot.GetSelectedLabel("MaxDropDownList"));
Assert.AreEqual("$2,000,000", bot.GetSelectedLabel("MinDropDownList"));}
3.2) WatiN样本
public void MinAndMaxPriceRestoredWhenOpenAfterUsingBackButton(){
OpenBrowserTo("welcome/index.rails");
ClickLink("Price");
SelectMaxPrice("$5,000,000");
SelectMinPrice("$2,000,000");
ClickLink("Prewar 8 Off Fifth Avenue");
GoBack();
ClickLink("Price");
Assert.AreEqual("$5,000,000", SelectedMaxPrice());
Assert.AreEqual("$2,000,000", SelectedMinPrice());}
3.3) 如果您查看这些显然等效的示例,您会发现 WatiN 示例已经抽象掉了 waits。
3.4) 然而,WatiN 可能需要额外支持由 Ajax 调用更改的值,如http://watinandmore.blogspot.com/2008/01/using-watin-to-test-select-lists-in.html中所述。在那篇文章中,页面被赋予了一个额外的字段,可用于合成更改的事件,如下所示:
// Wait until the value of the watintoken attribute is changed
ie.SelectList("countries").WaitUntil(!Find.By("watintoken",watintoken));
4)现在我所追求的是一种方法,可以在没有合成事件的情况下执行我们在 WatiN 代码中看到的操作。这可能是一种直接挂钩事件的方法,例如更改的事件。我也不会遇到回调问题,尽管这可能会改变测试的编码方式。我还认为,随着 C# 3、VB 9 和 F# 中的新功能的影响开始深入(并且不介意对此进行探索),我们将看到编写测试的替代方法。
5) marxidad,我的来源没有来自 WebAii 的样本,所以我对这个看起来很有趣的工具没有任何评论。
注释 2. 2008-09-29。经过一些独立于此页面的反馈。
5) 我试图为上面的 WatiN 示例代码获取更完整的源代码。不幸的是,它不再可用,链接已失效。这样做时,我注意到 DSL,大概是在网页和自动化工具之间映射的模型。我没有找到这方面的细节。
6) 对于 WebAii,建议使用这样的代码(未经测试):
public void MinAndMaxPriceRestoredWhenOpenAfterUsingBackButton(){
ActiveBrowser.NavigateTo("welcome/index.rails");
Find.ByContent<HtmlAnchor>("Price").Click();
HtmlSelect maxPrice = Find.ById<HtmlSelect>("MaxDropDownList");
HtmlSelect minPrice = Find.ById<HtmlSelect>("MinDropDownList");
maxPrice.SelectByText("$5,000,000");
minPrice.SelectByText("$2,000,000");
Find.ByContent<HtmlAnchor>("Prewar 8 Off Fifth Avenue").Click();
ActiveBrowser.GoBack();
Find.ByContent<HtmlAnchor>("Price").Click();
maxPrice.AssertSelect().SelectedText("$5,000,000");
minPrice.AssertSelect().SelectedText("$2,000,000");}
6)从代码中我可以清楚地避免等待和延迟,使用一些框架,但我需要花更多的时间来看看 WatiN 是否适合我。