很粗浅的一点知识,献丑了。
需求就是在页面上做点击和输入操作:1.登录,如果登录成功就切换页面,在新页面上进行点击,执行固定的操作,比如输入一段话。2.登录不成功,则获取下一组账号重复步骤1。
在思考如何做的时候,首选使用SetCursorPos,还有模拟点击的win32 api来搞,因为简单。
一。首先遇到一个问题,也是最主要的问题:如果判断页面加载成功呢?因为网速总是会波动的把,如果用sleep的方式,万一网页没有加载完毕sleep就返回了,此时点击函数执行不会有任何效果!所以sleep是绝不能用在判断网页是否加载完成,必须想一个其他的辙才行。
很是纠结了一会,翻翻msdn,问问度娘,也没个结果(也许是我打开的方式不对)。于是乎,慢慢观察IE。发现状态栏可以为我解决这个问题,请看下面的图,以论坛为例子
当鼠标在页面的空白处时,从图中可以看到状态栏是空的,一旦将鼠标移动到任意一个图片,按钮,文本等等上,则状态栏就会出现对应的说明字符。看下图,鼠标放在“论坛版务”上,
状态栏有文字内容了。
经过反复观察,发现状态栏确实可以作为判断网页是否加载完毕的依据。理由如下:
a.如果我们的目标位置有说明文字,则一旦鼠标移动过去,检查状态栏没有任何文字内容,说明页面没有加载完毕,当前不具备点击条件,需要等待。
b.如果我们的目标位置没有说明文字,则就向下找一个比目标位置更晚加载的网页元素(有说明文字的),且移动鼠标过去,如果状态栏有文字内容,说明网页具备点击条件了,因为比目标位置更晚加载的都可以显示说明文字了,说明目标位置一定是准备好了。否则需要等待
c.如果需要等待,就在等待的过程中,将鼠标移动到屏幕任意位置,等待一会儿比如2秒,再重新移动到目标位置去检查状态栏的变化
二。那如何获取IE状态栏的文字说明呢
SPY++提供了一些线索,打开SPY++,这工具还是很好使的。
当前进程信息都有,找到IE,会看到2个,只关心带+号的(为啥下面还有1个?这个是不是主进程,然后带加号的是IE真正的工作线程?有大牛能告知一二不?)
弹开+号,逐级向下找会找到状态栏的窗口句柄,看下面的图,"msctls_statusbar32"就是他的类名
到这里,基本上就有眉目了,状态的的句柄和类名都看到了,SPY++能获取到它,则我们应该也能。因此剩下的就是在代码中获取它,然后通过WM_GETTEXT消息就能获得文本内容了。
三.实际代码操作
a.获得IE的句柄
FindWindow()就可以了。不多说
b.枚举IE子窗口,直到获得状态栏的句柄,下图代码就是获取状态栏句柄的枚举回调,这也比较简单。
c.获取状态栏的文本内容,如下图,就是一句sendmessage的事,ie还是很尽职的,消息发过去就会告诉我们文本内容了。同时设置N个控制位,获取的状态栏文字就在此做比对,标志位不同,比对数据不同,这样就可以判断目标位置是否准备完毕可以点击了
d.输出的操作,涉及到输出英文和中文,在网上抄一点,自己再写一点,折腾出一个自定义的input类,既用到了sendinput也用到了keybd_event。基本也够用了,见附件。
e.点击
四。以上问题都解决好,再考虑好适当的延时,基本上在实际代码执行点击的时候还是很顺的. 如果是在虚拟机里运行,呵呵,就是一后台执行了,压根也不会管。不足之处就是,碰到验证码的话就得找打码平台解决了,搞不定。
欢迎指点!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课