自动化测试项目实战 ——12306火车票网站自动登录工具
還記得前幾年春運(yùn),12306火車票預(yù)訂網(wǎng)站經(jīng)常崩潰無法登錄嗎。 今天我們就開發(fā)一個12306網(wǎng)站自動登錄軟件。 幫助您輕松訂票
通過前兩篇博客Fiddler教程和HTTP協(xié)議詳解,我們了解了Web的原理.
Web的原理就是,瀏覽器發(fā)送一個Request給Web服務(wù)器,Web服務(wù)器處理完這個請求之后發(fā)送一個HTTP Response給瀏覽器。
如果我們用自己寫的程序來發(fā)送Request給Web服務(wù)器,然后再捕獲Web服務(wù)器發(fā)回來的Response. 檢查它與期望值值是否一致。 這不就是Web自動化測試嗎? 這樣的自動化測試叫做請求響應(yīng)測試, 別小看這樣的自動化測試。 什么開心農(nóng)場助手,自動投票機(jī)。 網(wǎng)絡(luò)爬蟲都是用這個做的。
閱讀目錄
- .NET中提供的類來發(fā)送HTTP Request
- WebClient類的用法
- 模擬“GET” 方法
- Cookie 的處理
- 如何跟HTTPS的網(wǎng)站交互
- 模擬"POST" 方法
- 客戶端發(fā)送給服務(wù)端的數(shù)據(jù)進(jìn)行UrlEncode處理
- 實(shí)例:12306火車票網(wǎng)站登錄工具
- 源代碼下載
.NET中提供的類來發(fā)送HTTP Request
在System.Net命名工具下, .NET提供了5種方法 可以發(fā)送HTTP Request和取回HTTP Response. 它們分別是
WebClient:
WebRequent-WebResponse:
HttpWebRequest-HttpWebResponse:
TcpClient:
Socket:
這5個類中,最適合的就是HttpWebRequest-HttpWebResponse了, 這個才能滿足我們需要的功能。 順便說下WebClient類的用法
WebClient類的用法
WebClient的用法極其簡單, 主要用于下載文件,或者單純獲取Response. 這個類不能模擬“POST” 的Http Request, 功能很少。
實(shí)例如下:
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”方法,來打開博客園首頁, 在下面的例子中,設(shè)置了一些 HttpWebRequest的一些屬性
static void Main(string[] args){// 博客園首頁地址string uri = "http://www.cnblogs.com";HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(uri);// 瀏覽器和服務(wù)器交互的方法Req.Method = "GET";// 瀏覽器的類型,IE或者FirefoxReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1;)";// 是否允許自動重定向(自動跳轉(zhuǎn))Req.AllowAutoRedirect = true;// 自動跳轉(zhuǎn)的次數(shù)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 的處理
還有一個很重要的問題是,我們?nèi)绾翁幚鞢ookie? 程序和Web服務(wù)器的交互中, 程序需要把Cookie發(fā)送給Web服務(wù)器, Web服務(wù)器也會給程序發(fā)送新的Cookie. 我們怎么模擬這個呢?
C#提供了 CookieContainer 對象。 HttpWebRequest發(fā)送Request時會使用CookieContainer 中的Cookie. HttpWebResponse返回Response后,會自動修改CookieContainer 對象的Cookie. 這樣的話,Cookie就不用我們操心了。 用法非常簡單
CookieContainer MyCookieContainer = new CookieContainer();HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(uri);Req.CookieContainer = MyCookieContainer;如何跟HTTPS的網(wǎng)站交互
我們用瀏覽器打開HTTPS的網(wǎng)站,如果我們沒有安裝證書,通常頁面會顯示 “此網(wǎng)站的安全證書有問題”,我們必須再次點(diǎn)"繼續(xù)瀏覽此網(wǎng)站(不推薦)"才能查看頁面信息. 如下圖所示
那么我們的程序,如何忽略HTTPS證書錯誤呢?
只要在程序中加入下面這段代碼,就可以忽略HTTPS證書錯誤,讓我們的程序能和HTTPS網(wǎng)站正確的交互了.
System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) =>{return true;};模擬"POST" 方法
POST和GET的區(qū)別在于, POST會把數(shù)據(jù)放在Body里面發(fā)送給Web服務(wù)器. 代碼如下
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;}}客戶端發(fā)送給服務(wù)端的數(shù)據(jù)進(jìn)行UrlEncode處理
需要注意的是Web客戶端發(fā)給Web服務(wù)端的數(shù)據(jù)如果包含空格和特殊字符(比如:漢字) 就要進(jìn)行UrlEncode處理。
解決這個問題很簡單。
在C#中Add reference 添加System.Web 組件
添加System.Web命名空間, 然后調(diào)用HttpUtility.UrlEncode()方法就可以進(jìn)行編碼了
實(shí)例:12306火車票網(wǎng)站登錄工具
2011年鐵道部推出了12306火車票預(yù)訂網(wǎng)站, 可是因?yàn)樵L問者太多,經(jīng)常崩潰。根本登錄不了。網(wǎng)站訪問高峰的時候,根本沒辦法登錄成功, 一直會報(bào)錯(如下圖)
下面我們就運(yùn)用上面的知識,來開發(fā)一個自動登錄的工具
首先我們用瀏覽器去打開12306網(wǎng)站去登錄, 同時打開Fiddler去抓包分析,看看瀏覽器是如何和Web服務(wù)器交互的。
通過抓包分析,我們發(fā)現(xiàn)登錄其實(shí)很簡單。就是把用戶名,密碼和驗(yàn)證碼通過"POST"方法提交給服務(wù)器。如下圖所示
在Fiddler中我們點(diǎn)擊Inspectors tab->TextView Tab下, 能看到提交給Web服務(wù)器的數(shù)據(jù)是
我們把用戶名,密碼,驗(yàn)證碼換成變量,然后Post給Web服務(wù)器就可以了。
登錄的時候需要輸入驗(yàn)證碼。 很幸運(yùn)的是12306網(wǎng)站在這里有個bug, 當(dāng)驗(yàn)證碼圖片沒有主動刷新的時候,老的驗(yàn)證碼一直可以用。 這樣的話我們的工具用老的驗(yàn)證碼不停地給服務(wù)器發(fā)送登錄的HttpRequest,直到登錄成功。
登錄的核心代碼如下, 實(shí)際的代碼比這個復(fù)雜,要寫成循環(huán)調(diào)用,還要寫成多線程,完整的請參考源代碼
具體代碼為
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);源代碼下載
運(yùn)行后效果如下
完整的代碼可以去我的公眾號獲取!
最后:下方這份完整的自動化測試視頻學(xué)習(xí)教程已經(jīng)整理上傳完成,朋友們?nèi)绻枰梢宰孕忻赓M(fèi)領(lǐng)取 【保證100%免費(fèi)】
總結(jié)
以上是生活随笔為你收集整理的自动化测试项目实战 ——12306火车票网站自动登录工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记-Flutter 动画详解(一)
- 下一篇: html table表头升序 降序,jq