碰到一个无比坑爹,外加蛋疼乳酸的问题。从昨天晚上发现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. 【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)

    https://www.cnblogs.com/biehongli/p/6555994.html

  2. MySQL设置从库只读模式

    常见现象 运维工作中会经常维护MySQL主从服务器,当然Slave我们只是用于读操作. 一般权限开通也只授权只读账号,但是有时候维护工作可能不是一个人在做,你不能保证其他同事都按照这个标准操作. 有同 ...

  3. jmeter压测前清理内存

    jmeter 压测时设置了内存为sed -i 's/HEAP="-Xms512m -Xmx512m"/HEAP="-Xms36096m -Xmx360096m" ...

  4. highlightjs 详解

    起源: 最近想做一个代码高亮的功能.发现开源社区已经有了这类的项目.比如说highlightjs. 第一步:下载highlightjs 官网:https://highlightjs.org 可以看到它 ...

  5. mysql 数据类型TIMESTAMP用法

    在mysql数据库中,timestamp数据类型是一个比较特殊的数据类型,可以自动在不使用程序更新情况下只要更新了记录timestamp会自动更新时间. 通常表中会有一个Create date 创建日 ...

  6. ASP.NET MVC中的cshtml页面中的下拉框的使用

    ASP.NET MVC中的cshtml页面中的下拉框的使用 用上@Html.DropDownList 先记下来..以做备忘...

  7. 事件,委托,action与func文章不错的

    https://www.cnblogs.com/yinqixin/p/5056307.html https://www.cnblogs.com/BLoodMaster/archive/2010/07/ ...

  8. ActionBar 笔记

    博客地址: http://blog.csdn.net/eclipsexys/article/details/8688538 官方文档: http://developer.android.com/gui ...

  9. vue.js 首屏优化

    我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router- ...

  10. zabbix server 在配置客户端的时候 在zabbix server端的/etc/hosts文件的hostname 对应的ip这样可以更快的让server端发现agent端

    如下: # cat /etc/hosts 127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.loc ...