2012-11-26 23 views
11

का उपयोग कर वेबसाइट पर लॉगिन करें नीचे दिए गए कोड में, मैं HTMLAgilitypack का उपयोग कर उपयोगकर्ता नाम और पासवर्ड का मान सेट कर सकता हूं लेकिन मैं लॉगिन बटन के क्लिक ईवेंट को नहीं बुला सकता (बटन के स्रोत कोड में आईडी "s1 है ")।HTMLAgilityPack

क्या ऐसा करने के लिए वैसे भी है? कारण मैं WebBrowser का उपयोग नहीं कर रहा हूं क्योंकि मुझे स्रोत कोड में आईडी के बिना पृष्ठ से डेटा पुनर्प्राप्त करने के लिए HTMLAgilityPack की आवश्यकता होगी।

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

उत्तर

5

वहाँ वैसे भी है इस के लिए किया जाना है?

एचटीएमएल एजिलिटी पैक (एचएपी) लाइब्रेरी क्या प्रदान करता है - सीधे नहीं।

एचएपी एक पृष्ठ प्राप्त करने और इसे पार्स करने के लिए बहुत अच्छा है, लेकिन यह निरंतर बातचीत के लिए डिज़ाइन नहीं किया गया है। गायब चीजें कुकी प्रबंधन, जावास्क्रिप्ट इंटरैक्शन और अधिक हैं।

लॉगिन करने के लिए आपको संभवतः सर्वर पर एक HTTP पोस्ट भेजने की आवश्यकता है, जिसमें आप चाहते हैं डेटा सहित - एचएपी उसमें मदद नहीं कर सकता है।

आपको पोस्ट करने के लिए WebRequest जैसी कक्षा का उपयोग करने की आवश्यकता होगी - मैं सुझाव देता हूं कि fiddler पर जाएं और यह देखने के लिए कि यह अनुरोध किस तरह दिखना चाहिए और तदनुसार इसे बनाना चाहिए, हालांकि यह पहला कदम हो सकता है।

आप वेब स्वचालन उपकरण जैसे selenium या WatiN के उपयोग की जांच करना चाहेंगे।

+0

आपकी सहायता के लिए धन्यवाद। मुझे एक नज़र थी लेकिन मुझे निश्चित रूप से HTML वेबसाइट की अजीब स्रोत कोडिंग के कारण HTMLAgilityPack का उपयोग करने की आवश्यकता है, जिसमें मैं लॉग इन कर रहा हूं। मैंने कुछ किया है, मैं थोड़ी देर बाद अटक गया हूं: मैं teh webbrowser1 controla के माध्यम से लॉगिन करता हूं और फिर उस सत्र के लिए कुकी पुनर्प्राप्त करता हूं। क्या मैं उस कुकी को लागू कर सकता हूं और HTMLAgilityPack का उपयोग कर उस कुकी का उपयोग करके एक पृष्ठ खोल सकता हूं? – touyets

+1

@ user1842134 - नहीं, एचएपी कुकीज़ से निपट नहीं सकता है और नहीं कर सकता है। – Oded

+0

ठीक है बहुत बहुत धन्यवाद – touyets

0

मैं तुम्हें WPF WebBrowser नियंत्रण उपयोग कर रहे हैं पता नहीं है, लेकिन अगर आप कर रहे हैं, तो आप

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

क्या मेरे लिए काम करता है कि की तर्ज पर कुछ का उपयोग कर सकते हैं।

2

आपको फिडलर के माध्यम से POST अनुरोध का पालन करना होगा और देखें कि यह कैसे संरचित है। उदाहरण के लिए :

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

आमतौर पर, एक साइट पहचान है कि आप अपने अनुरोध में अपने कुकी प्राप्त द्वारा प्रवेश किया है।

HttpClient डिफ़ॉल्ट रूप से उस डोमेन के लिए प्रत्येक अनुक्रमिक अनुरोध के साथ एक विशिष्ट डोमेन से प्राप्त कुकीज़ भेजता

1) एक कुकी कंटेनर बनाएं (जब तक आप कि HttpClient उदाहरण निपटान) और इसे अपने HttpClient उदाहरण को सौंपा।

2) लॉगिन POST अनुरोध करने के लिए HttpClient का उपयोग करें।

3) डेटा प्राप्त करने के लिए एचटीपी क्लाइंट का उपयोग करें।

4) प्रतिक्रिया से एचटीएमएल स्ट्रिंग पढ़ें।

5) HTML स्ट्रिंग से दस्तावेज़ लोड करने के लिए HtmlAgilityPack HtmlDocument का उपयोग करें और वेब से नहीं (जैसा कि अधिकांश उदाहरण दिखाते हैं)।

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