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 ...
随机推荐
- 转:MVC 数据验证
一.基础特性 一.Required 必填选项,当提交的表单缺少该值就引发验证错误. 二.StringLength 指定允许的长度 指定最大长度: [StringLength()] //最大长度不超过2 ...
- 使用udev实现显示器的热插拔和usb的自动挂载
udev:用来监听硬件设备是否发生改变,并可以给硬件设备命名 ,也可以在硬件发生改变之后执行脚本 使用udev检测显示器是否发生变化,然后执行脚本,解决linux显示器热插拔问题 先补充一点: [ro ...
- Python之路【第十八章】:Web框架
Web框架本质 1.众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 #!/usr/bin/env python # -*- codin ...
- 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...
- jQuery初始化加载的实现
与jQuery事件模块的其他事件不同,其他事件是通过数据缓存实现的,而初始化事件,jQuery.ready则是通过回调函数列表实现的.$()的参数如果是函数就向回调函数列表中添加回调函数,同时为DOM ...
- sprintf()函数的用法
Visual C++ sprintf()函数用法 转:http://blog.csdn.net/masikkk/article/details/5634886 在将各种类型的数据构造成字符串时,spr ...
- .NET client connection Limit
调试出了一个诡异的问题,使用多个进程没问题,单进程出现了. fix: //默认限制为2个连接 //public const int DefaultPersistentConnectionLimit = ...
- Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理
摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■ 详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...
- 探索性思维——How to Solve It
我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...
- >>> 主页推荐链接
Apple专区 App Store 排行榜 App Store 排行榜 - 中国区 PC6苹果网 威锋网 第三方 环信 - 即时通讯云领导者 腾讯Bugly - Android Crash | iOS ...