在下面的代码中,我可以使用HTMLAgilitypack设置用户名和密码的值,但是我无法调用登录按钮的click事件(按钮的源代码中的id是“s1”)。
无论如何要做到这一点?我没有使用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");
答案 0 :(得分:6)
无论如何要做到这一点?
不是HTML Agility Pack(HAP)库提供的 - 而不是直接。
HAP非常适合获取单个页面并对其进行解析,但它并非专为持续交互而设计。缺少的是cookie管理,JavaScript交互等等。
为了登录,您可能需要向服务器发送HTTP POST,包括您想要的数据 - HAP无法帮助您。
您需要使用类似WebRequest
的类来发帖 - 我建议查看fiddler并使用它来查看请求应该是什么样子并相应地构建它,尽管这可能只是是第一步。
答案 1 :(得分:2)
您需要通过fiddler观察POST请求并查看其结构。 例如:
{"userName":"you","password":"pwd"}
通常,网站会通过在您的请求中接收Cookie来识别您已登录。
默认情况下,HttpClient将从每个顺序请求从特定域收到的cookie发送到该域(直到您部署该HttpClient实例)
1)创建一个cookie容器并将其分配给您的HttpClient实例。
2)使用HttpClient进行登录POST请求。
3)使用HttpClient发出数据GET请求。
4)从响应中读取html字符串。
5)使用HtmlAgilityPack HtmlDocument从html字符串加载文档而不是从Web加载文档(如大多数示例所示)。
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);
}
答案 2 :(得分:0)
我不知道您是否正在使用WPF WebBrowser控件,但如果您使用,则可以使用
中的内容。doc.GetElementById("submit_signin").Click();
这对我有用。