2011-06-12 3 views
12

웹 페이지에서 일부 JS 스크립트를 호출하는 데이 스크립트를 사용하고 싶습니다. 나는이 있습니다콘솔 응용 프로그램에서 WebBrowser 사용

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

왜이 단어는 다운 voted입니까? – Amy

답변

10

올바른 생각, 잘못된 실행. WebBrowser.Navigate()는 웹 브라우저가 으로 시작하고 요청한 웹 페이지로 이동하여으로 이동합니다. 시간이 오래 걸리며 일반적으로 수백 밀리 초가 소요됩니다. Internet Explorer는 내부적으로 스레드를 시작하여 작업을 완료합니다. DocumentCompleted 이벤트를 발생시켜 완료 시점을 알려줍니다. 당신은 그렇게 기다리지 않아도 크래시가 먼저 일어난다.

다음 문제는 코드에서 DocumentCompleted 이벤트가 발생하지 않는다는 것입니다. STA 계약을 존중해야하며 메시지 루프를 보내야합니다. IE가 웹 페이지를 검색하는 데 사용하는 것처럼 백그라운드 스레드가 스레드에게 작업이 완료되었다고 알려줍니다.

필요한 상용구 코드는 this answer입니다.

+0

체이닝 활동에 대해 어떻게 생각하십니까? 일부 페이지로 이동 한 다음 텍스트 상자에 텍스트를 입력하고 검색을 클릭하거나 이동하려고합니다. WebBrowser 객체를 전역으로 만든 다음 4 개의 메소드를 연결하고, 탐색하고, 문서를 탐색하고, 텍스트를 입력하고 이동하고, entertextandhitgo의 문서 완료 이벤트를 연결해야합니까? – NathanTempelman

+1

상태 시스템은 비동기 프로그래밍 문제에 대한 간단한 솔루션입니다. 정수 또는 열거 형을 사용하여 상태를 추적하면됩니다. –

+1

그냥 부작용 : 사용자 상호 작용없이 WebBrowser 컨트롤을 자동화하려고 할 때'webBrowser.ScriptErrorsSuppressed = true' *를 설정하지 않으면 팝업 대화 상자에서 심각한 문제가 발생합니다 (이름에도 불구하고 모든 대화 상자가 표시되지 않음) 스크립트 오류가 아닙니다.) *. [또한보십시오] (http://stackoverflow.com/a/20612526/238419). –

관련 문제