|
還記得2011年春運(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在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)
模擬“GET” 方法我們主要是使用HttpWebRequest-HttpWebResponse 這兩個類來做自動化測試. 先看看如何模擬“GET”方法,來打開博客園首頁, 在下面的例子中,設(shè)置了一些 HttpWebRequest的一些屬性
static void Main(string[] args) 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();
如何跟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) =>
模擬"POST" 方法POST和GET的區(qū)別在于, POST會把數(shù)據(jù)放在Body里面發(fā)送給Web服務(wù)器. 代碼如下
![]() View Code
public static string GetResponse(string url, string method, string data)
客戶端發(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)站訪問高峰的時候,根本沒辦法登錄成功, 一直會報錯(如下圖)
下面我們就運(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ù)是 string data="loginUser.user_name=thisisuserName&nameErrorFocus=&user.password=thispassword&passwordErrorFocus=&randCode=CF99&randErrorFocus="; 我們把用戶名,密碼,驗(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
源代碼下載運(yùn)行后效果如下
完整的代碼請點(diǎn)此鏈接: 12306火車票預(yù)訂網(wǎng)站自動登錄工具 請用VS2008打開
過段時間再寫篇博客, 我將介紹12306火車票自動預(yù)訂工具的開發(fā)過程。 此工具可以自動登錄,自動下單。 買火車票就是小case了 |
|
|