В приведенном ниже коде я могу установить значение имени пользователя и пароля с помощью HTMLAgilitypack, но я не могу вызвать событие нажатия кнопки входа (идентификатор в исходном коде кнопки "s1" ).
В любом случае, чтобы это было сделано? Причина, по которой я не использую WebBrowser
, - это то, что мне понадобится HTMLAgilityPack для извлечения данных со страницы без идентификаторов в исходном коде.
var doc = new HtmlWeb().Load("http://MYURL.com");
doc.DocumentNode.SelectSingleNode("name").SetAttributeValue("value", "MyUsername");
doc.DocumentNode.SelectSingleNode("password").SetAttributeValue("value", "MyPassword");
В любом случае, чтобы это было сделано?
Не то, что предоставляет библиотека HTML Agility Pack (HAP) - не напрямую.
HAP отлично подходит для получения одной страницы и анализа ее, но она не предназначена для продолжения взаимодействия. Вещи, которые отсутствуют, - это управление файлами cookie, взаимодействие с JavaScript и многое другое.
Чтобы войти в систему, вам, вероятно, нужно отправить HTTP-сообщение POST на сервер, включая нужные вам данные - HAP не может с этим помочь.
Вам нужно будет использовать класс, например WebRequest
, чтобы сделать сообщение - я предлагаю посмотреть fiddler и использовать его для просмотра что должен выглядеть запрос и строить его, хотя это может быть только первым шагом.
Возможно, вам захочется изучить использование инструментов веб-автоматизации, таких как selenium или WatiN.
Вам нужно наблюдать запрос 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);
}
Я не знаю, используете ли вы элемент управления WPF WebBrowser, но если это так, вы можете использовать что-то в строках
doc.GetElementById("submit_signin").Click();
То, что работает для меня.