(转)Web自动化测试之12306火车票网站自动登录工具

news/2024/5/20 9:08:18/文章来源:https://blog.csdn.net/weixin_30338497/article/details/94868754

原文地址:

http://www.cnblogs.com/TankXiao/archive/2012/02/20/2350421.html

 

 

还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗。 今天我们就开发一个12306网站自动登录软件。 帮助您轻松订票


通过前两篇博客Fiddler教程HTTP协议详解,我们了解了Web的原理.


Web的原理就是,浏览器发送一个Request给Web服务器,Web服务器处理完这个请求之后发送一个HTTP Response给浏览器。


如果我们用自己写的程序来发送Request给Web服务器,然后再捕获Web服务器发回来的Response. 检查它与期望值值是否一致。
这不就是Web自动化测试吗? 这样的自动化测试叫做请求响应测试, 别小看这样的自动化测试。  什么开心农场助手,自动投票机。 网络爬虫都是用这个做的。



阅读目录



  1. .NET中提供的类来发送HTTP Request
  2. WebClient类的用法
  3. 模拟“GET” 方法
  4. Cookie 的处理
  5. 如何跟HTTPS的网站交互
  6. 模拟"POST" 方法
  7. 客户端发送给服务端的数据进行UrlEncode处理
  8. 实例:12306火车票网站登录工具
  9. 源代码下载

.NET中提供的类来发送HTTP Request


在System.Net命名工具下, .NET提供了5种方法  可以发送HTTP Request和取回HTTP Response.  它们分别是



WebClient:


WebRequent-WebResponse:


HttpWebRequest-HttpWebResponse:


TcpClient:


Socket:



这5个类中,最适合的就是HttpWebRequest-HttpWebResponse了, 这个才能满足我们需要的功能。
顺便说下WebClient类的用法



WebClient类的用法


WebClient的用法极其简单, 主要用于下载文件,或者单纯获取Response. 这个类不能模拟“POST” 的Http Request,
功能很少。


实例如下:


        static void Main(string[] args)
{
// 博客园首页地址
string uri = "http://www.cnblogs.com";

WebClient MyWebClient = new WebClient();
Stream st = MyWebClient.OpenRead(uri);
StreamReader sr = new StreamReader(st);
string html = sr.ReadToEnd();
sr.Close();
st.Close();

Console.Write(html);
}

复制代码


模拟“GET” 方法


我们主要是使用HttpWebRequest-HttpWebResponse 这两个类来做自动化测试.


先看看如何模拟“GET”方法,来打开博客园首页, 在下面的例子中,设置了一些 HttpWebRequest的一些属性



        static void Main(string[] args)
{
// 博客园首页地址
string uri = "http://www.cnblogs.com";

HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(uri);
// 浏览器和服务器交互的方法
Req.Method = "GET";
// 浏览器的类型,IE或者Firefox
Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1;)";
// 是否允许自动重定向(自动跳转)
Req.AllowAutoRedirect = true;
// 自动跳转的次数
Req.MaximumAutomaticRedirections = 3;
// 超时时间50000=50秒
Req.Timeout = 50000;
// 是否建立TCP持久连接
Req.KeepAlive = true;

HttpWebResponse response = (HttpWebResponse)Req.GetResponse();
Stream stream = response.GetResponseStream();
Encoding myEncoding = Encoding.GetEncoding("UTF-8");
StreamReader streamReader = new StreamReader(stream, myEncoding);
string html = streamReader.ReadToEnd();

Console.Write(html);
}

复制代码




Cookie 的处理


还有一个很重要的问题是,我们如何处理Cookie?  程序和Web服务器的交互中, 程序需要把Cookie发送给Web服务器,
Web服务器也会给程序发送新的Cookie. 我们怎么模拟这个呢?


C#提供了 CookieContainer 对象。  HttpWebRequest发送Request时会使用CookieContainer
中的Cookie.  HttpWebResponse返回Response后,会自动修改CookieContainer 对象的Cookie. 
这样的话,Cookie就不用我们操心了。 用法非常简单



            CookieContainer MyCookieContainer = new CookieContainer();
HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(uri);
Req.CookieContainer = MyCookieContainer;

复制代码


如何跟HTTPS的网站交互


我们用浏览器打开HTTPS的网站,如果我们没有安装证书,通常页面会显示
"此网站的安全证书有问题",我们必须再次点"继续浏览此网站(不推荐)"才能查看页面信息. 如下图所示



那么我们的程序,如何忽略HTTPS证书错误呢?


只要在程序中加入下面这段代码,就可以忽略HTTPS证书错误,让我们的程序能和HTTPS网站正确的交互了.



                System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) =>
{
return true;
};

复制代码


模拟"POST" 方法


POST和GET的区别在于, POST会把数据放在Body里面发送给Web服务器. 代码如下



View Code
        public static string GetResponse(string url, string method, string data)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.KeepAlive = true;
req.Method = method.ToUpper();
req.AllowAutoRedirect = true;
req.CookieContainer = CookieContainers;
req.ContentType = "application/x-www-form-urlencoded";

req.UserAgent = IE7;
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Timeout = 50000;

if (method.ToUpper() == "POST" && data != null)
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] postBytes = encoding.GetBytes(data); ;
req.ContentLength = postBytes.Length;
Stream st = req.GetRequestStream();
st.Write(postBytes, 0, postBytes.Length);
st.Close();
}

System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) =>
{
return true;
};

Encoding myEncoding = Encoding.GetEncoding("UTF-8");

HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream resst = res.GetResponseStream();
StreamReader sr = new StreamReader(resst, myEncoding);
string str = sr.ReadToEnd();

return str;
}
catch (Exception)
{
return string.Empty;
}
}

复制代码


客户端发送给服务端的数据进行UrlEncode处理


需要注意的是Web客户端发给Web服务端的数据如果包含空格和特殊字符(比如:汉字) 就要进行UrlEncode处理。


解决这个问题很简单。


在C#中Add reference 添加System.Web 组件


添加System.Web命名空间, 然后调用HttpUtility.UrlEncode()方法就可以进行编码了



实例:12306火车票网站登录工具


2011年铁道部推出了12306火车票预订网站, 可是因为访问者太多,经常崩溃。根本登录不了。网站访问高峰的时候,根本没办法登录成功,
一直会报错(如下图)




下面我们就运用上面的知识,来开发一个自动登录的工具


首先我们用浏览器去打开12306网站去登录, 同时打开Fiddler去抓包分析,看看浏览器是如何和Web服务器交互的。


通过抓包分析,我们发现登录其实很简单。就是把用户名,密码和验证码通过"POST"方法提交给服务器。如下图所示






在Fiddler中我们点击Inspectors tab->TextView Tab下, 能看到提交给Web服务器的数据是


string data="loginUser.user_name=thisisuserName&nameErrorFocus=&user.password=thispassword&passwordErrorFocus=&randCode=CF99&randErrorFocus=";

复制代码

我们把用户名,密码,验证码换成变量,然后Post给Web服务器就可以了。



登录的时候需要输入验证码。  很幸运的是12306网站在这里有个bug,  当验证码图片没有主动刷新的时候,老的验证码一直可以用。
这样的话我们的工具用老的验证码不停地给服务器发送登录的HttpRequest,直到登录成功。


登录的核心代码如下,  实际的代码比这个复杂,要写成循环调用,还要写成多线程,完整的请参考源代码


具体代码为



string data = "loginUser.user_name=" + userName + "&nameErrorFocus=&user.password=" + password 
+ "&passwordErrorFocus=&randCode=" + code + "&randErrorFocus=focus";
string loginUrl = "https://dynamic.12306.cn/otsweb/loginAction.do?method=login";
string afterLogin = HttpHelper.GetResponse(loginUrl, "POST", data);

复制代码

 


源代码下载


运行后效果如下





完整的代码请点此链接:   12306火车票预订网站自动登录工具        请用VS2008打开



过段时间再写篇博客, 我将介绍12306火车票自动预订工具的开发过程。 此工具可以自动登录,自动下单。  买火车票就是小case了。

