C# 怎么让IE浏览器运行js脚本

时间:2021-09-24 07:07:50
现在有IE浏览器进程,已经打开某网站,
希望通过C# 让此IE窗口执行某脚本,如<script>alert();</script>

1,不写IE插件
2,不借助第三方浏览器,只针对IE
3,不使用Winform的WebBrowser控件.

知道的朋友给个思路


补充说明:
我使用下面这段代码试了,'aaaaaaaaa'会在页面中显示出来,但是后面那段js脚本却没有运行.很奇怪.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocument doc = Browser.Document as HTMLDocumentClass;
doc.body.innerHTML += "aaaaaaaaa<script type=\"text/javascript\">alert(11);</script>";
}
}

31 个解决方案

#1


mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS

用Microsoft.mshtml.dll可以再c#程序里操作IE。

#2


引用 1 楼 juyangjia 的回复:
mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS

用Microsoft.mshtml.dll可以再c#程序里操作IE。

+1

#3


感谢楼上的.再补充一下.实际操作的时候.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.

#4


引用 3 楼 shaoming01 的回复:

你要确定你的doc2是什么对象,是不是IHTMLDocument2
还有就是看看你取得的doc2是不是ie的,其他浏览器的文档对象会报错,文档对象

#5


doc对象是{mshtml.HTMLDocumentClass}

#6


不是null

#7


引用 5 楼 shaoming01 的回复:
doc对象是{mshtml.HTMLDocumentClass}


应该是:mshtml.IHTMLDocument2 iHTMLDocument2 = GetIHTMLDocument2ByUrl(payUrl);

不是HTMLDocumentClass

#8


但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.

#9


引用 8 楼 shaoming01 的回复:
但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.


可是你跟我说你要alert()

#10


alert();只是一段javascript脚本的示例而已.
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";

#11


哥们,还有好点子吗?

#12


  你自己不是用的WebBrowser组件? 还不用webbrowser

#13


回12楼
我没有用WebBrowser啊.

#14


哥们,你还是不了解mshtml这个dll~~~这个完全可以直接操控整个页面,包括任何标签,你为毛还要通过调用js的形式来改value啊

#15


我觉得你应该把你为什么想这么实现说出来 这样说不定人家能给你好的解决方案 我目测是想搞作弊类型的软件?

#16


哈哈,15楼兄弟比较有想象力!

我只是想写个帐户自动登录的软件.

如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?

#17


既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 

#18


你还是描述的不是那么清楚 如果是你自己软件里要帮用户自动登录账户 然后获取信息显示在软件里可以用我上面的方案
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719

#19


我的目标很简单,
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本

现在的问题是卡在2上面了.

#20


我要做什么,我自己很清楚的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.

#21


引用 17 楼 royzheng 的回复:
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 
  同意,这种用法。。

#22


引用 21 楼 kllxyu 的回复:
Quote: 引用 17 楼 royzheng 的回复:

既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 
  同意,这种用法。。


哥们,那也得看看我的需求是什么吧?
我登录了网页后呢?总要让人来操作网页吧?
你通过httprequest登录了,我怎么把登录结果转移到IE上面去呀?

#23


那你用sesion做判断,在数据库中做限制,登陆之后在用户的state中设置一个值,这里需要注意,你要定时去把登陆状态更新下,,,,

#24


alert('11');

#25


该回复于2013-06-23 12:27:51被版主删除

#26


过来 学习下。。

#27


嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?

下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}

#28


C# 怎么让IE浏览器运行js脚本支持啊

#29


该回复于2013-06-21 09:22:51被管理员删除

#30


引用 27 楼 shaoming01 的回复:


引用 27 楼 shaoming01 的回复:
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?

下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}


-------------
COM是有继承的,至于匿名么貌似没有

ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
----------------
ShellWindows 继承了IShellWindows, DShellWindowsEvents_Event这两个接口.包含了公共枚举IEnumerable,和两个事件方法。主要返回回windows窗口数目


