2012-11-26 31 views
11

在下面的代碼中,我可以使用HTMLAgilitypack設置用戶名和密碼的值,但我無法調用登錄按鈕的單擊事件(該按鈕的源代碼中的id是「s1 「)。使用HTMLAgilityPack登錄到網站

有沒有辦法做到這一點?我沒有使用WebBrowser的原因是因爲我需要HTMLAgilityPack從源代碼中沒有ID的頁面檢索數據。

var doc = new HtmlWeb().Load("http://MYURL.com"); 
doc.DocumentNode.SelectSingleNode("name").SetAttributeValue("value", "MyUsername"); 
doc.DocumentNode.SelectSingleNode("password").SetAttributeValue("value", "MyPassword"); 

回答

5

反正是有這個做?

不與HTML敏捷包(HAP)庫提供的內容不直接相關。

HAP非常適合獲取單個頁面並對其進行解析,但它不適用於繼續交互。缺少的東西包括cookie管理,JavaScript交互等等。

爲了登錄,您可能需要發送HTTP POST到服務器,包括您想要的數據--HAP無法幫助解決這個問題。

您需要使用類似WebRequest的類才能發佈帖子 - 我建議您查看fiddler並使用它來查看請求應該是什麼樣子並據此構建它,儘管這可能只是第一步。

您可能想要調查使用網絡自動化工具,例如seleniumWatiN

+0

感謝您的幫助。 我看了一下,但由於我正在登錄的網站的奇怪源代碼,我肯定需要使用HTMLAgilityPack。 我已經做了一些事情,但之後我有點卡住了:我通過webbrowser1控制登錄,然後檢索該會話的cookie。我可以使用HTMLAgilityPack應用該cookie並使用該cookie打開頁面嗎? – touyets

+1

@ user1842134 - 不,HAP不會處理cookie。 – Oded

+0

好的非常感謝你 – touyets

0

我不知道,如果你使用WPF WebBrowser控件,但如果你是,你可以沿着

doc.GetElementById("submit_signin").Click(); 

這對我來說是什麼在起作用線使用的東西。

2

您需要通過fiddler觀察POST請求並查看它的結構。 例如:

{"userName":"you","password":"pwd"} 

通常情況下,網站會認識到你是在收到您的要求自己的cookie登錄。

HttpClient默認情況下將來自與每個連續的請求到該域的特定域接收餅乾(除非你是處置HttpClient的實例)

1)創建一個cookie的容器,它分配給您的HttpClient的實例。

2)使用HttpClient進行登錄POST請求。

3)使用HttpClient進行數據GET請求。

4)從響應中讀取html字符串。

5)使用HtmlAgilityPack HtmlDocument從html字符串加載文檔,而不是從網頁加載(如大多數示例所示)。

string baseUrl = "https://www.yourwebsite.com"; 
string loginUrl = "/Account/LogOn"; 
string sessionUrl = "/Data"; 

var uri = new Uri(baseUrl); 

CookieContainer cookies = new CookieContainer(); 
HttpClientHandler handler = new HttpClientHandler(); 
handler.CookieContainer = cookies; 

using (var client = new HttpClient(handler)) 
{ 
     client.BaseAddress = uri; 

     var request = new { userName = "you", password = "pwd" }; 
     var resLogin = client.PostAsJsonAsync(loginUrl,request).Result; 
     if (resLogin.StatusCode != HttpStatusCode.OK) 
      Console.WriteLine("Could not login -> StatusCode = " + resLogin.StatusCode); 

     // see what cookies are returned 
     IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>(); 
     foreach (Cookie cookie in responseCookies) 
      Console.WriteLine(cookie.Name + ": " + cookie.Value); 

     var resData = client.GetAsync(dataUrl).Result; 
     if(resSession.StatusCode != HttpStatusCode.OK) 
      Console.WriteLine("Could not get data html -> StatusCode = " + resSession.StatusCode); 

     var html = resSession.Content.ReadAsStringAsync().Result; 

     var doc = new HtmlDocument(); 
     doc.LoadHtml(html); 
}