2012-11-26 10 views
11

Nel seguente codice, posso impostare il valore del nome utente e della password utilizzando l'HTMLAgilitypack ma non riesco a richiamare l'evento click del pulsante di accesso (l'id nel codice sorgente del pulsante è "s1 ").accesso al sito Web utilizzando HTMLAgilityPack

Esiste comunque una soluzione? Il motivo per cui non sto utilizzando lo WebBrowser è perché avrò bisogno di HTMLAgilityPack per recuperare i dati dalla pagina senza ID nel codice sorgente.

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

risposta

5

C'e 'qualche cosa per questo essere fatto?

Non con ciò che fornisce la libreria HTML Agility Pack (HAP), non direttamente.

L'HAP è ottimo per ottenere una singola pagina e analizzarla, ma non è progettata per le interazioni continue. Le cose che mancano sono la gestione dei cookie, l'interazione con JavaScript e altro.

Per accedere probabilmente è necessario inviare un POST HTTP al server, inclusi i dati che si desidera - l'HAP non può essere d'aiuto.

È necessario utilizzare una classe come WebRequest per creare il post. Suggerisco di guardare fiddler e di utilizzarlo per vedere come dovrebbe apparire la richiesta e costruirla di conseguenza, anche se questo potrebbe essere solo il primo passo.

Si consiglia di esaminare l'utilizzo di strumenti di automazione Web come selenium o WatiN.

+0

Grazie per il vostro aiuto. ho dato un'occhiata ma ho sicuramente bisogno di usare HTMLAgilityPack a causa della strana codifica sorgente del sito Web in cui mi sto collegando. Ho fatto qualcosa dobut sono un po 'bloccato in seguito: accedo tramite il webbrowser1 control e poi recupero il cookie per quella sessione. Posso applicare quel cookie e aprire una pagina usando quel cookie usando HTMLAgilityPack? – touyets

+1

@ user1842134 - No, l'HAP non funziona e non può gestire i cookie. – Oded

+0

ok grazie mille – touyets

0

Non so se si sta utilizzando il controllo WebBrowser WPF, ma se siete, è possibile utilizzare qualcosa sulla falsariga di

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

Questo è ciò che funziona per me.

2

È necessario osservare la richiesta POST tramite il violinista e vedere come è strutturata. per esempio:

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

Di solito, un sito sarebbe riconoscere che si è connessi ricevendo il loro cookie nelle vostre richieste.

HttpClient di default invia i cookie ricevuti da un dominio specifico con ogni richiesta sequenziale a quel dominio (Fino a smaltire che HttpClient esempio)

1) Creare un contenitore di cookie ed essere associato al vostro esempio HttpClient.

2) Utilizzare HttpClient per effettuare la richiesta POST di accesso.

3) Utilizzare HttpClient per effettuare la richiesta di dati GET.

4) Leggere la stringa html dalla risposta.

5) Utilizzare HtmlAgilityPack HtmlDocument per caricare il documento dalla stringa html e non dal Web (come mostrano la maggior parte degli esempi).

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); 
}