碰到一个无比坑爹,外加蛋疼乳酸的问题。从昨天晚上发现bug,到今天下午解决问题,搞了大半天的时间。光是找问题就花了半天,解决问题的方法简单,但是方案的形成也是无比纠结的过程。

背景:webbrowser获取页面上的验证码,然后解析验证码回写到页面。解析和回写没什么问题,问题主要在获取页面验证码上。

在网上搜索得到这么一段代码:

IHTMLControlElement img = (IHTMLControlElement)webBrowser1.Document.Images["vcode_img"].DomElement;
IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)html.body).createControlRange();
range.add(img);
range.execCommand("Copy", false, null);
img = null;
range = null;
html = null;
if (Clipboard.ContainsImage())
this.pictureBox1.Image = Clipboard.GetImage();
else
MessageBox.Show("执行不成功");
Clipboard.Clear();

获取验证码图片的核心也在这里。复制图片数据到内存,然后从剪贴板读取到pictureBox控件。

图片很顺利的取出来了。

但是实际调用的时候,发现“时灵时不灵”,不时的会冒出“执行不成功”的弹框。

刚开始以为是线程运行顺序导致的,加了一堆Thread.Sleep,发现毫无改善。

各种测试,毫无头绪......

无意中发现某一次报错时,页面上选中了部分文字。难道是这里的问题?于是重点测试,每次选中文字之后,解析验证码,报错。而没有选中文字时,运行这部分代码,安然通过。我X,这是什么狗血情况,问题居然出在页面当前有选中文字上??郁闷呐》。。。。。

找到问题后,解决问题的方向就很明确了。在执行这段代码之前,取消页面选择。

问题又来了,对于我这么一个没搞过js、html的c#初级猿,怎么取消webbrowser页面选择文字还真是难到我了,试过很多方法,focus,select,moveStart,move...通通滴死啦死啦滴...

过程很坎坷,结果很简洁。一句txtRange.execCommand("Unselect");搞定。

完整代码:

var code = "";
var body = (mshtml.HTMLBodyClass)((mshtml.HTMLDocumentClass)wbsContent.Document.Window.Frames[].Document.DomDocument).body;
IHTMLControlElement img = (IHTMLControlElement)((mshtml.HTMLDocumentClass)wbsContent.Document.Window.Frames[].Document.DomDocument).images.item("imgCode");
IHTMLControlRange range = (IHTMLControlRange)body.createControlRange();
IHTMLTxtRange txtRange = body.createTextRange();
txtRange.execCommand("Unselect");
range.add(img);
range.execCommand("Copy");
img = null;
range = null; if (Clipboard.ContainsImage())
{
code = UnCodeBase.GetVarifyCodeFromWinWinTask((Bitmap)Clipboard.GetImage());
var txtVrf = (mshtml.HTMLInputElementClass)((mshtml.HTMLDocumentClass)wbsContent.Document.Window.Frames[].Document.DomDocument).all.item("code");
txtVrf.setAttribute("value", code);
return true;
}

这是Frame的情况,相信没有Frame的情况应该可以照着这个思路处理。

问题解决了的时候,还是很开心的,虽然还是觉得这个问题很让人郁闷.

webbrowser取页面验证码的更多相关文章

  1. 【java】使用URL和CookieManager爬取页面的验证码和cookie并保存

    使用java的net包和io包下的几个工具爬取页面的验证码图片并保存到本地. 然后可以把获取的cookie保存下来,做进一步处理.比如通过识别验证码,进一步使用验证码和用户名,密码,保存下来的cook ...

  2. web页面 验证码 生成

    web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...

  3. Java爬虫系列二:使用HttpClient抓取页面HTML

    爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容.上一篇随笔<Java爬虫系列一:写在开始前>中提到了HttpClient可以抓取页面内 ...

  4. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘

    [C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...

  5. 用PHP抓取页面并分析

    在做抓取前,记得把php.ini中的max_execution_time设置的大点,不然会报错的.

  6. 使用PHP的正则抓取页面中的网址

    最近有一个任务,从页面中抓取页面中所有的链接,当然使用PHP正则表达式是最方便的办法.要写出正则表达式,就要先总结出模式,那么页面中的链接会有几种形式呢?   链接也就是超级链接,是从一个元素(文字. ...

  7. php抓取页面的几种方式

    在做一些天气预报或者RSS订阅的程序时,往往 需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接 ...

  8. Selenium2学习-034-WebUI自动化实战实例-032-获取页面 body 大小

    获取 body 元素大小的方法,非常简单,直接上码,敬请参阅! /** * Get body size * * @author Aaron.ffp * @version V1.0.0: autoSel ...

  9. Selenium2学习-028-WebUI自动化实战实例-026-获取页面元素值或者元素属性值

    在自动化脚本编写过程中,经常需要获取页面元素的文本进行判断,以便对于不同的文本进行不同的处理.比如:很多的购物网站,加入购物车的按钮是有多个状态的(加入购物车.到货通知.暂不销售等),那么在实际的操作 ...

随机推荐

  1. 在Spring Boot中使用Spring-data-jpa实现分页查询(转)

    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖  2.对thymeleaf和jpa进 ...

  2. JAVA中如何正确的用String转Date

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = sdf.parse( ...

  3. 使用 Swagger 文档化和定义 RESTful API

    大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API——REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...

  4. Nginx(四):压缩功能详解

    gzip (GNU-ZIP) 是一种压缩技术.经过 gzip 压缩后页面大小可以变为原来的 30%甚至更小. 这样,用户浏览页面的时候速度会快得多.  gzip 的压缩页面需要浏览器和服务器双方都支持 ...

  5. 抛弃百度UMEditor,拥抱summernote (解决上传文件又慢又卡的问题)

    由于一些项目上的原因以及相关因素,我们使用其他富文本编辑器替代了UMEditor 本来用CKEditor,但是团队觉得使用起来很不顺手,尤其图片上传十分不爽,功能复杂但是使用起来比较麻烦 后来我们又替 ...

  6. express中的路径区别

    请求的url:http://localhost:3000/api/article/upload?q=1000&n=tom请求方法:postconsole.log('hostname==='+r ...

  7. zipkin微服务调用链分析

    1.zipkin的作用 在微服务架构下,一个http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作, 如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价 ...

  8. 每日英语:Got a Case of the Mondays? Blame the Sunday Blues

    Welcome to Monday morning at the office. Did you have trouble sleeping last night? Was your stomach ...

  9. LearnOpenGL 你好,三角形[转]--附源码

    原地址:你好,三角形 你好,三角形 原文 Hello Triangle 作者 JoeyDeVries 翻译 Django 校对 Geequlim 译注 在学习此节之前,建议将这三个单词先记下来: 顶点 ...

  10. 【Qt】qt库结构及示例

    QT库结构 Qt图形库是一个组织严谨的C++类库,其结构如图所示 细说Qt库 Qt类库中包含了上百个类,结构十分复杂,上图展示了Qt_3.2类库的基本结构. Qt类库中的类可以分成两种类型: 一种是直 ...