上周末参加了Qclub的百度技术沙龙,听了百度的孙景卫讲了Web自动化测试,讲的非常好,然后在小组讨论时又有幸座在了一起。我们讨论的一个内容,就是Ajax应用程序比原来的非Ajax程序更不易测试,这里有两个主要原因。

第一:Ajax使得基于纯录制的方式无法工作,因为录制一个操作,这次返回需要5秒钟,下次会更多或更少。

第二:一些测试工具是基于原来非Ajax程序来开发的,后面没做对应的升级。

但是,同样有很多工具支持Ajax的测试,今天我们就来看一下大名鼎鼎的Selenium如何测试Ajax程序。

准备Ajax程序

这里我们使用ASP.NET MVC,实际上你可以使用任何程序来模拟一个AJAX调用。

a. 准备一个页面,这里我们使用了JQuery.

 <input id="GetContent" value="Get" type="button" onclick="GetAjaxContent();" />
 <div id="results" style="border:solid 1px red; display:none;">
 </div>
 <script type="text/javascript">
        function GetAjaxContent() {
            $.ajax({
                url: "Home/GetAjaxContent",success: function (html) {
                    $("#results").show().append(html);
                }
            });        
        }
</script>

b. 准备后台程序,把下面的代码加入HomeController.

public ContentResult GetAjaxContent()
{
   Thread.Sleep(9000);
   return new ContentResult { Content = "Hello World" };
}
c. 效果 当我们点击Get时,页面出现Hello World。

使用Selenium进行Ajax测试

如果你没用个Selenium,请参考我的这篇文章Web测试:Selenium使用

如果我们点击Get按钮后,直接判断页面是否返回”Hello World”时,这样会出错,因为现在还没有立即返回。

这时我们就需要使用Selenium的WaitForCondition方法,这个方法会不停的去判断一个javascript表达式是否是true. 知道返回true时才继续执行。

我们可以看到,我们需要写js表达式,如果我们需要判断的很复杂,那么些表达式也是一件很麻烦的事,同时这个方法经过我的使用,它对IE的支持不好。那么有没有更好的方法呢?

更好的方法判断Ajax调用是否结束

事实上我们测试Ajax程序最大的麻烦,就是想上面一样来判断Ajax调用是否结束,上面我们是判断页面中如果出现”Hello World”,证明Ajax已经结束了,那么什么是更好的方法呢,我们经常使用的javascript的类库是JQuery,如何判断JQuery的Ajax调用已经结束了呢?

经过研究发现当没有ajax调用时,Jquery.active=0.

所以,我们可以使用这个万能的表达式判断Ajax是否返回。

selenium.WaitForCondition("selenium.browserbot.getCurrentwindow().jQuery.active == 0","50000");

是不是整个世界清静多了 下面我收集了判断其它类库的Ajax活动状态

jQuery: “jQuery.active”

Prototype: “Ajax.activeRequestCount”

Dojo: “dojo.io.XMLHTTPTransport.inFlight.length”

ASP.NET AJAX:

Javascript:

function isInAsyncPostBack() {
instance = Sys.WebForms.PageRequestManager.getInstance();

return instance.get_isInAsyncPostBack();
}

C#

selenium.WaitForCondition(“!selenium.browserbot.getCurrentwindow().isInAsyncPostBack()”,“1000″);

Selenium测试Ajax程序的更多相关文章

  1. 适用于iOS和Android设备的自动验收测试

    我正在开展一个网络项目,很明显,进行一些Selenium类型的自动验收测试会非常有帮助.但该项目是移动/手持设备的网站,而非Selenium支持的桌面浏览器.谷歌搜索一下,发现iOS为Frank,Android为Robotium.这些是使用的两种工具吗?或者有什么好的或更好的东西可能允许我使用Android和iOS的一个工具?不确定这对于移动设备上的Web测试有何用处.

  2. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  3. Swift 不完全函数第 1 部分:如何避免

    实际上,预处理并避免不完全函数能够让我们的程序无论在如何情况下都能可靠地运行。Swift有一个函数precondition就是用来干这个的:测试条件是否满足,并在不满足的情况下触发一个致命错误。事实上在Swift标准库中,几乎每个Swift程序都在间接地使用这种方式,包括了各种和precodition函数类似的断言。不完全函数前置条件会让函数中的某个参数的取值范围缩小为函数签名中指明的范围的一部分。在不完全函数中,已定义的输入值的子集称作已定义域。

  4. 如何在android上使用selenium或appium自动化Chrome浏览器?

    我想在Android设备上自动化AndroidChrome浏览器(不只是webview或其他浏览器,而是Chrome浏览器).我认为这可以通过这个链接https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started—android,但它自动化我的PC浏览器浏览器.我也试过Appium,但日志后没

  5. 如何在Android和IOS上运行量角器脚本?

    我认为您可以通过在配置的功能部分指定平台来请求iOS和Android设备.如果您不想使用SauceLabs,可以查看使用Selenium的Grid功能.您可以获得适用于iOS和Android的Selenium驱动程序,并将它们连接到运行Protractor方案的集中式Selenium服务器,只需将配置文件中的seleniumAddress更改为指向中央服务器即可.基本上,您必须远程连接到设备,最简单的方法如上所述.

  6. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  7. Android In App BIlling v3无法使用Nexus 7

    我有一个应用程序,它使用应用程序计费的新v3,它在多个设备上运行良好.唯一的例外是Nexus7,当根据Google的文档here尝试初始化帮助程序时,报告错误:这发生在2个不同的Nexus7上,每个Nexus7上都有完全独立的用户帐户.这两款设备都构建了3.10.9的Play商店,与我测试过的所有其他Nexus设备相同.鉴于图书馆v3最近的性质,只有媒体关于在线发布的内容.有人对这个有了解吗?解决方法清除GooglePlay商店的缓存和数据,然后至少启动一次GooglePlay商店.

  8. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  9. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  10. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部