Web Performance Test : 为Request的Post参数名添加XPath支持
问题描述
本文的标题看起来有些含糊其辞,这里我需要把问题阐述得更加清楚。这是我们使用VSTS进行Web Performance Test时,Asp.net造成的特定问题(也许其他开发工具或插件也会造成类似问题)。 我们知道Asp.net的控件名在前端是自动生成的,比如开发人员设计时,控件名为username; 在bowser端,会自动生成包含一大段前缀的HTML控件,例如ctl00$content$SiteThemeContentPage1$fragment_3526$ctl01$ctl00$LoginForm1$ctl07$username。具体的生成机制我没有研究,但是这个控件名的前缀确实是会随着比如父控件名,重新编译的变化而变化。
对于我们Web Performance Test来说,问题在哪里呢? 比如我们录制了一个Post Request,来模拟一个Form PostBack(见Asp.net的知识),如下图所示:
Post的参数名中包含了这些带着自动生成的前缀的控件名。以下两种情况对测试用例的维护非常糟糕:
1,随着编译生成的前缀的变化,每隔一段时间,我们就需要更新Post Request中的参数名,来避免测试失败,如果你有大量的测试用例,或者用例中有大量PostBack的控件(Asp.net中这很常见),这个工作让人发狂。
2,项目可能部署了好几个测试版本需要进行load test,那么你就要维护好几个版本的测试用例,再考虑到第一条,这简直不是人干的了。
解决方案
如果是进行Web的UI测试,显然我们已经很多种办法来应付这种情况(虽然Web UI测试本质上和Web Performance测试是不同的,Web Performance测试是直接运行在HTTP层的,但是还是有很多东西可以借鉴);比如Selenium2 我们可以用XPath,css selector来定位控件,TestComplete可以使用Name Mapping;正如我们标题所说的,我们将用XPath的方式,比如上文中的username控件,我们用这样的语法来匹配控件名 -- "//text[contains(@name,'username')]"。 但是Web Performance Test原生不支持XPath,而这就是我们要做的。具体应该怎么做呢? 这里我不打算直接贴出代码了,而是给出主要的步骤:
1,我们应该添加一个WebTestPlugin。为什么不是Custom Extraction Rule呢?因为我们这里需要抽取的并不是Post参数的值,而是Post参数名,考虑一下其中的区别。(是的,写一个Custom Extraction Rule,通过Xpath来抽取Content Parameter是一个非常好的实践,网上已经有相关的文章了,但是本文讲述的是另一个问题)
2,采用HtmlAgilityPack来支持XPATH语法。这是一个为HTML提供XPATH支持的开源库,在我用来还不错,这里下载。当然你可以使用其他的库。
3,我们可以定义这样的语法,如下图所示:
前缀"XPath:",后面接XPath的匹配字符串。今后我们也可以添加更多的前缀支持,如"CssSelector:",然后根据不同的前缀,路由到不同的处理函数中
4,写一个自定义的WebTestPlugin。很明显,我们需要重写PreRequest函数,它需要做的是:
1) 遍历e.Request.Body中FormPostParameters,也就是所有的Post参数。找到参数名包含前缀XPATH:的参数,把xpath匹配符从参数名中提取出来。
2) 通过e.WebTest.LastResponse.BodyString,获取HTML文本。创建HtmlAgilityPack的HtmlDocument对象。用步骤1种得到的xpath进行查询,找到控件。
3) 用步骤2中得到的真实的控件名,也就是ctl00$content$SiteThemeContentPage1$fragment_3526$ctl01$ctl00$LoginForm1$ctl07$username。来替换FormPostParameter对象中原来的的控件名,也就是匹配符XPath://input[contains(@name,’username’)],大功告成。
Binhua Liu原创,2013/10/5
Web Performance Test : 为Request的Post参数名添加XPath支持的更多相关文章
- Web Performance Test: 如果使用Plugin过滤Dependent Request
前言 由于Visual Studio的Web Performance Test是基于XML脚本的,留给用户修改测试行为的自由度并不高.因此,Plugin机制就对于实现很多客户化的配置显得很重要. 问题 ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- request.getParameter(“参数名”) 中文乱码解决方法
今天浏览项目时候,遇到一个问题,页面用${requestScope.参数名 }获取的值是乱码,然后搜了一下,最后说是编码的问题,附上查找的结果: 在Java 开发中,如果框架搭建的不完善或者初学者在学 ...
- Visual Studio的Web Performance Test提取规则详解(3)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
- Visual Studio的Web Performance Test提取规则详解(2)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
- Visual Studio的Web Performance Test提取规则详解(1)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
- 13 Reasons Why You Should Pay Attention to Mobile Web Performance
Mobile is no longer on the sidelines. If you’re not already thinking mobile first, you should at lea ...
- Java web课程学习之Request和Response
request和response l HttpServletRequest l 请求转发 l HttpServletResponse l 请求重定向 请求流程 每次请求service(),都会由容 ...
- Web开发-Servlet&HTTP&Request
<!doctype html>02 - JavaEE - Servlet&HTTP&Request figure:first-child { margin-top: -20 ...
随机推荐
- java常见的开发工具
http://www.csdn.net/article/1970-01-01/2824723 http://zhidao.baidu.com/link?url=D8FdJxeFd-z-LV1OfZuZ ...
- java中的注解(Annotation)
转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...
- 基于 debootstrap 和 busybox 构建 mini ubuntu
基于 debootstrap 和 busybox 构建 mini ubuntu 最近的工作涉及到服务器自动安装和网络部署操作系统,然后使用 ansible 和 saltsatck 进行配置并安装 op ...
- iOS控件之UIResponder类
iOS控件之UIResponder类 在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,我们知道UIApplication.UIView.UIViewController这几个 ...
- jNotify:操作结果信息提示条
我们在提交表单后,通过Ajax响应后台返回结果,并在前台显示返回信息,jNotify能非常优雅的显示操作结果信息.jNotify是一款基于jQuery的信息提示插件,它支持操作成功.操作失败和操作提醒 ...
- Python之路----------迭代器
直接用作于for循环的数据类型有以下几种: 1.集合类的数据类型:list tuple dict set str等 2.生成器generator,包括生成器和带有yiled 的generator fu ...
- C#操作Mongodb的心得
Mongodb是一个强大的文档型数据库,采用BSON的数据格式.本文主要采用其官方的C#驱动来操作其表中的集合.驱动版本为1.1.0,下载地址为: http://mongodb.github.io/m ...
- 天啦噜!原来Chrome自带的开发者工具能这么用你知道么!
Chrome自带开发者工具.它的功能十分丰富,包括元素.网络.安全等等.今天我们主要介绍JavaScript控制台部分的功能. 我最早写代码的时候,也就是在JS控制台里输出一些服务器返回的内容,或者一 ...
- [原创]java WEB学习笔记106:Spring学习---AOP的通知 :前置通知,后置通知,返回通知,异常通知,环绕通知
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Windows Phone 十七、Socket
Socket 常用类型 StreamSocket:Socket对象 StreamSocketListener:Socket监听对象,适用于服务端 服务端代码 <Grid x:Name=" ...