浏览器自动化的一些体会9 访问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控件访问文件,就可以了。确实是高招,自愧不如。
浏览器自动化的一些体会9 访问angular页面的一个问题的更多相关文章
- 浏览器自动化的一些体会2 webBrowser控件之ajax
上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...
- 浏览器自动化的一些体会11 webclient的异步操作
原来的代码大致如下: private void foo(string url) { using (WebClient client = new WebClient()) { client.Downlo ...
- 浏览器自动化的一些体会9 webBrowser控件之零碎问题3
WebBrowser控件最大的优点是可以轻松嵌入win form程序中,但是微软好像对这个控件没什么兴趣,这么多年了还没有改进,结果造成一堆问题. 1. 不支持https 2. 缺省模拟ie 7,如果 ...
- 浏览器自动化的一些体会6 增强的webBrowser控件
这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示 ...
- 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互
从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...
- 浏览器自动化的一些体会3 webBrowser控件之零碎问题
1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true; 主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去.缺点 ...
- 浏览器自动化的一些体会8 HttpWebRequest的几个问题
前面说过了,httpWebRequest的好处在于轻量,不需要界面,缺点在于无法执行javascript.这里再归纳一些问题. 1. 设置代理 1) httpWebRequest不支持https的代理 ...
- 浏览器自动化的一些体会7 selenium webdriver的一些问题
1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.co ...
- 浏览器自动化的一些体会4 webBrowser控件之零碎问题2
1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...
随机推荐
- Shell基本语法---处理海量数据的cut命令
cut命令 cut应用场景:通常对数据进行列的提取 语法:cut [选项] [file] -d #指定分割符 -f #指定截取区域 -c #以字符为单位进行分割 # 以':'为分隔符,截取出/etc/ ...
- 【JVM之内存与垃圾回收篇】对象实例化内存布局与访问定位
对象实例化内存布局与访问定位 从各自具体的内存分配上来讲 new 的对象放在堆中 对象所属的类型信息是放在方法区的 方法当中的局部变量放在栈空间 这 new 的对象怎么把三块粘合到一起 就是这章的内容 ...
- Redis Desktop Manager安装
Windows安装: 1.下载安装包 官网下载地址:https://redisdesktop.com/pricing 官网下载需要付费使用 再此附上一个免费的破解版本,绿色安全可用 链接:https: ...
- vue怎么自定义组件
我们在搭建好的手脚架中 进行使用 一.在src =>components => 创建XXbtn文件夹用来存放你的组件 =>在创建一个vue的文件 . 二.在src => com ...
- Shell变量的作用域:Shell全局变量、环境变量和局部变量
Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他 ...
- pandas之groupby分组与pivot_table透视
一.groupby 类似excel的数据透视表,一般是按照行进行分组,使用方法如下. df.groupby(by=None, axis=0, level=None, as_index=True, so ...
- ken桑带你读源码 之scrapy pipelines\images.py
大家先看看 http://www.cnblogs.com/attitudeY/p/7078559.html 下面我做一些补充 最新版本1.1 已经支持 下载路径保存到 item 48行 ...
- PHP round() 函数
实例 对浮点数进行四舍五入:高佣联盟 www.cgewang.com <?php echo(round(0.60) . "<br>"); echo(round(0 ...
- luogu P3920 [WC2014]紫荆花之恋
LINK:紫荆花之恋 每次动态加入一个节点 统计 有多少个节点和当前节点的距离小于他们的权值和. 显然我们不能n^2暴力. 考虑一个简化版的问题 树已经给出 每次求某个节点和其他节点的贡献. 不难想到 ...
- 用tf.one_hot函数写任一坐标为1的二维张量
先给出tf.one_hot的用例:(例子转自https://www.jianshu.com/p/c5b4ec39713b) import tensorflow as tf var0 = tf.one_ ...