如何使用Selenium测试网页

时间:2012-11-15 16:21:02

标签: selenium phpunit

当我使用PHPUnit隔离并测试应用程序代码时,我们的QA团队一直在使用Selenium测试UI。我听说测试需要10个多小时才能完成,我觉得这个测试太长了。那么我的问题就是如何在处理页面时等待AJAX​​调用。

例如,我们有一个包含大量输入的页面,它将调用AJAX调用以与我们的服务进行通信以显示数据。我们有多个输入,然后在更改时过滤后续选择框。

分区全部加载,区域(属于分区)和商店(属于区域)

Division 1
    +- District 10
        +-  Store 100
        +-  Store 101
        +-  Store 102
    +- District 11
        +-  Store 200
        +-  Store 201
        +-  Store 202
Division 2
    +- District 20
        +-  Store 300
        +-  Store 301
        +-  Store 302
    +- District 21
        +-  Store 150
        +-  Store 151
        +-  Store 2002
...

现在选择框都是最初加载的,因此最终用户可以选择其中任何一个。但是,一旦选择框有一个 选择完成后,AJAX调用根据父选择重新加载其他选择框。 IE:选择Division 2,然后 区域列表仅针对20区和21区(使用对服务的调用)进行过滤,并且商店列表也是过滤器 到这些地区的商店。

如果您跳过选择分区,但选择一个分区,则商店列表会重新过滤到该分区的商店, 再次使用我们在后端的服务。

我的问题是如何知道AJAX调用何时从我们的服务返回,并且选择框已被更改?我们的QA团队正在等待,然后循环选择框以检查所有返回的值是否正确。有没有办法让他们知道何时选择框重新加载,那么他们可以检查内容吗?

显然,我想将大多数这些检查移动到使用Mock对象的PHPUnit测试中来验证我们的服务工作,但我们的QA团队仍然希望验证实际渲染结果是否匹配。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

查明问题“如何等待Ajax通话完成”

在这种情况下有两种不同的方法,并列出了利弊。

方法:1 使用Global变量添加一段代码,该变量指示有多少Ajax调用待处理,因此也可以在selenium文本中访问相同的变量。

$.activeAjaxRequestCount = 0;

$().ajaxSend(function() {
  $.activeAjaxRequestCount++;
  // register lazily to make sure it's the last handler of 
  // ajaxError event and get executed after all production handlers
  if(!$._ajaxErrorHandlerAdded) {
    $().ajaxError(function() {
      $.activeAjaxRequestCount--;
    });
    $._ajaxErrorHandlerAdded = true;
  }
})
.ajaxSuccess(function() {
  $.activeAjaxRequestCount--;
});


/* C# code in selenium tests */

// run this js code somehow before selenium test
// to turn off animation of jQuery
Selenium.executeScript("$.fx.off = true");

private void WaitComplete(Action action, int timeout)
{
  // do default selenium action
  action();
  // wait for active ajax request count becomes zero, 
  // none ajax selenium action will return immediately
  selenium.WaitForCondition("selenium.browserbot.getCurrentWindow();
                             window.jQuery.activeAjaxRequestCount===0;", 
                             timeout.ToString());
}

优点:完全是客户端

缺点:很难确定从单个页面触发的多个ajax调用中完成了哪个ajax调用。因此,在这种方法中......您需要等到所有ajax调用完成,尽管数据可能已经在页面上加载。

参考:https://gist.github.com/111525

方法2:

在此方法中,我们等待ajax调用成功并显示/显示数据。以Selenium方式呈现:我们等待测试的执行,直到特定的HTML实体/数据出现在页面上。

var Waiting = new WebDriverWait(X, TimeSpan.FromSeconds(5));
var Data_Loaded = Waiting.Until(driver => driver.FindElement(By.Id("Divisionxyz")));

优点 :触发多个ajax调用以便在单个页面上获取数据时很简单。

缺点 :加载动态元素/对象时,这将不起作用。

希望这有帮助...所有最好的伙伴:)