sourcecode

C# WebBrowser 컨트롤 -- AJAX 이후에 문서 요소를 가져오시겠습니까?

copyscript 2023. 10. 1. 21:53
반응형

C# WebBrowser 컨트롤 -- AJAX 이후에 문서 요소를 가져오시겠습니까?

웹브라우저 컨트롤을 사용하여 새로운 컨텐츠/요소를 추가하는 AJAX로 변경할 수 있는 웹 컨텐츠를 볼 수 있는 어플리케이션을 작성합니다.아무리 노력해도 새로운 요소를 얻을 수가 없는 것 같습니다.브라우저 Ctl.문서텍스트에는 최신 페이지가 없으며 당연히 "뷰 소스"에도 없습니다.

이 컨트롤을 사용하여 이 새 데이터를 가져올 방법이 있습니까? :( 도와주세요.감사합니다!

IE:

Browser.Navigate("www.somewebpagewithAJAX.com");
//Code that waits for browser to finish...
...
//WebBrowser control has loaded content and AJAX has loaded new content
// (is visible at runtime on form) but can't see them in Browser.Document.All
// or Browser.DocumentText :(

제가 대신 문제를 풀었습니다.

핵심은 핸들러를 부착하는 것입니다.onPropertyChangedajax 호출을 통해 채워지는 div 요소의 이벤트.

HtmlElement target = webBrowser.Document.GetElementById("div_populated_by_ajax");

if (target != null)
{
      target.AttachEventHandler("onpropertychange", handler);
}

그리고 마지막으로,

private void handler(Object sender, EventArgs e)
{
      HtmlElement div = webBrowser.Document.GetElementById("div_populated_by_ajax");
      if (div == null) return;
      String contentLoaded = div.InnerHtml; // get the content loaded via ajax
}
using System;
using System.Windows.Forms;

namespace WebBrowserDemo
{
    class Program
    {
        public const string TestUrl = "http://www.w3schools.com/Ajax/tryit_view.asp?filename=tryajax_first";

        [STAThread]
        static void Main(string[] args)
        {
            WebBrowser wb = new WebBrowser();
            wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
            wb.Navigate(TestUrl);

            while (wb.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }

            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey(true);
        }

        static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser wb = (WebBrowser)sender;

            HtmlElement document = wb.Document.GetElementsByTagName("html")[0];
            HtmlElement button = wb.Document.GetElementsByTagName("button")[0];

            Console.WriteLine(document.OuterHtml + "\n");

            button.InvokeMember("Click");

            Console.WriteLine(document.OuterHtml);           
        }
    }
}

DOM을 사용해야 합니다.웹 브라우저를 캐스팅합니다.문서.돔 문서에서 IHTML 문서로?일부 COM 인터페이스 또는 Microsoft.mshtml 어셈블리를 가져와야 합니다.

자세한 정보는 http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx 에서 확인할 수 있습니다.

Ajax 요청에서 생성된 내용을 읽고 있으므로 관련 데이터가 로드되는 지점까지 사용자가 애플리케이션을 진행해야 하므로 데이터를 읽기 위해 코드를 실행해야 합니다.

그렇지 않다면 이 프로세스를 자동화하여 읽고 싶은 DOM 노드를 구축하는 클릭 이벤트를 생성해야 합니다.저는 웹브라우저 컨트롤로 이 작업을 다소 일반적으로 수행하며 해당 기능 계층을 자바스크립트로 작성하고 를 호출하는 경향이 있습니다.스크립트()를 호출합니다.또 다른 경로는 C#에서 Ajax 기능을 실행하고 클릭 이벤트를 수동으로 트리거하는 노드를 찾는 것입니다.

HtmlElement content = webMain.Document.GetElementById("content");
content.RaiseEvent("onclick");

위 스크립트에서 주목해야 할 중요한 측면은 HtmlElement 개체 유형의 제한을 수용하고 해결하면 C#에서 순진하게 DOM 노드와 상호 작용할 수 있다는 사실입니다.

자바스크립트를 실행하여 요소에 캡션을 붙여 새로운 창에 표시하는 것은 어떻습니까?

시험해 본 적은 없지만 잘 될 수도 있습니다.

(WebBrowser)w.Navigate("javascript:GetElementById('div').innerHtml;", true);

새 창에서 반환을 여는 진정한 속성. (또는 프레임 또는 더 나은 방법을 찾을 수 있음)

새 Windows 이벤트를 캡처하려면 Windows/System32 폴더에 있는 SHDocVw.dll을 참조해야 합니다.그러면 다음과 같이 웹 브라우저 컨트롤을 캐스트할 수 있습니다.

SHDocVw.WebBrowser_V1 browser = (SHDocVw.WebBrowser_V1)(WebBrowser)w.ActiveXInstance;

응답을 저장한 후 바로 닫으실 수 있습니다.행운을 빌어요 그리고 어떻게 진행되는지 알려주세요.

웹브라우저에 없는 정보입니다.문서 텍스트?http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documenttext.aspx

당신은 웹페이지를 통제합니까?

그렇다면 다음과 같은 방법을 설명하는 블로그 게시물이 있습니다. http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html

그렇지 않다면 해결책이 있을 텐데 도와드릴 수가 없네요, 죄송합니다.

언급URL : https://stackoverflow.com/questions/635948/c-sharp-webbrowser-control-get-document-elements-after-ajax

반응형