foreach (InternetExplorer Browser in m_IEFoundBrowsers)
//遍历当前IE实例
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass这个继承了大约十二到十一个接口和一堆的方法。主要是用来增强HTMLDocument这个mS 接口。
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
//HTMLScriptElement ,ms接口 。下面三句是添加一个Element元素到BODY里面(DOM树)
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}

#31


HTMLBodyClass body = doc2.body as HTMLBodyClass; 我运行 得到的是 null 啊

#1


mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS

用Microsoft.mshtml.dll可以再c#程序里操作IE。

#2


引用 1 楼 juyangjia 的回复:
mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS

用Microsoft.mshtml.dll可以再c#程序里操作IE。

+1

#3


感谢楼上的.再补充一下.实际操作的时候.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.

#4


引用 3 楼 shaoming01 的回复:

你要确定你的doc2是什么对象,是不是IHTMLDocument2
还有就是看看你取得的doc2是不是ie的,其他浏览器的文档对象会报错,文档对象

#5


doc对象是{mshtml.HTMLDocumentClass}

#6


不是null

#7


引用 5 楼 shaoming01 的回复:
doc对象是{mshtml.HTMLDocumentClass}


应该是:mshtml.IHTMLDocument2 iHTMLDocument2 = GetIHTMLDocument2ByUrl(payUrl);

不是HTMLDocumentClass

#8


但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.

#9


引用 8 楼 shaoming01 的回复:
但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.


可是你跟我说你要alert()

#10


alert();只是一段javascript脚本的示例而已.
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";

#11


哥们,还有好点子吗?

#12


  你自己不是用的WebBrowser组件? 还不用webbrowser

#13


回12楼
我没有用WebBrowser啊.

#14


哥们,你还是不了解mshtml这个dll~~~这个完全可以直接操控整个页面,包括任何标签,你为毛还要通过调用js的形式来改value啊

#15


我觉得你应该把你为什么想这么实现说出来 这样说不定人家能给你好的解决方案 我目测是想搞作弊类型的软件?

#16


哈哈,15楼兄弟比较有想象力!

我只是想写个帐户自动登录的软件.

如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?

#17


既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 

#18


你还是描述的不是那么清楚 如果是你自己软件里要帮用户自动登录账户 然后获取信息显示在软件里可以用我上面的方案
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719

#19


我的目标很简单,
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本

现在的问题是卡在2上面了.

#20


我要做什么,我自己很清楚的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.

#21


引用 17 楼 royzheng 的回复:
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 
  同意,这种用法。。

#22


引用 21 楼 kllxyu 的回复:
Quote: 引用 17 楼 royzheng 的回复:

既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧 
  同意,这种用法。。


哥们,那也得看看我的需求是什么吧?
我登录了网页后呢?总要让人来操作网页吧?
你通过httprequest登录了,我怎么把登录结果转移到IE上面去呀?

#23


那你用sesion做判断,在数据库中做限制,登陆之后在用户的state中设置一个值,这里需要注意,你要定时去把登陆状态更新下,,,,

#24


alert('11');

#25


该回复于2013-06-23 12:27:51被版主删除

#26


过来 学习下。。

#27


嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?

下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}

#28


C# 怎么让IE浏览器运行js脚本支持啊

#29


该回复于2013-06-21 09:22:51被管理员删除

#30


引用 27 楼 shaoming01 的回复:


引用 27 楼 shaoming01 的回复:
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?

下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}


-------------
COM是有继承的,至于匿名么貌似没有

ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
----------------
ShellWindows 继承了IShellWindows, DShellWindowsEvents_Event这两个接口.包含了公共枚举IEnumerable,和两个事件方法。主要返回回windows窗口数目


foreach (InternetExplorer Browser in m_IEFoundBrowsers)
//遍历当前IE实例
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass这个继承了大约十二到十一个接口和一堆的方法。主要是用来增强HTMLDocument这个mS 接口。
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
//HTMLScriptElement ,ms接口 。下面三句是添加一个Element元素到BODY里面(DOM树)
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}

#31


HTMLBodyClass body = doc2.body as HTMLBodyClass; 我运行 得到的是 null 啊