转载于:https://www.cnblogs.com/fcsh820/archive/2012/02/25/2367465.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_761984.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享7个老师们常备的资源网站

教师较常用的网址,通常基本都是资源、通过自学形式的网址,这样的网址我们可以用于通过自学提升自己。 这儿就来分享7个教师常备的资源网,个个基本都是经典,一下子都给你哦。 1、我要自学网 较为知名的一个自学网站,这儿…

网站文件系统发展分布式文件系统fastDFS

网站文件系统发展 1、单机时代的图片服务器架构 初创时期由于时间紧迫,开发人员水平也很有限等原因。所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件。如果按业务再细分,可以在upload目…

网站前端_EasyUI.基础入门.0005.使用EasyUI Accordion组件的最佳姿势?

1. 基础的手风琴<div id"a" class"easyui-accordion" data-options"width:500,height:300"><div data-options"iconCls:icon-ok,title:about,bodyCls:accordion_padding"><h3 style"color:#0099FF;">Acco…

Jekyll – 基于纯文本的开源静态网站 博客系统

Jekyll 是一个开源的静态网站 & 博客生成工具&#xff0c;类似 WordPress。但是和 WordPress 又有很大的不同&#xff0c;原因是 Jekyll 只是一个生成静态网页的工具&#xff0c;不需要数据库支持。但是可以配合第三方服务&#xff0c;例如disqus。最关键的是 Jekyll 可以免…

给你一个网站,你该如何测试?你需要记住这4条法则!

我想大多数开始进行web端页面测试的人&#xff0c;一开始会的都是在页面上点点点&#xff0c;然后一看到页面上有什么图片失效啊&#xff0c;页面遮挡就觉得是找到了大bug&#xff1b;一开始我也是这样&#xff0c;尽管我很谨慎&#xff0c;很仔细&#xff0c;把页面上的每一个…

软件测试人员和QA必须关注的15个网站,值得收藏!

相信大家在学习的时候&#xff0c;不管学什么&#xff0c;都会习惯性地寻找各种学习资源。在大家自学软件测试的时候&#xff0c;也不会例外。那么&#xff0c;软件测试网站有哪些&#xff1f;我们到底应该如何精通软件测试呢&#xff1f;我们不妨一探究竟。 日常学习除了在一…

错误配置 MongoDB 数据库:微软招聘网站曝数据泄露安全漏洞

微软刚刚为自家移动版招聘网站封堵了一个注册用户信息泄露漏洞&#xff0c;以帮大公司追索错误配置部署的MongoDB在线数据库而知名的安全研究人员Chris Vickery发现了这一问题&#xff08;且与他此前的多个发现类似&#xff09;。此前&#xff0c;Vickery曾帮MacKeeper找到了泄…

JAVA笔记26-网络编程(不等于网站编程)

一、网络基础&#xff08;TCP/IP详解&#xff09; 1、IP协议&#xff08;Internet Protocol&#xff09;&#xff1a;网络层&#xff0c;支持网间数据报通信。无连接数据报传送&#xff0c;数据报路由选择和差错控制。 IPv4 32位&#xff08;4字节&#xff09;&#xff0c;IPv6…

如何使用nuget管理C#网站项目

2019独角兽企业重金招聘Python工程师标准>>> 接手C#的项目团队后&#xff0c;发现历史遗留的项目dll管理有些混乱&#xff0c;各个开发人员名下的项目有很多自定义dll或者是很老版本的dll文件&#xff0c;往往一个项目从vss拉下来后无法生成成功&#xff0c;提示缺少…

2017淮北计算机会考,2017年安徽淮北高中会考报名网站:淮北教育局

淮北高中会考报名网站&#xff1a;淮北教育局【导语】每个人都会面临大大小小的考试&#xff0c;有可能这一辈子都会逃脱不了考试的命运。无忧考网整理了淮北高中会考报名网站信息。希望对各位有些帮助。参加2017年安徽淮北高中会考的考生可点击进入《淮北教育局》进行淮北高中…

网站品牌列表效果 jQuery效果

