我正忙于在C#中编写BHO(浏览器助手对象),我需要将事件处理程序附加到输入元素上的所有onclick事件.我没有使用visual studio提供的内置web浏览器,而是启动了客户端PC上安装的Internet Explorer的新实例.使用不同版本的IE时会出现问题.
在IE7和IE8中,我可以这样做:
public void attachEventHandler(HTMLDocument doc)
{
IHTMLElementCollection els = doc.all;
foreach (IHTMLElement el in els)
{
if(el.tagName == "INPUT")
{
HTMLInputElementClass inputElement = el as HTMLInputElementClass;
if (inputElement.IHTMLInputElement_type != "text" && InputElement.IHTMLInputElement_type != "password")
{
inputElement.HTMLButtonElementEvents_Event_onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很有效,事实是,IE6在转换为HTMLInputElementClass时会抛出一个错误,所以你被迫转换为DispHTMLInputElement:
public void attachEventHandler(HTMLDocument doc)
{
IHTMLElementCollection els = doc.all;
foreach (IHTMLElement el in els)
{
if(el.tagName == "INPUT")
{
DispHTMLInputElement inputElement = el as DispHTMLInputElement;
if (inputElement.type != "text" && inputElement.type != "password") …Run Code Online (Sandbox Code Playgroud) 我试图获取Internet Explorer Web浏览器窗口的文本内容.
我遵循以下步骤:
编辑
我的问题是
我尝试了一种递归方法,但我对如何处理这样的场景毫无头绪,
<div>
Hello World 1
<div style="display: none">Hello world 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将无法获得"Hello World 1"
任何人都可以帮助我找到从IHTMLDocument2*获取文本的最佳方法.我使用的是C++ Win32,没有MFC,ATL.
谢谢,Ashish.
我正在尝试使用Excel中的VBA 从此站点获取数据.我试图做的和有用的是使用像这样的InternetExplorer对象:
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "http://zertifikate.finanztreff.de"
IE.document.getElementById("USFsecuritySearchDropDown").Value = "DE000BP5TBQ2"
IE.document.getElementById("USFsecuritySearchDropDownForm").submit
Do While IE.Busy Or IE.readyState <> 4 'wait until page is loaded
Application.Wait DateAdd("s", 1, Now)
Loop
MsgBox IE.document.getElementById("BP5TBQ~30~5").innerHTML
Run Code Online (Sandbox Code Playgroud)
然而,这工作非常缓慢,并没有得到总是正确的结果.我怀疑有时它不会等到网页加载.我试图寻找答案,我在stackoverflow上找到了这个答案.现在我想弄清楚如何使用MSXML2和MSHTML重写我的宏.到目前为止,我能够做到这一点:
Dim IE As MSXML2.XMLHTTP60
Set IE = New MSXML2.XMLHTTP60
IE.Open "GET", "http://zertifikate.finanztreff.de", False
IE.send
While IE.ReadyState <> 4
DoEvents
Wend
Dim HTMLDoc As MSHTML.HTMLDocument
Dim htmlBody As MSHTML.htmlBody
Set HTMLDoc = New MSHTML.HTMLDocument
Set htmlBody = HTMLDoc.body
htmlBody.innerHTML = …Run Code Online (Sandbox Code Playgroud) 我可以使用mshtml完成我需要做的大部分工作,但是我对如何将复选框输入元素设置为"已检查"感到困惑.这是情况......
IHTMLElementCollection inputElements = (IHTMLElementCollection)doc.all.tags("input");
foreach (IHTMLElement el in inputElements)
{
string elementHtml = el.outerHTML;
string termsOfServiceIdentifier = "id=chkUTOS_ver2";
// select the Terms of Service checkbox
if (elementHtml.Contains(termsOfServiceIdentifier))
{
HTMLInputElement chkTOS = (HTMLInputElement)el;
chkTOS.@checked = true; // that's the solution. Thanks Wayne.
}
else
{
// do nothing - we're not interested in this element
}
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
格雷格
在C#中,我设法从InternetExplorer对象获取整个HTMLDocumentClass(导航到某个URL).
但是,在Visual Studio 2008的调试模式下,此特定URL的HTMLDocumentClass的内容是MASSIVE,包括activeElement,alinkColor,all,applets,charset,childNodes等属性等.
该页面中有一个按钮,我希望将其更改为"Clicked".但我不知道如何找到该按钮的名称/ ID /标签.有一个简单的教程,使用如下语句:
HTMLInputElement button =
(HTMLInputElement)theDoc.getElementById("Button1");
button.click();
Run Code Online (Sandbox Code Playgroud)
但我的网址结构比这复杂100倍.
假设网址是yahoo.com,我想"点击"网络搜索按钮.
有任何系统的方式来解决这个问题?
我有一个TWebBrowser放在一个启用了designMode的表单上.
浏览器Bellow我有一个关闭按钮,标题设置为'Clos&e'.
当我在WebBrowser中编辑文档的内容时,按下键E,调用按钮关闭.
它似乎正在处理TWebBrowser,就像其他不处理键和/或不接受字符的控件一样(例如TButton).
我怎么解决这个问题?
提前致谢.
是否有另一种方法可以在不使用Application.ProcessMessages的情况下加载MSHTML文档?
要将文档加载到IHTMLDocument中,我需要这样做:
while Doc.readyState <> 'complete' do
Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)
我希望在加载过程中不处理所有的消息队列,因为我将改变我的应用程序流,换句话说,在完成加载之后应该处理的一些消息可以更早地处理,甚至在加载结束之前.
IHTMLDocument期望在加载过程中有一个特殊的消息代码?还是有另一种加载方式?
如何从IHTMLDocument2获取所有mshtml.IHTMLDivElement?
private mshtml.IHTMLDocument2 doc = (IHTMLDocument2)WPFBrowser.Document;
???
List<mshtml.IHTMLDivElement> allDivs = ???
Run Code Online (Sandbox Code Playgroud) 我想在TWebbrowser中运行一个javascript代码并获取它的控制台输出.例如,如果我在控制台中运行此代码:
var a = 2; var b = 3; var c = a +b ; console.log('The result is '+ c);
Run Code Online (Sandbox Code Playgroud)
我在控制台上得到这个输出:
The result is 5
Run Code Online (Sandbox Code Playgroud)
我用来运行带有TWebbrowser的JS脚本的代码是这样的:
twebbrowser1.navigate('javascript:var a = 2; var b = 3; var c = a +b ; console.log('The result is '+ c);');
Run Code Online (Sandbox Code Playgroud)
它工作,但我不知道如何获得控制台输出.有办法吗?
提前致谢 !
我目前正在使用MS HTML将JavaScript代码插入到网站中.
我引用了Microsoft HTML Object Library并输入了这段代码.
IHTMLDocument2 doc = BrowserHost.Document as HTMLDocumentClass;
IHTMLElement head = (IHTMLElement)
((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject =
(IHTMLScriptElement)doc.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = TTS.TTSWebFactory.GetJavascript();
((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject);
Run Code Online (Sandbox Code Playgroud)
我在脚本的最后一行收到错误,这是消息.
Unable to cast COM object of type 'System._ComObject' to class type
'mshtml.HTMLHeadElementClass'. COM components that enter the CLR and do not
support IProvideClassInfo or that do not havae any iterop assembly registered
will be wrapped in the _ComObject type. Instances of this type cannot be cast
to any other class; …Run Code Online (Sandbox Code Playgroud) 如何打开Internet Explorer窗口或选项卡,导航它并使用c#和mshtml库获取她的文档(HTMLDocument或InternetExplorer).IE对象的类型应该是HTMLDocument或InternetExplorer.
使用.NET WebBrowser控件,执行HtmlElement的成员非常简单.
假设有一个名为"player"的JavaScript对象,其成员名为"getLastSongPlayed"; 从.NET WebBrowser控件调用它将是这样的:
HtmlElement elem = webBrowser1.Document.getElementById("player");
elem.InvokeMember("getLastSongPlayed");
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何使用mshtml实现这一目标?
在此先感谢,阿尔丁
编辑:
我把它运行起来,看下面的答案!