检查我的WPF WebBrowser中的元素,使用“inspect element(s)”(IE,Chrome,Firefox)获取css路径(“copy css-path”)

我需要来自网页的正确的css路径,该路径将显示在我的WPF应用程序中(稍后将使用HTMLAgilityPack和/或Fizzler)。

像这样的 “复制css-path”或xpath(FireBug)应该是最终目标。

我还发现了一些有趣的post:

  • 堆栈溢出
  • 堆栈溢出
  • 堆栈溢出
  • CodeProject上

他们都使用“webBrowser.Document.GetElementFromPoint”,“webBrowser.GetElementFromPoint”或“PointToClient”,但我无法在任何库中找到它,甚至在msdn.microsoft(WebBrowser类)上也找不到它

顺便说一句,我使用visual studio 2010工具箱中的“WebBrowserControl”来显示我的网页。

然后我在客户端发现了一些function,但这不是他们想要的东西( javascript )……

更新时间:6月12日,下午8:15

这实际上是“迪克”的一个不错的post :

private void myBrowser_LoadCompleted(object sender, NavigationEventArgs e) { dynamic doc = myBrowser.Document; dynamic htmlText = doc.documentElement.InnerHtml; string htmlstring = htmlText; } 

这有效,但这与我的WPF元素无关。 我只得到html而不是相应的元素。 我可以在那个html文档中搜索文本,但是如果它出现不止一次,它就不再是唯一的了。

更新时间:6月13日上午07:15

根据本教程,我找到了一种解决方法。

我在“.xaml”中包含了这个命名空间:

 xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 

然后我添加了旧的winforms浏览器:

      

