小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Web自動化測試之12306火車票網(wǎng)站自動登錄工具

 昵稱453497 2013-01-22

還記得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ò)爬蟲都是用這個做的。

 

閱讀目錄

  1. .NET中提供的類來發(fā)送HTTP Request
  2. WebClient類的用法
  3. 模擬“GET” 方法 
  4. Cookie 的處理
  5. 如何跟HTTPS的網(wǎng)站交互
  6. 客戶端發(fā)送給服務(wù)端的數(shù)據(jù)進(jìn)行UrlEncode處理
  7. 實(shí)例:12306火車票網(wǎng)站登錄工具
  8. 源代碼下載

.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í)例如下:

復(fù)制代碼
        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);
}
復(fù)制代碼

 

模擬“GET” 方法

我們主要是使用HttpWebRequest-HttpWebResponse 這兩個類來做自動化測試.

先看看如何模擬“GET”方法,來打開博客園首頁, 在下面的例子中,設(shè)置了一些 HttpWebRequest的一些屬性

 

復(fù)制代碼
        static void Main(string[] args)
{
// 博客園首頁地址
string uri = "http://www.cnblogs.com";

HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(uri);
// 瀏覽器和服務(wù)器交互的方法
Req.Method = "GET";
// 瀏覽器的類型,IE或者Firefox
Req.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);
}
復(fù)制代碼



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ù)器. 代碼如下

 

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;
}
}

 

客戶端發(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 
+ "&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)行后效果如下

 

完整的代碼請點(diǎn)此鏈接:   12306火車票預(yù)訂網(wǎng)站自動登錄工具        請用VS2008打開

 

過段時間再寫篇博客, 我將介紹12306火車票自動預(yù)訂工具的開發(fā)過程。 此工具可以自動登錄,自動下單。  買火車票就是小case了

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多