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

大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都搞糊涂),碰到一个问题,本来程序中用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页面的一个问题的更多相关文章

  1. 浏览器自动化的一些体会2 webBrowser控件之ajax

    上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...

  2. 浏览器自动化的一些体会11 webclient的异步操作

    原来的代码大致如下: private void foo(string url) { using (WebClient client = new WebClient()) { client.Downlo ...

  3. 浏览器自动化的一些体会9 webBrowser控件之零碎问题3

    WebBrowser控件最大的优点是可以轻松嵌入win form程序中,但是微软好像对这个控件没什么兴趣,这么多年了还没有改进,结果造成一堆问题. 1. 不支持https 2. 缺省模拟ie 7,如果 ...

  4. 浏览器自动化的一些体会6 增强的webBrowser控件

    这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示 ...

  5. 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互

    从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...

  6. 浏览器自动化的一些体会3 webBrowser控件之零碎问题

    1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true; 主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去.缺点 ...

  7. 浏览器自动化的一些体会8 HttpWebRequest的几个问题

    前面说过了,httpWebRequest的好处在于轻量,不需要界面,缺点在于无法执行javascript.这里再归纳一些问题. 1. 设置代理 1) httpWebRequest不支持https的代理 ...

  8. 浏览器自动化的一些体会7 selenium webdriver的一些问题

    1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.co ...

  9. 浏览器自动化的一些体会4 webBrowser控件之零碎问题2

    1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...

随机推荐

  1. C++语法小记---多重继承

    多重继承 工程中不建议使用多继承,因为多继承带来的问题比带来的便利多,已被放弃 问题一:多重继承的对象,向上获取指针时,有不同的地址 ----无法解决 问题二:菱形继承问题,导致成员冗余 ----虚继 ...

  2. unittest学习笔记

    File "C:\Program Files\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py&quo ...

  3. xshell如果通过跳板机登录其他机器

    首先,跳板机设置隧道 目标机器,选择刚才的隧道作为代理

  4. windows docker xshell 默认登录密码

    boot2docker用户和密码 用户 密码 进入方式 docker tcuser ssh root   command:sudo -i (docker用户下执行)

  5. PHP date_modify() 函数

    ------------恢复内容开始------------ 实例 修改时间戳.增加 15 天: <?php$date=date_create("2013-05-01");d ...

  6. PHP sin() 函数

    实例 返回不同数的正弦: <?php高佣联盟 www.cgewang.comecho(sin(3) . "<br>");echo(sin(-3) . " ...

  7. 这届 Showgirl行不行?AI告诉你谁是ChinaJoy上最漂亮的小姐姐

    摘要: CJ开幕,顶着三伏天的酷暑高温,暴走一整天,就为了拍点漂亮小姐姐给大家看看. 一年一度的游戏视觉盛宴又来了! 作为一个游戏动漫控的肥宅,去CJ现场是必须的.除了看看游戏和动漫,各大游戏展台漂亮 ...

  8. 《分享》Graphql入门与实践

    最近项目用到了graphql,学习了一些并在公司做了一个小分享,希望对你有帮助 一.介绍 Graphql是一种面向数据的API查询语言 Graphql给前端提供一种强力的查询工具,我们可以根据自己定义 ...

  9. Python机器学习及实践_从零开始通往KAGGLE竞赛之路PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:i5nw Python机器学习及实践面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读 ...

  10. vue cli4构建基于typescript的vue组件并发布到npm

    基于vue cli创建一个vue项目 首先安装最新的vue cli脚手架, npm install --global @vue/cli npm WARN optional SKIPPING OPTIO ...