用户进入页面时&#xff0c;品牌列表是默认的精简显示的如下图&#xff1a; 单击商品列表下方的查看全部按钮来显示全部的品牌&#xff0c;同时推荐品牌的文字会高亮显示&#xff0c;按钮里面的文字也变成“收起查看” jQuery 代码如何&#xff1a; <script type"text/…

BCrypt加密怎么存入数据库_「安全」3种常用的信息加密技术,让网站固若金汤...

2011年12月被曝的CSDN密码泄露事故中,网站安全措施不力,导致用户数据库被黑客“拖库”并不稀奇&#xff0c;令人错愕的是数据库中的用户密码居然是明文保存&#xff0c;导致密码泄露&#xff0c;成为地下黑市交易的商品。通常&#xff0c;为了保护网站的敏感数据&#xff0c;应…

一键seo提交收录_想让百度100%收录你的页面?那就进来看看

没有收录就没有SEO收录是SEO的第一步&#xff0c;收录越多才有可能获得更高的SEO流量。最近&#xff0c;由于百度收录机制变的更加严格&#xff0c;很多站长发现网站收录变少了、变慢了、甚至不收录了。站长平台提交不能提升收录你可能做了sitemap&#xff0c;也在百度站长平台…

功能性新网站开发一点点经验心得

因为本次是全程参与了松松软文新平台的开发&#xff0c;所以卢松松今天把网站开发的一些经验心得写出来&#xff0c;供大家参考。以后大家在迁移新网站的时候&#xff0c;有一个参考依据&#xff0c;我都做了什么&#xff0c;什么时候做&#xff0c;都会列出来&#xff0c;希望…

ichunqiu在线挑战--网站综合渗透实验 writeup

挑战链接&#xff1a;http://www.ichunqiu.com/tiaozhan/111知识点&#xff1a;后台弱口令&#xff0c;md5破解&#xff0c;SQL Injection&#xff0c;写一句话木马&#xff0c;敏感信息泄露&#xff0c; 提权&#xff0c;登陆密码破解这个挑战与“我很简单&#xff0c;请不要欺…

论坛隐藏链接获取_【外链建设】测试了1500个hao123推荐的网站,只为挖掘发能外链的DZ论坛...

虽然已经过了外链为皇的时代&#xff0c;但外链在新站建设、重点关键词排名等工作场景中依然占据这很重要的位置。因为我工作后&#xff0c;大部分的时间在做品牌SEO&#xff0c;没有积攒什么外链资源&#xff1b;这次要梳理SEO技术&#xff0c;我的新博客也需要扩大外链的广泛…

网站添加第三方登陆(PHP版)

这两周正在写毕业设计&#xff0c;我做的是一个问答网站。先介绍一下这个网站&#xff1a;这是一个关于大学生在线问答的网站&#xff0c;类似知乎和百度知道&#xff0c;不过功能没有人家多&#xff0c;毕竟这个网站我一个人在做。网站部署在阿里云&#xff0c;网站包括API&am…

php动态网址可以做seo么,动态URL是什么意思?动态URL怎么做

我们经常会听到动态url&#xff0c;很多小白会不太明白&#xff1a;什么是动态URL呢&#xff1f;其实动态URL意味着网页很难被搜索引擎检索到&#xff0c;对于SEO是非常不利的。因此我们需要了解动态URL怎样做能利于SEO。德州SEO七宝总结了以下几点供大家参考&#xff1a;一、动…

asp网站显示 remote host time out

当用户访问网站的时候&#xff0c;显示如下所示信息&#xff1a; 出现这个问题&#xff0c;一般都是用户的浏览器设置了代理&#xff0c;把代理取消就好了&#xff01;

最新30个优秀的旅行网站设计作品欣赏

您可能还喜欢 12个优秀的 HTML5 网站设计案例欣赏30个漂亮的个人作品集网页设计欣赏分享35个非常漂亮的单页网站设计欣赏45个优秀的国外电子商务网站设计欣赏33个非常优秀的网站底部设计案例欣赏旅游网站的页面通常设计得很宽&#xff0c;而且搭配非常有吸引力的图片&#xff0…