当我使用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团队仍然希望验证实际渲染结果是否匹配。
任何建议都将不胜感激。
答案 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调用以便在单个页面上获取数据时很简单。
缺点 :加载动态元素/对象时,这将不起作用。
希望这有帮助...所有最好的伙伴:)