浏览器自动化的一些体会3 webBrowser控件之零碎问题
1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true;
主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去。缺点显然是某些真正的javascript错误被掩盖了。但是实践中觉得多数情况下,这一句是有必要的。
2. 解析dom
webBrowser控件提供了一些解析dom的方法,如webBrowser1.Document.GetElementById()。这些方法在处理某些结构较为复杂的dom时会显得不太方便,这时我一般喜欢用HtmlAgilityPack这个库来解析dom。
HtmlAgilityPack很强大,但有一个很大问题是,webBrowser里的方法找到所需元素后,可以执行Click等操作,而HtmlAgilityPack不行(因为它不能执行javascript)。所以在需要Click等操作时,我一般用webBrower控件提供的方法,或者干脆换用selenium的webdriver(以后讨论)。
3. 保存图片
主要有两种方法(如果把本贴里第5条的“另存为”也算上,可说有3种方法),一种是先解析dom,获取图片url,然后发httprequest/用webclient下载图片:
主要问题是某些网站需要cookie或其他header时,这种方法就较为麻烦。
另外一种是利用剪贴板:
https://stackoverflow.com/questions/3833718/webbrowser-copy-image-to-clipboard/3833846#3833846
实践中碰到的主要问题是难以保留图片的格式,比如图片本来是png格式,保存后,不管
Bitmap bmp = (Bitmap) Clipboard.GetDataObject().GetData(DataFormats.Bitmap)中的DataFormat设成什么,都无法存成png格式(将保存后文件的大小和直接从网页中“另存为”保存的文件大小对比可看出)。这个问题不知道如何解决。高明教我。
4. session问题
在winform中如果用多个tabpage里的webBrowser控件同时打开同一个url,如果该网站用了session,那么,这几个tabpage里的webBrowser控件将“共享”同一个session。这个有点坑爹。下面用代码来说明:
winform里的代码:
private void winWeb_Load(object sender, EventArgs e)
{//winWeb是个winform,放在一个tabpage里,包含了一个webBrowser控件,这里在load事件中Navigate
string url = "http://abc.com?a=test";
int count = Util.GetCount();//Util类里记录当前最大的count值
count++;//每调用一次(也就是新开一个tabpage)加1
url += "&count=" + count.ToString();//传给网页,用于区分不同tabpage的session
webBrowser1.Navigate(url);
}
网页(asp.net webform)里的代码:
protected void Page_Load(object sender, EventArgs e)
{
string count = Request.QueryString["count"];
if (String.IsNullOrEmpty(count))
{
count = "";
}
ViewState["Count"] = count;//保存在ViewState里,因为网页其他部分也要用
int pID = Convert.ToInt32(Request.QueryString["pid"]);
Session[ViewState["Count"].ToString() + "SelectedOID"] = pID;//创建session,用count值来实现不同tabpage打开的网页有不同的session,否则就“共享” session了 }
5. “另存为”
如何用代码来实现浏览器里右击鼠标,然后点“另存图片为”的行为?如果用的是webBrowser控件,似乎没有太好的办法,只能估算屏幕坐标,然后模拟鼠标行为,这里贴一段虽然work(针对程序中所处理的网页而言,如果用在别的网页中,显然要做一点修改),但显然很笨拙的代码:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
timer1.Stop();
timer1.Start();
} private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
Point controlLoc = this.PointToScreen(webBrowser1.Location);
controlLoc.X = controlLoc.X + webBrowser1.Document.GetElementById("memu6").OffsetRectangle.Left + ;//找到鼠标右击的位置
controlLoc.Y = controlLoc.Y + webBrowser1.Document.GetElementById("memu6").OffsetRectangle.Top + ;
Cursor.Position = controlLoc;
MouseAndKeySimulator.ClickRightMouseButton();//MouseAndKeySimulator顾名思义是一个模拟鼠标和键盘时间的第三方类,代码这里就不贴了
timer2.Stop();//因为是模拟点击,需要有一定的延时,这里用timer实现
timer2.Start();
} private void timer2_Tick(object sender, EventArgs e)
{
timer2.Stop();
var newX = Cursor.Position.X + ;
Point newPoint = new Point();
newPoint.X = newX;
newPoint.Y = Cursor.Position.Y;
Cursor.Position = newPoint;
MouseAndKeySimulator.PressKey(Keys.G, true);
MouseAndKeySimulator.PressKey(Keys.G, false);//模拟键盘操作,下移到“图片”菜单项
for (int i = ; i < ; i++)
{//模拟键盘操作,下移到“另存图片为”菜单项
MouseAndKeySimulator.PressKey(Keys.Up, true);
MouseAndKeySimulator.PressKey(Keys.Up, false);
}
MouseAndKeySimulator.PressKey(Keys.Enter, true);//打开“保存图片”对话框
MouseAndKeySimulator.PressKey(Keys.Enter, false);
timer3.Stop();//打开对话框也需要延时
timer3.Start();
} private void timer3_Tick(object sender, EventArgs e)
{
timer3.Stop();
MouseAndKeySimulator.PressKey(Keys.Enter, true);//用缺省的文件名保存图片,如果要换名保存,这里还得模拟键盘输入文件名
MouseAndKeySimulator.PressKey(Keys.Enter, false);
timer4.Stop();//这个是为了处理下一个图片的,代码这里从略
timer4.Start();
}
以后再讨论selenium的webdriver时,可能还会提到类似功能,就会发现实现起来容易多了。在模拟鼠标和键盘行为方面,webBrowser控件没有提供什么支持,实现起来比较费劲。
浏览器自动化的一些体会3 webBrowser控件之零碎问题的更多相关文章
- 浏览器自动化的一些体会9 webBrowser控件之零碎问题3
WebBrowser控件最大的优点是可以轻松嵌入win form程序中,但是微软好像对这个控件没什么兴趣,这么多年了还没有改进,结果造成一堆问题. 1. 不支持https 2. 缺省模拟ie 7,如果 ...
- 浏览器自动化的一些体会4 webBrowser控件之零碎问题2
1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...
- 浏览器自动化的一些体会2 webBrowser控件之ajax
上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...
- 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互
从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...
- Webbrowser控件史上最强技巧全集
原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...
- WebBrowser控件使用详解
原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...
- 浏览器自动化的一些体会6 增强的webBrowser控件
这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示 ...
- 浏览器自动化的一些体会9 访问angular页面的一个问题
发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路. 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都 ...
- PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...
随机推荐
- 不是吧,阿sir,2020年程序员要不好过?
自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员… ...
- 《数据可视化之美》高清PDF全彩版|百度网盘免费下载|Python数据可视化
<数据可视化之美>高清PDF全彩版|百度网盘免费下载|Python数据可视化 提取码:i0il 内容简介 <数据可视化之美>内容简介:可视化是数据描述的图形表示,旨在一目了然地 ...
- 00_01_使用Parallels Desktop创建WindosXP虚拟机
打开paralles软件,选择文件->新建 继续 选择手动选择,之后勾选没有指定源也继续 选择要创建的操作系统(这里以XP为例,其他的windows系统安装基本都差不多) 根据需要选择,这里选择 ...
- Excel绘制经典图表
1.柱形图 2.条形图 3.饼图---复合饼图 4.圆环图 5.组合图 设置不同的纵轴 6.漏斗图 其中:合计呈逐渐下降的趋势,可以用漏斗图进行展示! 绘制漏斗图首先需要构建辅助列,在插入图形的时候选 ...
- PDO::errorInfo
PDO::errorCode — 返回最后一次操作数据库的错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 public array PDO::e ...
- PDO::errorCode
PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 mixed PDO: ...
- Hadoop学习问题记录之基础篇
目的 记录学习hadoop过程中遇到的基础问题,无关大小.无关困扰时间长短. 问题一 全分布式环境中运行mapred程序,报异常:java.net.NoRouteToHostException: 没有 ...
- Python实现微信读书辅助工具
[TOC] ##项目来源 这个有意思的项目是我从GitHub上找来的,起因是在不久前微信读书突然就设置了非会员书架数目上限,我总想做点什么来表达我的不满,想到可否用爬虫来获取某一本书的内容, 但是我技 ...
- 如何让img自动适应div容器大小
IMG样式 (横向拉伸,纵向自动匹配大小) width:100%; height:auto; (纵向拉伸,横向自动匹配大小) width:auto; height:100%; DIV样式(元素居中显示 ...
- .Net Core 实体生成器
实体生成器是什么? 实体生成器的功能就是自动将数据库中的表以及字段 转化成我们 高级编程语言中的实体类. 我们为什么要用实体生成器 在.net core开发环境下,我们可以使用efcore这个orm来 ...