博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webbrowser取页面验证码
阅读量:7296 次
发布时间:2019-06-30

本文共 1947 字,大约阅读时间需要 6 分钟。

碰到一个无比坑爹,外加蛋疼乳酸的问题。从昨天晚上发现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[0].Document.DomDocument).body;IHTMLControlElement img = (IHTMLControlElement)((mshtml.HTMLDocumentClass)wbsContent.Document.Window.Frames[0].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[0].Document.DomDocument).all.item("code");    txtVrf.setAttribute("value", code);    return true;}

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

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

转载地址:http://kmynm.baihongyu.com/

你可能感兴趣的文章
【机器学习基础】GBDT--梯度提升树实例分析完全解读
查看>>
Juniper 文章目录
查看>>
Python----Requests库基本使用
查看>>
IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized
查看>>
Fragment专辑(一):Fragment简介
查看>>
java框架之Spring 核心框架体系结构
查看>>
java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
查看>>
微软称电脑系统识别能力已经超越了人类
查看>>
Spring Boot 项目实现热部署
查看>>
对于读取PDF模板表单,中文无序问题
查看>>
springboot发送邮件
查看>>
react之bind函数到组件通识篇
查看>>
优化出现的小问题
查看>>
「从源码中学习」面试官都不知道的Vue题目答案
查看>>
学习 git clone 几种不同的协议
查看>>
深入理解volatile
查看>>
前端DevOps之PageSpeed Insights
查看>>
[译] CSS 变量实现炫酷鼠标悬浮效果
查看>>
数据结构-js实现栈和队列
查看>>
面试题
查看>>