2012-11-26 18 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は単一のページを取得して解析するのに最適ですが、継続的なやりとりのために設計されていません。欠けているものは、クッキー管理、JavaScriptのやり取りなどです。

ログインするには、必要なデータを含めてサーバーにHTTP POSTを送信する必要があります.HAPはそれをサポートできません。

投稿を作成するには、WebRequestのようなクラスを使用する必要があります - 私はfiddlerを見て、それを使って要求がどのように見えるかを見てそれに応じて構成することをお勧めします。

seleniumWatiNのようなWebオートメーションツールの使用を調査したい場合があります。

+0

ありがとうございました。 私は見ていましたが、間違いなく私はログインしているウェブサイトのソースコードをコーディングするためにHTMLAgilityPackを使用する必要があります。 私は何かをやったことがありますが、後でちょっと立ち往生しました。私はwebbrowser1の制御でログインし、そのセッションのクッキーを取得します。 HTMLAgilityPackを使用してそのCookieを適用し、そのCookieを使用してページを開くことはできますか? – touyets

+1

@ user1842134 - いいえ、HAPはCookieを処理せず、処理できません。 – Oded

+0

okありがとう – touyets

0

あなたはWPFのWebBrowserコントロールを使用している場合、私は知りませんが、あなたがしている場合、あなたは私のためにどのような作品だ

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

の線に沿って何かを使用することができます。

2

あなたはフィドラーを介してPOSTリクエストを観察し、どのように構造化されているかを確認する必要があります。例えば :

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

通常、サイトはあなたがあなたのリクエストでそのクッキーを受信することにより、ログインしていることを認識するであろう。

1)クッキーのコンテナを作成します(HttpClientをそのインスタンスを配置まで)とあなたのHttpClientインスタンスに割り当てられ、デフォルトで

HttpClientがそのドメインへの各シーケンシャル要求に特定のドメインから受信したクッキーを送信します。

2)HttpClientを使用してログインPOST要求を行います。

3)HttpClientを使用してデータGETリクエストを作成します。

4)応答からhtml文字列を読み取ります。

5)HtmlAgilityPack HtmlDocumentを使用して、Webからではなく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); 
} 
関連する問題