浏览器自动化的一些体会8 访问angular页面的一个问题

发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路。

大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都搞糊涂),碰到一个问题,本来程序中用WebBrowser控件访问一个页面,现在那个页面用Angular重写了,访问出错,出来一个空白页面。

1。解决方案一是改注册表,修改webBrowser控件所模拟的IE版本,缺省是7,不支持Angular,改成高版本,如11,就可以了。

但是有个问题,只能在第一次创建webBrowser时生效,如果要改回来,对不起,只能重启程序。应用中有多处用了webBrowser控件,如果这里改成11,别处也要用11,那么,就需要测试所有用到的地方,看页面的显示是否正常,测试工作量太大,不可行。

2。解决方案二是用别的控件。找到一个口碑似乎不错的CefSharp,测试了一下,工作正常。

但是问题来了,首先是工程设置成AnyCPU,CefSharp需要配置。调试了一段时间,也可以了。

更大的问题来了,工程需要用click once方式部署,结果,那些dll发布不出去。查了半天,调试了半天,想尽了办法,还是不行。最后唯一的办法似乎只有用Mage.exe和MageUI.exe这两个windows sdk里的工具,手工修改clickonce的manifest,把需要的dll打包进去。太烦,也不可行。

3。情急之下想出第三方案,用一个独立的包含webBrowser控件的exe显示页面,然后在另一个winform主程序中,把这个exe内嵌到form上的一个panel控件里:

var handle = Process.GetProcessesByName("foo")[0].MainWindowHandle;
SetParent(handle, this.Handle);
SetWindowLong(handle, (int)GWL_STYLE, (uint)WS_VISIBLE);
MoveWindow(handle, 0, 0, this.Width, this.Height, true);

foo就是那个exe,用了一些windows api,P/Invoke的签名不难从网上找到。

试了下,似乎可行。显然,很野蛮很丑陋。

4。最后有头脑灵活的高人想出巧妙的解决办法:

using (FileStream fs = File.Create(path))

                        {

                            using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))

                            {

                                sw.WriteLine("<html>");

                                sw.WriteLine("<head>");

                                sw.WriteLine("<meta http-equiv='X-UA-Compatible' content='IE=edge' />");

                                sw.WriteLine("<iframe style='width:1500px;height:900px;' src='" + url + "'></iframe>");

                                sw.WriteLine("</head>");

                                sw.WriteLine("</html> ");

                            }

                        }

                    }

                    webBrowser1.Navigate(path);

手工创建一个页面,关键是<meta http-equiv='X-UA-Compatible' content='IE=edge' />这一句,然后用iframe放那个Angular的页面,用webBrower控件访问文件,就可以了。确实是高招,自愧不如。

猜你喜欢

转载自www.cnblogs.com/badnumber/p/11087619.html
今日推荐