C#开发中WebBrowser控件的跨域问题使用实例

而有些网页上面会用IFrame去嵌套别的页面,这些页面可能不是在相同域名下的,这时就
【菜科解读】
我们在做web测试时,经常会使用WebBrowser来进行一些自动化的任务。
而有些网页上面会用IFrame去嵌套别的页面,这些页面可能不是在相同域名下的,这时就会出现跨域问题,无法直接在WebBrowser中获取到IFrame中的元素。
下面来做个试验,自己写个页面嵌套一个百度的首页,然后在我们自己的页面上输入要查询的词,最后在百度上自动完成搜索。
下面再建一个简单的WinForm工程测试一下,界面如下:
下面就是WebBrowser的测试代码:
using System;using System.Windows.Forms;namespace WebBrowserTest{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(this.textBox1.Text); } private void button2_Click(object sender, EventArgs e) { var doc = this.webBrowser1.Document; var frames = doc.Window.Frames; String testValue = doc.GetElementById("search").GetAttribute("value"); frames[0].Document.GetElementById("kw").SetAttribute("value", testValue); frames[0].Document.GetElementById("su").InvokeMember("click"); } }}
我们运行我们的测试程序后,加载之前我们自己写的页面后,在自己的页面上输入我们要查询的词,点击测试按钮,就会看到程序报未处理UnauthorizedAccessException错误:
下面来编写一个Helper类来解决这个问题,主要原理大致就是利用IWebBrowser2这个接口来获取Ifream中的Dom,IWebBrowser2中的document可以转换为IHtmlDocument1,IHtmlDocument2,IHtmlDocument3。
using System;using System.Runtime.InteropServices;using System.Windows.Forms;using mshtml;namespace WebBrowserTest{ // This is the COM IServiceProvider interface, not System.IServiceProvider .Net interface! [ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IServiceProvider { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); } public enum OLECMDF { OLECMDF_DEFHIDEONCTXTMENU = 0x20, OLECMDF_ENABLED = 2, OLECMDF_INVISIBLE = 0x10, OLECMDF_LATCHED = 4, OLECMDF_NINCHED = 8, OLECMDF_SUPPORTED = 1 } public enum OLECMDID { OLECMDID_PAGESETUP = 8, OLECMDID_PRINT = 6, OLECMDID_PRINTPREVIEW = 7, OLECMDID_PROPERTIES = 10, OLECMDID_SAVEAS = 4 } public enum OLECMDEXECOPT { OLECMDEXECOPT_DODEFAULT, OLECMDEXECOPT_PROMPTUSER, OLECMDEXECOPT_DONTPROMPTUSER, OLECMDEXECOPT_SHOWHELP } [ComImport, Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"), TypeLibType(TypeLibTypeFlags.FOleAutomation | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FHidden)] public interface IWebBrowser2 { [DispId(100)] void GoBack(); [DispId(0x65)] void GoForward(); [DispId(0x66)] void GoHome(); [DispId(0x67)] void GoSearch(); [DispId(0x68)] void Navigate([In] string Url, [In] ref object flags, [In] ref object targetFrameName, [In] ref object postData, [In] ref object headers); [DispId(-550)] void Refresh(); [DispId(0x69)] void Refresh2([In] ref object level); [DispId(0x6a)] void Stop(); [DispId(200)] object Application { [return: MarshalAs(UnmanagedType.IDispatch)] get; } [DispId(0xc9)] object Parent { [return: MarshalAs(UnmanagedType.IDispatch)] get; } [DispId(0xca)] object Container { [return: MarshalAs(UnmanagedType.IDispatch)] get; } [DispId(0xcb)] object Document { [return: MarshalAs(UnmanagedType.IDispatch)] get; } [DispId(0xcc)] bool TopLevelContainer { get; } [DispId(0xcd)] string Type { get; } [DispId(0xce)] int Left { get; set; } [DispId(0xcf)] int Top { get; set; } [DispId(0xd0)] int Width { get; set; } [DispId(0xd1)] int Height { get; set; } [DispId(210)] string LocationName { get; } [DispId(0xd3)] string LocationURL { get; } [DispId(0xd4)] bool Busy { get; } [DispId(300)] void Quit(); [DispId(0x12d)] void ClientToWindow(out int pcx, out int pcy); [DispId(0x12e)] void PutProperty([In] string property, [In] object vtValue); [DispId(0x12f)] object GetProperty([In] string property); [DispId(0)] string Name { get; } [DispId(-515)] int HWND { get; } [DispId(400)] string FullName { get; } [DispId(0x191)] string Path { get; } [DispId(0x192)] bool Visible { get; set; } [DispId(0x193)] bool StatusBar { get; set; } [DispId(0x194)] string StatusText { get; set; } [DispId(0x195)] int ToolBar { get; set; } [DispId(0x196)] bool MenuBar { get; set; } [DispId(0x197)] bool FullScreen { get; set; } [DispId(500)] void Navigate2([In] ref object URL, [In] ref object flags, [In] ref object targetFrameName, [In] ref object postData, [In] ref object headers); [DispId(0x1f5)] OLECMDF QueryStatusWB([In] OLECMDID cmdID); [DispId(0x1f6)] void ExecWB([In] OLECMDID cmdID, [In] OLECMDEXECOPT cmdexecopt, ref object pvaIn, IntPtr pvaOut); [DispId(0x1f7)] void ShowBrowserBar([In] ref object pvaClsid, [In] ref object pvarShow, [In] ref object pvarSize); [DispId(-525)] WebBrowserReadyState ReadyState { get; } [DispId(550)] bool Offline { get; set; } [DispId(0x227)] bool Silent { get; set; } [DispId(0x228)] bool RegisterAsBrowser { get; set; } [DispId(0x229)] bool RegisterAsDropTarget { get; set; } [DispId(0x22a)] bool TheaterMode { get; set; } [DispId(0x22b)] bool AddressBar { get; set; } [DispId(0x22c)] bool Resizable { get; set; } } class CorssDomainHelper { private static Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); private static Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"); // Utility for IE cross domain access // Returns null in case of failure. public static IHTMLDocument3 GetDocumentFromWindow(IHTMLWindow2 htmlWindow) { if (htmlWindow == null) { return null; } // First try the usual way to get the document. try { IHTMLDocument2 doc = htmlWindow.document; return (IHTMLDocument3)doc; } catch (COMException comEx) { // I think COMException won't be ever fired but just to be sure ... } catch (UnauthorizedAccessException) { } catch (Exception ex) { return null; } // At this point the error was E_ACCESSDENIED because the frame contains a document from another domain. // IE tries to prevent a cross frame scripting security issue. try { // Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider. IServiceProvider sp = (IServiceProvider)htmlWindow; // Use IServiceProvider.QueryService to get IWebBrowser2 object. Object brws = null; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws); // Get the document from IWebBrowser2. IWebBrowser2 browser = (IWebBrowser2)(brws); return (IHTMLDocument3)browser.Document; } catch (Exception ex) { Console.WriteLine(ex); } return null; } }}
最后将我们的运行代码改为如下形式,调用Helper类中的GetDocumentFromWindow方法:
using System;using System.Windows.Forms;using mshtml;namespace WebBrowserTest{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(this.textBox1.Text); } private void button2_Click(object sender, EventArgs e) { var doc = this.webBrowser1.Document; var frames = doc.Window.Frames; String testValue = doc.GetElementById("search").GetAttribute("value"); IHTMLDocument3 baiduDoc = CorssDomainHelper.GetDocumentFromWindow(frames[0].DomWindow as IHTMLWindow2); baiduDoc.getElementById("kw").setAttribute("value", testValue); baiduDoc.getElementById("su").click(); } }}
最后运行一下程序可以看到我们可以正常获取到百度上的元素了。
开发,中,WebBrowser,控件,的,跨域,问题,使用,中国第一个外国人太监竟然跟皇后有着不可告人的谜团
一些贫苦出身的百姓为了生存,不惜割掉生殖器,进入皇宫中服侍皇上以及皇亲。
身为太监,不仅要饱尝生理及心理的双重摧残。
而且还要承担社会舆论的巨大压力,他们是封建社会最底层的可怜人群。
但在历史上,也出现过多位位高权重的太监,像、、、李莲英等人,都受到了皇上的宠爱而权贵无比。
但是你知道中国历史上还曾有过洋人宦官、外国籍的太监吗? 据史料记载,在中国时期,中国就曾有过一位外国籍的太监,而且他也是中国历史上第一位外国籍的太监。
名叫朴不花,他是高丽人,生于文宗时期。
朴不花在中国的皇宫内与奇洛皇后关系十分亲密,所以官职一升再升。
连朝中大臣们都要巴结他,看他的眼色行事,真可谓是权倾朝野了,也光耀了“太监”的门庭。
在朴不花7岁的时候,一个偶然的机会他被净了身,于是便被送到元朝的皇城内做了一名专门斟茶倒水、扫地擦桌子的小杂务。
与他同时进宫的还有一位名叫奇洛的小姑娘,她是朴不花儿时的玩伴,奇洛在皇宫里只是做一些针线活之类的工作。
闲着没事的时候,两个孩子常在一块聊聊天,诉说一下思乡之苦。
在宫中苦熬的日子里,两人彼此相互关怀、相互照应,生活得还算愉快。
一转眼二人都已长大,奇洛出落得越发娇嫩可爱。
的儿子妥欢帖木尔在游玩时发现了美丽的奇洛,并把她收进了自己的府邸。
奇洛不仅人长得美,而且非常乖巧温柔,深得妥欢帖木尔的宠爱。
不久,妥欢帖木尔登基,是为元顺帝,元顺帝封奇洛为二皇后。
虽然成了母仪天下的皇后,荣华富贵自然是享用不尽,但她也没有忘记自己的同乡好友朴不花。
她把朴不花调到自己的兴圣宫,并迁升他为荣禄大夫,加资正院使。
资政院是元朝专门管理全国财政的部门,是个可以捞银子的肥差事。
既然奇洛二皇后为朴不花提供了如此好的机会,朴不花当然不会错过,自然捞得了很多好处。
朴不花逐渐地积攒起了万贯家财,并且分给了奇洛二皇后很多。
朴不花的贪污行为一向都十分小心、巧妙,所以朝廷并未有所察觉。
再加上朴不花非常懂得为人处世之道,经常把一些贪占的财物送给朝中的权贵及皇亲国戚们,使得宫内宫外的人都说朴不花人好心好,赞扬声不绝于耳,比比皆是。
但是渐渐地,财富已经不能满足朴不花的欲望了,他开始觊觎朝中的权势了,要开始向政界发起进攻。
巧的是元顺帝也十分宠信朴不花,经常会派他去外面做一些私访或是赈灾之类的工作,这也为他进军政界打开了便捷之门。
奇洛二皇后生的儿子被立为皇太子后,朴不花又把全部的心思都扑在了太子身上,太子的全由朴不花一人亲自打理。
正当元顺帝厌倦了政务、只喜好声色时,皇上不但把国之大权交给了太子,而且还任用了朴不花推荐的搠思监为宰相。
这时候的朴不花早已经是权倾朝野的人物了,不管是官吏的升免,还是国策的制定,全都由朴不花一人来决策了。
朴不花把朝中那些与自己不和的官员一一贬职查办,不断地。
由于元顺帝放任朴不花、搠思监等人在朝中的胡作非为,朝野内外开始动荡不安,国内的军阀势力也开始趁机起兵造反。
军阀们为了扩大自己的势力,也纷纷参与了宫廷内的权力争斗,一时之间,天下大乱。
此时的太子也早有登基称帝之愿,见国家局势动荡不安,便想趁机逼迫自己的父皇退位。
此时的朴不花、搠思监、奇洛二皇后也完全赞同太子的做法,几人便开始了策划颠覆造反的活动。
就在他们依计划在排除朝中反对派的官员时,元顺帝发现了他们的阴谋,而且对几人在朝中无法无天行径的弹劾之声也是不绝于耳。
所以元顺帝下旨把朴不花、搠思监打入了大牢。
平日与他们有仇的孛罗帖木儿趁太子出京之际,斩杀了这两个乱国的臣子。
此时军阀混战的局面还没有彻底解决,南方的早已经开始向元大都进攻,直接威胁着大元帝国的生存。
元顺帝见国家即将倾覆,不由得,万分懊悔地对太子道:“你们母子误了我的天下,我大元的江山毁在了你们母子的手中!”。
元顺帝虽然嘴上是这么说的,但他心里也明白,这一切的一切都是自己对朴不花等人的放任造成的。
朴不花死后不久,元朝就灭亡了。
随机文章地质奇观重庆武隆天坑地缝,世界最大的天坑群(80个)月球的背面是什么,二战飞机和外星人基地现身月球(谣言)北极冰川什么时候消失,冰川什么时候融化(全球变暖冰川消退)揭秘太空看地球是什么样子?从太空看地球的十大奇景(别具特色)柯伊伯带和小行星带的区别,柯伊伯带天体比小行星带多(质量小)
直隶总督的地位是什么?为什么在9个总督中地位最高?
直隶总督是清朝9位总督中地位最高的,而且实际权力最大。
从清朝入关到清朝灭亡,一直是这样的情况。
那么,直隶总督调动能够调动多少军队,为何能够拥有这么大的权力呢?认真的说,其他总督、巡抚都明显不如直隶总督。
首先我们讲一下总督和巡抚的区别,在清朝入关之后,逐步确立了总督和巡抚制度。
每个省都有巡抚,巡抚负责全省军政民财各方面的事务,属于全省的一把手。
接下来还有布政使、按察使和学政等官员,这都是副省级干部。
学政负责教育,按察使负责司法,布政使属于常务副省长。
此外就是总督,总督负责两三个省的军队,类似于战区司令。
所以说,巡抚和总督属于相互制约的关系,两江总督不一定压的住江苏巡抚。
清朝总计有9个总督,例如陕甘总督、湖广总督、闽浙总督等等,其实,直隶总督的地位最高,我们仔细分析一下。
总督一般只能负责军务,而有的巡抚则没有这种权力。
直隶总督负责管理河北地区的军队、民政、河道等各方面的事务,属于超级总督加巡抚。
再加上直隶地区和京师相邻,直隶总督需要拱卫京师的安全,直隶总督的地位自然十分重要。
在清朝历史上,直隶总督在钱方面可能不如两江总督,但是实际权力很大。
在直隶周边,河南省、山东省、山西省都是只有巡抚,而没有总督。
这也是有原因的,因为这三个省驻扎的军队都不算很多。
出现突发情况之后,可以进行临时分配。
在清朝统治的后期,运动曾经十分强大,而且开始了北伐。
在这样的危急情况下,清朝高层命令直隶总督临时指挥山东、河南、河北三个省的驻军,后来,、都担任过这个官职,由此可见,直隶总督确实非常重要。
清朝统治的后期,不得不开放自己的国门。
当时,天津成了重要的通商口岸,而天津又在直隶的管辖区。
就这样,直隶总督需要经常和洋人们打交道。
到了最后,直隶总督经常兼任北洋大臣,这进一步加强了直隶总督的地位和权力。
进入清朝末期,清朝开始训练新军。
在这一阶段,训练出了著名的北洋六镇。
这些军队同从北洋大臣兼直隶总督袁世凯的命令,在革命爆发之后,清朝高层立刻陷入了焦头烂额的情况。
按照现在的标准,直隶总督这个官职空前强大,相当于省长、战区司令、外交副部长等等。
与其他的总督、巡抚相比,直隶总督有明显的优势。
如果认真计算,直隶总督能够调动的军队,估计有10多万人。
由于直隶总督的地位重要,所以担任直隶总督的人一般都是信得过的官员,而是官员的能力需要很强。
在明天的文章中,小编和大家聊一个九品官的故事,虽然是九品,但是比七品官的日子还滋润。
随机文章汉武帝手下李陵逞凶斗狠汉武帝马邑之谋之后霍金为什么没有获得诺贝尔奖,诺贝尔奖看不起搞理论研究的冥王星的卫星系统,冥王星的卫星都叫什么(冥王星有五颗卫星)扎西德勒是什么意思啊,欢迎/吉祥如意意思/疑似源于18000年以前