12

以下のコードでは、HTMLAgilitypackを使用してユーザー名とパスワードの値を設定できますが、ログインボタンのクリックイベントを呼び出すことはできません(ボタンのソースコードのIDは「s1」です)。

とにかくこれを行うことはありますか?を使用しない理由WebBrowserは、ソースコードにIDがないページからデータを取得するためにHTMLAgilityPackが必要になるためです。

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

3 に答える 3

7

とにかくこれを行うことはありますか?

HTML Agility Pack(HAP)ライブラリが提供するものではなく、直接ではありません。

HAPは、単一のページを取得して解析するのに最適ですが、継続的な対話用には設計されていません。不足しているのは、Cookie管理、JavaScriptインタラクションなどです。

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

WebRequest投稿を作成するようなクラスを使用する必要があります-フィドルを見て、リクエストがどのように表示されるかを確認し、それに応じて構築することをお勧めしますが、それは最初のステップにすぎない可能性があります。

代わりに、セレンWatiNなどのWeb自動化ツールの使用を調査することをお勧めします。

于 2012-11-26T16:31:28.097 に答える
4

fiddlerを介してPOSTリクエストを監視し、それがどのように構成されているかを確認する必要があります。例えば ​​:

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

通常、サイトは、リクエストでCookieを受信することにより、ログインしていることを認識します。

HttpClientは、デフォルトで、特定のドメインから受信したCookieを、各シーケンシャルリクエストでそのドメインに送信します(そのHttpClientインスタンスを破棄するまで)

1)Cookieコンテナを作成し、それを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);
 }
于 2017-08-24T18:19:17.200 に答える
0

WPF WebBrowserコントロールを使用しているかどうかはわかりませんが、使用している場合は、次の行に沿って何かを使用できます。

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

それが私にとってうまくいくことです。

于 2012-11-27T18:41:12.730 に答える