2011-06-12 16 views
12

मैं वेबपृष्ठ पर कुछ जेएस स्क्रिप्ट्स को आमंत्रित करने के लिए इसका उपयोग करना चाहता हूं। मैं इस है:कंसोल एप्लिकेशन में वेबब्रोसर का उपयोग

static void Stuff() 
    { 
     WebBrowser browser = new WebBrowser(); 
     browser.Navigate("http://www.iana.org/domains/example/"); 
     HtmlDocument doc = browser.Document; 
     //doc.InvokeScript("someScript"); 
     Console.WriteLine(doc.ToString()); 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("hi"); 
     var t = new Thread(Stuff); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

प्रश्न 1: मैं एक "ऑब्जेक्ट संदर्भ सेट नहीं" जब मैं doc.ToString() प्राप्त करने की कोशिश अपवाद। क्यूं कर?

प्रश्न 2: मैं HTML दस्तावेज़ से मुख्य प्रोग्राम में कुछ डेटा कैसे प्राप्त करूं? WebBrowser को एक अलग थ्रेड की आवश्यकता होती है, जिसके लिए एक स्थिर विधि की आवश्यकता होती है जो किसी भी मूल्य को वापस नहीं कर सकता है। मैं docMain() पर कैसे लौटूं, तो मैं इसके साथ कुछ कर सकता हूं?

+0

स्थिर तरीके वास्तव में एक मूल्य वापस कर सकते हैं। यह धागे जो नहीं कर सकते हैं। इसके अलावा, धागे * एक गैर स्थैतिक विधि का उपयोग कर सकते हैं। – icktoofay

+0

यह क्यों कम किया जा रहा है? – Amy

उत्तर

10

सही विचार, गलत निष्पादन। WebBrowser.Navigate() केवल वेब ब्राउज़र को से शुरू होने वाले वेब पेज पर नेविगेट करने के लिए बताता है। इसमें समय लगता है, आम तौर पर सैकड़ों मिलीसेकंड। इंटरनेट एक्सप्लोरर आंतरिक रूप से नौकरी पाने के लिए थ्रेड शुरू करता है। यह आपको बताता है कि जब दस्तावेज़ पूर्ण घटना को बढ़ाकर किया जाता है। आप इसके लिए इंतजार नहीं करते हैं ताकि पहले दुर्घटनाग्रस्त शहर हो।

अगला समस्या यह है कि दस्तावेज़ पूर्ण घटना आपके कोड में नहीं उठाई जाएगी। आपको एसटीए अनुबंध का सम्मान करना होगा, इसके लिए आपको एक संदेश लूप पंप करने की आवश्यकता है। यह एक शक्तिशाली धागा है कि एक पृष्ठभूमि धागा, जिस तरह से IE वेब पेज पुनर्प्राप्त करने के लिए उपयोग करता है, धागा बताता है कि काम पूरा हो गया है।

आपको आवश्यक बॉयलरप्लेट कोड this answer में उपलब्ध है।

+0

आप चेनिंग गतिविधियों के बारे में कैसे जाएंगे? आप कुछ पेज पर नेविगेट करना चाहते हैं, फिर टेक्स्ट बॉक्स में कुछ टेक्स्ट दर्ज करें, और खोज पर क्लिक करें या जाएं। क्या आपको वेबब्राउज़र ऑब्जेक्ट ग्लोबल बनाने की ज़रूरत है, और उसके बाद 4 विधियों को एक साथ ले जाएं, नेविगेट करें, नेविगेट के दस्तावेज़ को पूरा करें, टेक्स्ट दर्ज करें और हिट जाएं, एंटरटेक्स्ट और हिटगो का दस्तावेज़ पूरा हो गया है? – NathanTempelman

+1

एक राज्य मशीन एसिंक्रोनस प्रोग्रामिंग समस्याओं का सरल समाधान है। बस एक पूर्णांक या enum के साथ राज्य का ट्रैक रखें। –

+1

बस एक साइड-नोट: जब कोई उपयोगकर्ता इंटरैक्शन नहीं होता है, तो वेबब्राउज़र नियंत्रण को स्वचालित करने का प्रयास करते समय, आप पॉपअप-डायलॉग के साथ गंभीर समस्याओं में भाग लेंगे जबतक कि आप 'webBrowser.ScriptErrorsSuppressed = true' * सेट नहीं करते हैं (जो, इसके नाम के बावजूद, सभी संवादों को दबाता है , न केवल स्क्रिप्ट त्रुटियों) *। [यह भी देखें] (http://stackoverflow.com/a/20612526/238419)। –

संबंधित मुद्दे