浏览器自动化的一些体会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事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...
随机推荐
- java enum 枚举类
图一代码: public enum LogMethodEnum { WEBCSCARDVALID("返回值"), WEBCSVERIFYPASSWORD("返回值&quo ...
- 美团Leaf——全局序列生成器
Leaf的Github地址: https://github.com/Meituan-Dianping/Leaf Leaf美团技术团队博客地址: https://tech.meituan.com/201 ...
- PHP 基础语法介绍
PHP 语法 PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器. 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置. PHP 脚本以 <?php 开始,以 ?> ...
- Python execfile() 函数
描述 execfile() 函数可以用来执行一个文件.每组词 www.cgewang.com 语法 以下是 execfile() 方法的语法: execfile(filename[, globals[ ...
- PHP date_timezone_set() 函数
------------恢复内容开始------------ 实例 设置 DateTime 对象的时区: <?php$date=date_create("2013-05-25" ...
- PHP is_uploaded_file() 函数
定义和用法 is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的. 如果文件是通过 HTTP POST 上传的,该函数返回 TRUE. 语法 is_uploa ...
- PHP chunk_split() 函数
实例 在每个字符后分割一次字符串,并在每个分割后添加 ".": <?php$str = "Hello world!";高佣联盟 www.cgewang.c ...
- 7.18 NOI模拟赛 树论 线段树 树链剖分 树的直径的中心 SG函数 换根
LINK:树论 不愧是我认识的出题人 出的题就是牛掰 == 他好像不认识我 考试的时候 只会写42 还有两个subtask写挂了 拿了37 确实两个subtask合起来只有5分的好成绩 父亲能转移到自 ...
- CMD使用笔记
CMD杂谈 基本功: 1,列出所有任务及进程号,杀进程 tasklist tasklist /? 获取使用帮助 taskkill taskkill /? 获取使用帮助 2,cd 切换目录 cd ...
- JavaScript动画实例:运动的字母特效
已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ) (0≤θ≤2π) 给定初始坐标位置(X,Y),按照圆的坐标方程,从角度angle = 0开始,每间隔angleSpeed = ...