添加到我的“MainWindow()”一个起始值:

 MainWindow(){ (wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.google.de/"); } 

实际部分,获取元素:

  /* System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; ...myMethod(..., (wfhSample.Child as System.Windows.Forms.WebBrowser), point.X, point.Y); */ ...myMethod(...,System.Windows.Forms.WebBrowser refWebBrowser2,Int32 valScreenX, Int32 valScreenY,....){ Point refPoint = refWebBrowser2.PointToClient(new Point(valScreenX, valScreenY)); System.Windows.Forms.HtmlElement refHtmlElement = refWebBrowser2.Document.GetElementFromPoint(refPoint); //System.Drawing() return refHtmlElement.TagName; } 

现在唯一的问题是事件处理程序不会触发(我在属性窗口中添加了它们):

 //winforms-browser private void wfhSample_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { MessageBox.Show("old"); } //wpf-browser private void browser_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { MessageBox.Show("new"); } 

为什么我不能覆盖事件处理程序(甚至不是右键)?

更新时间:6月13日上午07:45

这可能是一篇有用的文章,我会检查一下。

更新时间:6月16日,上午07:00

现在我找到了一个解决方案,我可以处理wpf-webbrowser的事件,但不能处理旧的winforms-browser。

  //new WPF webbrowser private void browser_LoadCompleted(object sender, NavigationEventArgs e) { mshtml.HTMLDocument doc; doc = (mshtml.HTMLDocument)browser.Document; mshtml.HTMLDocumentEvents2_Event iEvent; iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(NewClickEventHandler); } private bool NewClickEventHandler(mshtml.IHTMLEventObj e) { //the click event handler works, but I have no access to "GetElementFromPoint" // it does not exist //Point refPoint = browser.PointToClient(new Point(valScreenX, valScreenY)); //System.Windows.Forms.HtmlElement refHtmlElement = browser.Document.GetElementFromPoint(refPoint); //return refHtmlElement.TagName; //because the new wpf control does not support for example 'GetElementFromPoint()' // I need to get the html controls conntected to the wpf cursor } 

这帮助我和我在我的wpf应用程序中将Winforms webbrowser的事件处理更改为:

 //old Winforms webbrowser private void wfhSample_ChildChanged(object sender, System.Windows.Forms.Integration.ChildChangedEventArgs e) { //registering the event here, //calling "OldClickEventHandler" does not work I get a "NullReferenceException" for "_docEvent" HTMLDocumentEvents2_Event _docEvent= (HTMLDocumentEvents2_Event)(wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; _docEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(OldClickEventHandler); } private bool OldClickEventHandler(mshtml.IHTMLEventObj e) { } 

目前我仍然没有从我在WPF应用程序中选择的webbrowser中获取元素,一方面我对旧webforms webbrowser的事件有问题,在那里我得到一个“NullReferenceException”(实际上它不应该从我的观点来看是空的)另一方面,对于我的新(wpf)webbrowser控件,我无法访问“Ge​​tElementFromPoint()”因为wpf webbrowser控件似乎不存在。

更新时间:6月17日上午10:00

看起来

 (HTMLDocumentEvents2_Event)(wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; 

在“wfhSample_ChildChanged”里面还没有准备好,因为当我把相同的声明放在一边时:

 (HTMLDocumentEvents2_Event)(wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; 

进入“NewClickEventHandler(mshtml.IHTMLEventObj e)”它中包含所需的数据(但这是错误的事件处理程序)。

所以,现在我需要为旧的wpf浏览器找到正确/适当的事件处理程序。

更新时间:6月17日上午11:30

好的,现在我找到了基于这篇文章的解决方案,我将代码更改为:

  private void wfhSample_Loaded(object sender, RoutedEventArgs e) { bool complete = false; (wfhSample.Child as System.Windows.Forms.WebBrowser).DocumentCompleted += delegate { if (complete) return; complete = true; // DocumentCompleted is fired before window.onload and body.onload (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.Window.AttachEventHandler("onload", delegate { // Defer this to make sure all possible onload event handlers got fired System.Threading.SynchronizationContext.Current.Post(delegate { // try webBrowser1.Document.GetElementById("id") here //System.Windows.MessageBox.Show("window.onload was fired, can access DOM!"); var bla = (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; HTMLDocumentEvents2_Event _docEvent = (HTMLDocumentEvents2_Event)(wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; _docEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(OldClickEventHandler); }, null); }); }; (wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.example.com"); } private bool OldClickEventHandler(mshtml.IHTMLEventObj e) { System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; System.Drawing.Point refPoint = (wfhSample.Child as System.Windows.Forms.WebBrowser).PointToClient(new System.Drawing.Point(point.X, point.Y)); System.Windows.Forms.HtmlElement refHtmlElement = (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.GetElementFromPoint(refPoint); var restult = refHtmlElement.TagName; //this is what I need for the first time,to continue return true; } 

并且旧控件的事件处理工作:)

但是“var restult = refHtmlElement.TagName;” 返回“NullReferenceException”,坐标似乎有问题。

一旦我有解决方案,我会发布它或如果你有一个想法,你也可以帮助:)

好的,我找到了一个包含winform webbrowser的解决方案到我的wpf应用程序中(看看我的问题,流程和资源):

1. .xaml部分(命名空间)( 更多细节 ):

 xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 

2. .xaml部分(WebBrowser)( 更多细节 ):

      

3.文件背后的代码( 更多细节 ):

  private void wfhSample_Loaded(object sender, RoutedEventArgs e) { bool complete = false; (wfhSample.Child as System.Windows.Forms.WebBrowser).DocumentCompleted += delegate { if (complete) return; complete = true; // DocumentCompleted is fired before window.onload and body.onload (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.Window.AttachEventHandler("onload", delegate { // Defer this to make sure all possible onload event handlers got fired System.Threading.SynchronizationContext.Current.Post(delegate { // try webBrowser1.Document.GetElementById("id") here //System.Windows.MessageBox.Show("window.onload was fired, can access DOM!"); var bla = (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; HTMLDocumentEvents2_Event _docEvent = (HTMLDocumentEvents2_Event)(wfhSample.Child as System.Windows.Forms.WebBrowser).Document.DomDocument; _docEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(OldClickEventHandler); }, null); }); }; (wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.example.com"); } private bool OldClickEventHandler(mshtml.IHTMLEventObj e) { System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; System.Drawing.Point refPoint = (wfhSample.Child as System.Windows.Forms.WebBrowser).PointToClient(new System.Drawing.Point(point.X, point.Y)); System.Windows.Forms.HtmlElement refHtmlElement = (wfhSample.Child as System.Windows.Forms.WebBrowser).Document.GetElementFromPoint(refPoint); var restult = refHtmlElement.TagName; return true; } 

4.要获得完整的CSS-Path或XPath,您可以使用Fizzler,HTMLAgilityPack( this )。

有时它是一个小小的错误(调整窗口大小,更改标签),事件处理程序不再触发。