原来的代码大致如下: private void foo(string url) { using (WebClient client = new WebClient()) { client.DownloadProgressChanged += (obj, ev) => { client.CancelAsync(); }; client.DownloadStringCompleted += (obj, ev) => { ................ Thread.Sleep(30000); b…
发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路. 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都搞糊涂),碰到一个问题,本来程序中用WebBrowser控件访问一个页面,现在那个页面用Angular重写了,访问出错,出来一个空白页面. 1.解决方案一是改注册表,修改webBrowser控件所模拟的IE版本,缺省是7,不支持Angular,改成高版本,如11,就可以了. 但是有个问题,只能在第一…
上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的一些实践体会. 1.ajax 首先,DocumentCompleted事件对于ajax无能为力,因为这个事件不能处理网页加载完成后执行javascript发出ajax请求.网上可以找到的方法,主要有两种,一种是利用onpropertychange事件,随便找了个参考链接:https://social…
WebBrowser控件最大的优点是可以轻松嵌入win form程序中,但是微软好像对这个控件没什么兴趣,这么多年了还没有改进,结果造成一堆问题. 1. 不支持https 2. 缺省模拟ie 7,如果要模拟其他ie版本就得修改注册表,但是修改注册表会带来其他的问题.具体在另外一个帖子里讨论过了:https://www.cnblogs.com/badnumber/p/11087619.html 3. 即使通过修改注册表,可以模拟高版本的ie,还是会有其他问题,因为这毕竟和真的高版本ie不一样.今天…
1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true; 主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去.缺点显然是某些真正的javascript错误被掩盖了.但是实践中觉得多数情况下,这一句是有必要的. 2. 解析dom webBrowser控件提供了一些解析dom的方法,如webBrowser1.Document.GetElementById().这些方法在处理某些结构较为复杂的dom时会显得不太方便,…
1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.com/questions/18424624/using-selenium-to-save-images-from-page/48871283 2. 完全退出selenium 一般情况下,用webdriver的Quit方法就可以了.但是某些情况下,也有可能没用.这时,就只能杀进程了. 有意思的是,IEW…
这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示例代码可以从这里下载:https://code.msdn.microsoft.com/windowsapps/CSWebBrowserWithProxy-c8535715 这个代码来自msdn,自然很权威,也确实很不错,即使不熟悉pinvoke的操作也可拿来用.美中不足的是这个代码缺少禁用代理服务器…
1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意想不到的结果. 我一般的做法,是定义一个全局变量(winform里form的成员变量),如下面代码所示: private string _type; private void button1_Click(object sender, EventArgs e) { _type = "test"…
前面说过了,httpWebRequest的好处在于轻量,不需要界面,缺点在于无法执行javascript.这里再归纳一些问题. 1. 设置代理 1) httpWebRequest不支持https的代理,也就是说用不了某些vpn,你懂的. 2) 一般的写法: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Proxy = new WebProxy(proxyUrl, true); //如:http:/…
从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访问winform,归纳出来大致4种办法: 1.利用webBrowser的Navigating事件 网页里的javascript代码: window.location.href='close'; winform里的代码: private void webBrowser1_Navigating(obje…