2011-06-12 43 views
12

Tôi muốn sử dụng nó để gọi một số tập lệnh JS trên trang web. Tôi có điều này:Sử dụng WebBrowser trong ứng dụng bảng điều khiển

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

Câu hỏi 1: Tôi nhận được ngoại lệ "đối tượng không được đặt" khi cố gắng lấy doc.ToString(). Tại sao?

Câu hỏi 2: Làm cách nào để lấy một số dữ liệu từ tài liệu HTML vào chương trình chính? WebBrowser yêu cầu một chuỗi riêng biệt, yêu cầu phương thức tĩnh không thể trả về bất kỳ giá trị nào. Làm thế nào để tôi quay lại, ví dụ: doc đến Main() để tôi có thể làm điều gì đó với nó?

+0

Phương pháp tĩnh thực sự có thể trả về giá trị. Đó là chủ đề không thể. Ngoài ra, chủ đề * có thể * sử dụng phương pháp không tĩnh. – icktoofay

+0

Tại sao điều này bị giảm giá? – Amy

Trả lời

10

Ý tưởng đúng, thực hiện sai. WebBrowser.Navigate() chỉ cho trình duyệt web biết bắt đầu điều hướng đến trang web bạn yêu cầu. Điều đó cần có thời gian, hàng trăm mili giây thường. Internet Explorer trong nội bộ bắt đầu các chuỗi để hoàn thành công việc. Nó cho bạn biết khi nào nó được thực hiện bằng cách tăng sự kiện DocumentCompleted. Bạn không chờ đợi cho rằng vì vậy đó là thành phố sụp đổ đầu tiên.

Sự cố tiếp theo là sự kiện DocumentCompleted sẽ không được tăng lên trong mã của bạn. Bạn phải tôn trọng hợp đồng STA, nó đòi hỏi bạn phải bơm một vòng lặp tin nhắn. Đó là cách hoàn toàn mạnh mẽ mà một chuỗi nền, giống như một trình duyệt mà IE sử dụng để truy xuất một trang web, cho biết chủ đề của bạn rằng công việc đã hoàn thành.

Mã bản mẫu bạn cần có sẵn trong this answer.

+0

Làm thế nào bạn sẽ đi về các hoạt động chuỗi? Bạn muốn điều hướng đến một số trang, sau đó nhập một số văn bản vào hộp văn bản và nhấp vào tìm kiếm hoặc đi. Bạn có cần phải chỉ cần làm cho đối tượng WebBrowser toàn cầu, và sau đó chuỗi lại với nhau 4 phương pháp, điều hướng, tài liệu điều hướng hoàn thành, nhập văn bản và nhấn đi, tài liệu của entertextandhitgo hoàn thành sự kiện? – NathanTempelman

+1

Máy trạng thái là giải pháp đơn giản cho các vấn đề lập trình không đồng bộ. Chỉ cần theo dõi trạng thái với một số nguyên hoặc một enum. –

+1

Chỉ cần một lưu ý: khi cố gắng tự động điều khiển WebBrowser mà không có sự tương tác của người dùng, bạn sẽ gặp phải các vấn đề nghiêm trọng với hộp thoại bật lên trừ khi bạn đặt 'webBrowser.ScriptErrorsSuppressed = true' * (mặc dù tên của nó, chặn tất cả các hộp thoại , không chỉ lỗi kịch bản) *. [Xem thêm] (http://stackoverflow.com/a/20612526/238419). –

Các vấn đề liên quan