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 :(
제가 대신 문제를 풀었습니다.
핵심은 핸들러를 부착하는 것입니다.onPropertyChanged
ajax 호출을 통해 채워지는 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
'sourcecode' 카테고리의 다른 글
행을 열로 동적으로 변환하는 Mysql 쿼리 (0) | 2023.10.01 |
---|---|
총알 포인트로 UI 레이블을 포맷하시겠습니까? (0) | 2023.10.01 |
VS 2010에서 C# 앱의 릴리스 빌드를 "디버깅"할 수 있습니까? (0) | 2023.10.01 |
ng include를 사용할 경우 추가 DOM 노드 사용을 방지합니다. (0) | 2023.10.01 |
모바일 사파리 : 입력 필드의 자바스크립트 포커스() 메소드는 클릭에서만 작동합니까? (0) | 2023.10.01 |