2

次のアプリケーションでは、HTMLアジリティパックを使用して、指定されたURLからHTMLドキュメントを抽出しました。ここで、HTMLドキュメントの要素IDを使用してフィールドにテキストを入力し、最後に[送信]ボタンを押してフォームを送信する方法を知る必要があります。

protected void Button1_Click(object sender, EventArgs e)
{
    string Url = "https://something.com/login.asp"; 
    HtmlWeb web = new HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = web.Load(Url);
}

現在のアプリケーションは、Webデータ入力を自動化します。

4

3 に答える 3

0
protected void Button1_Click(object sender, EventArgs e)         
{
    IWebDriver driver = 
        new InternetExplorerDriver(@"C:\.....\IEDriverServer_Win32_2.25.2"); 

    driver.Navigate().GoToUrl("https://website.com/login.asp");

    // Find the text input element by its name
    // username

    IWebElement name_ID = driver.FindElement(By.Name("name_ID"));
    name_ID.SendKeys("xyzw");

    // password
    IWebElement pwd_PW = driver.FindElement(By.Name("pwd_PW"));
    pwd_PW.SendKeys("fasdfasfdasdf");

    // submit login form
    IWebElement sSubmit = driver.FindElement(By.Name("submit"));
    submit.Submit();
    System.Threading.Thread.Sleep(5000);
    driver.Quit();
}
于 2012-10-12T18:01:42.570 に答える
0

HtmlAgilityPackはそのようには機能しません。HTMLドキュメント内のノードを表すデータ構造を保持しているだけであり、Webブラウザまたはクライアントのインスタンスをホストしているわけではありません。

解決策は、HtmlDocumentインスタンスをトラバースして適切な要素を見つけ、<form>適切な子要素を抽出すること<input />です。独自のHttpWebRequestオブジェクトを作成RequestStreamし、適切にエンコードされたキーと値のペアを手動で入力する必要があります(GETフォームではなくPOSTフォームであると想定しています)。

送信するフォームが静的で変更されない場合は、HtmlAgilityPackを使用する必要はなく、フォームの名前と値をHttpWebRequestにハードコーディングするだけです。

于 2012-10-08T17:29:02.827 に答える
0

私は似たようなことをしていますが、ページのhtmlを手動で取得しています。

// do webrequest stuff and return raw html
string html = DemoDoHttpGet(url, cookieContainer);

// I'm hitting an asp.net page so I have to repeat a bunch of values back to the server
// key is the "name" attribute of an element i want to find in the html
// i gathered these manually by watching a normal exchange with fiddler
var fields = new Dictionary<string, string>();
fields.Add(System.Web.HttpUtility.UrlDecode("__LASTFOCUS"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTTARGET"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTARGUMENT"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__VIEWSTATE"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTVALIDATION"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("ctl00%24ContentPlaceHolder1%24Login1%24LoginButton"), string.Empty);

// this method searches the html for elements with the given names and updates
// the value for each item in the field collection with the value sent from the server
Scraper.GetFieldValues(fields, html);

/* looks kind of like this

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

        var names = new List<string>();
        foreach (var ditem in fields)
        {
            names.Add(ditem.Key);
        }

        foreach (var nitem in names)
        {
            // find items, read value

            string xpath = string.Format("//*[@name=\"{0}\"]", (nitem));
            var nodes = doc.DocumentNode.SelectNodes(xpath);

            // if node found read whatever attribute is appropriate,
            // write value back to fields collection

*/

// here i'm manually providing values for login username/password
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24UserName"), "my@email.aaa");
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24Password"), "mypassword");

// another webrequest to post back to the server

var request2 = (HttpWebRequest)WebRequest.Create(url);
request2.CookieContainer = cookieContainer;
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";

var args = new StringBuilder();
foreach (var item in fields)
{
    args.Append(System.Web.HttpUtility.UrlEncode(item.Key));
    args.Append("=");
    args.Append(System.Web.HttpUtility.UrlEncode(item.Value));
    args.Append("&");
}

using (System.IO.StreamWriter writer = 
    new System.IO.StreamWriter(request2.GetRequestStream()))
{
    writer.Write(args.ToString().TrimEnd('&'));
}

string html;
using (var response2 = (System.Net.HttpWebResponse)request2.GetResponse())
using (var rdr2 = new System.IO.StreamReader(response2.GetResponseStream()))
{
    html = rdr2.ReadToEnd();
}
于 2012-10-08T17:45:27.707 に答える