自动测试 AJAX Web UI 时使用延迟的替代方法

Alternatives to using delays when automatically testing an AJAX web UI

提问人:Mike Gale 提问时间:9/26/2008 最后编辑:Mike Gale 更新时间:9/29/2008 访问量:1755

问:

我很快将开始开发 AJAX 驱动的网页,这些网页包含从 Web 服务 (WCF) 生成的大量内容。

我过去曾测试过这种东西(发现它很容易),但不是这种级别的动态内容。

我正在使用 Visual Studio 2008 在 .NET 3.5 中进行开发。我设想在以下方面进行此测试:

  1. TestDriven.NET
  2. MBUnit(虽然这不是单元测试)
  3. 某种自动化工具 控制浏览器(也许是 Selenium、 尽管它可能是 SWEA 或 Watin。 我在想IE,Firefox,可能 Opera 和 Safari。

过去,我在测试浏览器时使用过延迟。我不是特别喜欢这样做,这很浪费时间。

有什么经验和做法比使用等待更能把事情做得更好。也许引入回调和函数式编程风格来运行测试?


注意事项 1.查看前 3 条回复后的更多详细信息。

1) 谢谢艾伦、埃兰和马克西达,你们的回复让我走上了得到答案的轨道,希望不要花太多时间。

2)另一个细节,我正在使用jQuery来运行Ajax,所以这不是在AJAX Asp.NET 内置的。

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 样本已经抽象出等待。

3.4) 但是,如 http://watinandmore.blogspot.com/2008/01/using-watin-to-test-select-lists-in.html 所述,WatiN 可能需要对 Ajax 调用更改的值提供额外的支持。在该文章中,该页面被赋予了一个额外的字段,可用于合成更改的事件,如下所示:

// 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是否适合我。

AJAX 测试 函数式编程 回调 浏览器自动化

评论

0赞 Mike Gale 9/26/2008
Withot 知道细节,在我看来,html 元素的 ID 在 Selenium 和 WatiN 示例之间发生了变化,尽管这非常微不足道。
0赞 David White 7/6/2010
那么,迈克,你最终选择了哪一个?

答:

2赞 Alan 9/26/2008 #1

大多数自动化框架都内置了一些同步功能。Selenium 也不例外,它包括 waitForText、waitForElementPresent 等功能。

我刚刚意识到你在上面提到了“等待”,我将其解释为睡眠(这在自动化方面并不好)。如果我误解了,请告诉我,我可以更多地谈论 wait* 函数或替代方案。

0赞 Mark Cidade 9/26/2008 #2

WebAii 有一个 WaitForElement(s) 方法,可用于指定要等待的元素的参数。