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

时间:2020-03-06 14:45:32  来源:igfitidea点击:

我将很快在AJAX驱动的网页上工作,这些网页具有许多从Web Service(WCF)生成的内容。

我过去已经测试过这种事情(发现很简单),但是没有这种动态内容。

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

  • TestDriven.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 Sample(此示例以及下一个WatiN代码示例未显示在原始网页上(在IE或者Firefox上),因此我将其提取并在此处列出。)

public void MinAndMaxPriceRestoredWhenOpenedAfterUsingBackButton(){
  OpenBrowserTo("welcome/index.rails");
  bot.Click("priceDT");
  WaitForText("Price Range");
  WaitForText("515 N. County Road");
  bot.Select("MaxDropDownList", ",000,000");
  WaitForText("Prewar 8 Off Fifth Avenue");
  bot.Select("MinDropDownList", ",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(",000,000", bot.GetSelectedLabel("MaxDropDownList"));
  Assert.AreEqual(",000,000", bot.GetSelectedLabel("MinDropDownList"));}

3.2)WatiN样本

public void MinAndMaxPriceRestoredWhenOpenAfterUsingBackButton(){
  OpenBrowserTo("welcome/index.rails");
  ClickLink("Price");
  SelectMaxPrice(",000,000");
  SelectMinPrice(",000,000");
  ClickLink("Prewar 8 Off Fifth Avenue");
  GoBack();
  ClickLink("Price");
  Assert.AreEqual(",000,000", SelectedMaxPrice());
  Assert.AreEqual(",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代码中所见内容的方法。这可能是直接挂接到事件(例如更改后的事件)的一种方法。我也不会在回调中遇到问题,尽管这可能会改变测试的编码方式。我还认为,我们将看到编写测试的替代方法,这些都是C3,VB 9和Fstart中新功能的隐含意义(并且不介意对此进行探讨)。

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(",000,000"); 
  minPrice.SelectByText(",000,000");
  Find.ByContent<HtmlAnchor>("Prewar 8 Off Fifth Avenue").Click(); 
  ActiveBrowser.GoBack();
  Find.ByContent<HtmlAnchor>("Price").Click(); 
  maxPrice.AssertSelect().SelectedText(",000,000"); 
  minPrice.AssertSelect().SelectedText(",000,000");}

6)从代码中,我可以明显避免使用某些框架的等待和延迟,但是我将需要花费更多的时间来查看WatiN是否适合我。

解决方案

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

我刚刚意识到我们在上面提到了"等待",我将其解释为"睡眠"(在自动化方面不佳)。如果我误解了,请告诉我,我可以进一步谈谈wait *函数或者替代方法。

WebAii具有WaitForElement(s)方法,可让我们指定要等待的元素的参数。