检查我的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控件,我无法访问“GetElementFromPoint()”因为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 )。
有时它是一个小小的错误(调整窗口大小,更改标签),事件处理程序不再触发。