2012-11-15 51 views
0

虽然我使用PHPUnit隔离和测试应用程序代码,但我们的QA团队一直在使用Selenium测试UI。我听说测试需要10个小时才能完成,我认为这太长了。然后,我的问题真的涉及如何在处理页面时等待AJAX​​调用。如何使用Selenium测试网页

例如,我们有一个有大量输入的页面,它会调用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:选择2区,然后 区域列表仅针对20区和21区(使用呼叫服务)进行过滤,商店列表也将 过滤为仅适用于这些区的商店。

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

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

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

任何建议,将不胜感激。

回答

1

查明的问题:“如何要等到Ajax调用完成”

有在这种情况下2种不同的方法,并会列出与利弊。

做法:1 添加一段代码与指示很多Ajax呼叫如何未决的,因此可以访问相同的变量在硒文本以及一个全局变量。

$.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调用被解雇超过单个页面获取数据。

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

希望这有助于...所有最好的朋友:)

+0

谢谢。我们遇到了元素存在的问题,但想知道它何时载入数据(请考虑选择框,它存在,并且随着之前的选择框发生变化,这个将会发生)。我想测试这个盒子何时被重新加载,它具有基于之前填充的元素的正确内容。由于元素总是存在,.FindElement不起作用,因为它在AJAX调用完成之前就已经存在了。 –

+0

确定好友...很想帮助你...你可以发布一些已经存在的元素的HTML代码,并且在Ajax调用完成后加载数据。 – Anuragh27crony

+0

我将不得不为您编写一些示例代码。我要求我们的QA部门。我们的页面生成,并且相当大。让我从它创建一个样本,并且我可以更新原始问题。谢谢您的帮助。 –