0

当我使用 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,然后仅筛选 District 20 和 21 的 District 列表(使用对服务的调用),并且商店列表也筛选为仅针对这些地区的商店。

如果您跳过选择部门,而是选择一个地区,那么商店列表将被重新过滤为该地区的商店,再次使用我们在后端的服务。

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

显然,我想将这些检查中的大部分移动到带有 Mock 对象的 PHPUnit 测试中,以验证我们的服务是否正常工作,但我们的 QA 团队仍然希望验证实际呈现的结果是否匹配。

任何建议,将不胜感激。

4

1 回答 1

1

指出问题“如何等到 Ajax 调用完成”

在这种情况下有 2 种不同的方法,并将列出优缺点。

方法: 1 添加一段带有全局变量的代码,该变量指示有多少 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

方法二:

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

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

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

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

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

于 2012-11-20T11:27:23.927 回答