2012-11-26 76 views
11

Trong mã bên dưới, tôi có thể đặt giá trị của tên người dùng và mật khẩu bằng HTMLAgilitypack nhưng tôi không thể gọi sự kiện nhấp chuột của nút đăng nhập (id trong mã nguồn của nút là "s1 ").đăng nhập vào trang web bằng HTMLAgilityPack

Có cách nào để thực hiện việc này không? Lý do tôi không sử dụng WebBrowser là vì tôi sẽ cần HTMLAgilityPack để truy xuất dữ liệu từ trang mà không có ID trong mã nguồn.

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

Trả lời

5

Có cách nào để thực hiện việc này không?

Không có thư viện HTML Agility Pack (HAP) cung cấp - không trực tiếp.

HAP là tuyệt vời để có được một trang và phân tích cú pháp trang đó, nhưng nó không được thiết kế cho các tương tác liên tục. Những thứ bị thiếu là quản lý cookie, tương tác JavaScript và hơn thế nữa.

Để đăng nhập, bạn có thể cần gửi một HTTP POST tới máy chủ, bao gồm dữ liệu bạn muốn - HAP không thể trợ giúp điều đó.

Bạn cần sử dụng một lớp như WebRequest để tạo bài đăng - tôi đề xuất xem fiddler và sử dụng nó để xem yêu cầu sẽ trông như thế nào và xây dựng nó cho phù hợp, mặc dù đó có thể chỉ là bước đầu tiên.

Bạn có thể muốn điều tra việc sử dụng các công cụ tự động hóa web như selenium hoặc WatiN thay thế.

+0

Cảm ơn sự giúp đỡ của bạn. tôi đã xem nhưng tôi chắc chắn cần sử dụng HTMLAgilityPack do mã nguồn lạ của trang web tôi đang đăng nhập vào. Tôi đã làm điều gì đó dobut i am một chút bị mắc kẹt sau đó: Tôi đăng nhập thông qua teh webbrowser1 controla nd sau đó lấy cookie cho phiên đó. Tôi có thể áp dụng cookie đó và mở một trang bằng cách sử dụng cookie đó bằng cách sử dụng HTMLAgilityPack không? – touyets

+1

@ user1842134 - Không, HAP không và không thể xử lý cookie. – Oded

+0

ok cảm ơn bạn rất nhiều – touyets

0

Tôi không biết nếu bạn đang sử dụng điều khiển WebBrowser WPF, nhưng nếu bạn đang có, bạn có thể sử dụng một cái gì đó dọc theo dòng của

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

Đó là những gì làm việc cho tôi.

2

Bạn cần tuân thủ yêu cầu POST qua trình duyệt và xem cấu trúc được cấu trúc như thế nào. Ví dụ: :

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

Thông thường, một trang web sẽ nhận ra rằng bạn đã đăng nhập bằng cách nhận cookie theo yêu cầu của bạn.

HttpClient theo mặc định sẽ gửi cookie nhận được từ một tên miền cụ thể với mỗi yêu cầu tuần tự đến tên miền đó (Cho đến khi bạn vứt bỏ mà HttpClient dụ)

1) Tạo vùng chứa cookie và giao nó để dụ HttpClient của bạn.

2) Sử dụng HttpClient để thực hiện yêu cầu POST đăng nhập.

3) Sử dụng HttpClient để thực hiện yêu cầu GET dữ liệu.

4) Đọc chuỗi html từ câu trả lời.

5) Sử dụng HtmlAgilityPack HtmlDocument để tải tài liệu từ chuỗi html chứ không phải từ web (như hầu hết các ví dụ hiển thị).

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); 
} 
Các vấn đề liên quan