(快速浏览杰哥分享过的所有经验汇总,点击跳转 )
|
前言:之前论坛也有一些帖子,不过基本是基于JQuery年代的,有些方法已经不再适应现在的Vue/React之类的异步加载网站,所以我整合并做了优化改进。
虽然IE浏览器已经有些过时,不过刚好遇到有狐友需要,顺便做得整合。
1需求
自动打开网页,点击登录按钮,到了登录窗口,输入账号密码
(由于狐表.net版本的限制,只能调用IE浏览器,无法控制第三方Chrome浏览器)

此主题相关图片如下:1.png


此主题相关图片如下:2.png

2实现代码
1)全局代码
以下内容只有回复后才可以浏览
2)业务代码
'1关闭所有相关的IE浏览器,免得重复出错
Dim shell As Object = CreateObject("Shell.Application")
Dim win As Object
For Each win In shell.Windows
If InStr(win.FullName, "iexplore.exe") > 0 Then
If InStr(win.LocationURL, "etax.zhejiang.chinatax.gov.cn") > 0 Then '这里改成你的业务域名,不需要http
win.Quit
Exit For
End If
End If
Next
'2初始化新的IE浏览器
Dim ie As Object = CreateObject("InternetExplorer.Application")
ie.Visible = True
'3先登录首页
ie.Navigate("https://etax.zhejiang.chinatax.gov.cn:8443/") '这里改成你的业务网址
Sleep(4000) '由于这是个Vue异步加载的页面,要给时间它异步加载(如果网络差,建议延长)
'4点击登录按钮,跳转到登录窗口
Dim Spans = ie.Document.GetElementsByTagName("span")
For Each Span As Object In Spans
If Span.GetAttribute("class").ToString = "loginBtnText" Then
Span.Click
End If
Next
Sleep(4000) '等异步加载
'5找到账号密码,并输入
Dim Inputs = ie.Document.GetElementsByTagName("input")
For Each Input As Object In Inputs
Select Case Input.GetAttribute("placeholder").ToString
Case "统一社会信用代码/纳税人识别号"
input.Focus()
Sleep(300) ' 延迟让focus生效
SendKeys.SendWait("914400007578948436")
Case "居民身份证号码/手机号码/用户名"
input.Focus()
Sleep(300) ' 延迟让focus生效
SendKeys.SendWait("13427100453")
Case "个人用户密码"
input.Focus()
Sleep(300) ' 延迟让focus生效
SendKeys.SendWait("123")
End Select
Next

此主题相关图片如下:3.png

3关键技术点
1)先关闭相关浏览器
重复打开IE浏览器,会导致获取元素异常(例如报错`RPC 服务器不可用。 (异常来自 HRESULT:0x800706BA)`),
所以要先关闭好
'1关闭所有相关的IE浏览器,免得重复出错
Dim shell As Object = CreateObject("Shell.Application")
Dim win As Object
For Each win In shell.Windows
If InStr(win.FullName, "iexplore.exe") > 0 Then
If InStr(win.LocationURL, "tpass.zhejiang.chinatax.gov.cn") > 0 Then '这里改成你的业务域名,不需要http
win.Quit
Exit For
End If
End If
Next
2)异步加载
这是个主流的Vue页面,采用异步加载。所以我们要适当等待,等待元素加载出来,而**不能单纯通过以下代码**,判断浏览器就绪,否则容易获取不到元素而报错
Do While ie.busy Or ie.readystate <> 4
Application.DoEvents
Loop
3)定位元素
利用Dim Inputs = ie.Document.GetElementsByTagName("input")找到某种元素的集合,例如这里找到所有的input标签元素。
然后我们去看下要定位的元素,有什么特征。在浏览器按F12,进入网页元素控制台

此主题相关图片如下:4.png

4)模拟点击
找到元素后,可以模拟点击
Dim Spans = ie.Document.GetElementsByTagName("span")
For Each Span As Object In Spans
If Span.GetAttribute("class").ToString = "loginBtnText" Then
Span.Click
End If
Next
5)模拟输入
找到元素后,可以模拟键盘输入
Dim Inputs = ie.Document.GetElementsByTagName("input")
For Each Input As Object In Inputs
Select Case Input.GetAttribute("placeholder").ToString
Case "统一社会信用代码/纳税人识别号"
input.Focus()
Sleep(300) ' 延迟让focus生效
SendKeys.SendWait("914400007578948436")
End Select
Next
注意:Vue/React 前端动态框架阻止了直接 DOM 注入生效的现象,所以狐表论坛里,以下传统的写法是失效的
'这种是失效的
Dim inputs = ie.Document.GetElementsByTagName("input")
For Each input As Object In inputs
If input.getAttribute("placeholder") = "个人用户密码" Then
input.setAttribute("value", 123)
End If
Next

此主题相关图片如下:5.png

=====================================================================
杰哥免费分享的web系统
===============================================================
顺便总结以前分享过的帖子,方便大家学习
[此贴子已经被作者于2025/4/20 20:14:55编辑过]
还没用到,只要是为了支持狐表的发展中深造,但必须顶起来!