ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 345|回复: 5

操控已经打开的浏览器的n种方法尝试,非ie浏览器

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-5 11:59 | 显示全部楼层 |阅读模式
第一种:首先用用LocationURL Like 非框架网页 ie和非ie浏览器都可以,但是
运用了框架结构的网页测试不成功

For Each IE In mShellwindows  
    If IE.LocationURL Like "https://tpass.jiangsu.chinatax.gov.cn:8443/#/login?response_type=code&client_id=s44fftt3bc634tcab4teasbaasba7ft4&redirect_uri=https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2FkxLogin%2Fauthorize&lang=en_US*" Then  
        ' 确保页面已加载完成  
        Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE  
            DoEvents ' 防止 Excel 冻结  
        Loop  
  
        ' 如果页面有框架,则获取正确的框架  
        ' 例如,假设我们要访问第一个框架,可以使用以下代码:  
        ' Set frame = IE.Document.frames(0)  
        ' Set doc = frame.Document  
         
        ' 在这个例子中,我们假设没有框架,或者我们直接与主文档交互  
        Set doc = IE.Document  
  
        ' 现在遍历链接并查找要点击的链接  
        For Each a In doc.getElementsByTagName("a")  
            If a.href = "https://tpass.jiangsu.chinatax.gov.cn:8443/#/login?response_type=code&client_id=s44fftt3bc634tcab4teasbaasba7ft4&redirect_uri=https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2FkxLogin%2Fauthorize&lang=en_US" Then  
                ' 等待一小段时间以确保 DOM 更新(可选)  
                Application.Wait (Now + TimeValue("0:00:01"))  
                a.Click  
                Exit For ' 找到并点击了链接,退出循环  
            End If  
        Next a  
  
        Exit For ' 找到并处理了正确的 IE 实例,退出循环  
    End If  
Next IE  
  
Set mShellwindows = Nothing  
Set IE = Nothing



第二种:

Public Function getIEInstance(sHTMLPageName As String) As Object
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Dim objInstances As Object, objIE As Object
    Dim sname As String

    Set objInstances = CreateObject("Shell.Application").windows
    Set getIEInstance = Nothing
    If objInstances.Count > 0 Then '/// make sure we have instances open.
    err.Clear


        For Each objIE In objInstances
On Error Resume Next
            sname = objIE.FullName


            If UCase(Right(sname, 12)) = "msedge.exe" Then '/// it's internet explorer not windows explorer.
                'If InStr(1, LCase(objIE.locationURL), LCase(sHTMLPageName)) <> 0 Then
                    Set getIEInstance = objIE
                    Exit For
               ' End If
            End If
            sname = ""
        Next
    End If

Exit Function

errhandler:
If err.Number <> 0 Then
   MsgBox err.Description + " " + sname, vbOKOnly, " getIEInstance"
End If

End Function
Private Sub nsrsbh_DblClick(Cancel As Integer)
Dim ieInstance As Object
    Dim htmlPageName As String
      
    ' 假设您想要查找的页面名(但实际上这个函数不使用这个)
    htmlPageName = "https://tpass.jiangsu.chinatax.gov.cn:8443/#/login?response_type=code&client_id=s44fftt3bc634tcab4teasbaasba7ft4&redirect_uri=https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2FkxLogin%2Fauthorize&lang=en_US"
      
    ' 调用函数尝试获取浏览器实例
Set ieInstance = getIEInstance(htmlPageName)
      
    ' 检查是否成功获取了实例
    If Not ieInstance Is Nothing Then
        ' 这里可以添加代码来处理ieInstance,例如访问页面、与页面交互等
        'MsgBox "成功获取到浏览器实例!"
        ieInstance.Document.parentWindow.execScript ("document.querySelectorAll('input')[1].focus()")
这种方法同样是纯ie浏览器才可以
测试msedge.exe 不成功
第三种是网友发布的“国外大神写的一个类,做了个简单的实例”调用Win32 API,运用管道技术调用文件套接字操作chrome内核浏览器的api接口的
无需任何第三方依赖;但实际测试中 只能每次关闭浏览器重新打开,
第四种结合SeleniumBasic这种需要配置环境且 浏览器打开是独占模式
感叹i比大多数ie爱好者年龄还大的浏览器 惨遭淘汰。。。。


TA的精华主题

TA的得分主题

发表于 2024-5-5 12:17 | 显示全部楼层
操控容易 关键直接嵌入接受浏览器对象 有难度
如果能获取已打开浏览器对象 ,那自动化就贼强了
纯vba cdp
https://club.excelhome.net/thread-1616347-1-1.html

VBA操作UC浏览器
https://club.excelhome.net/thread-1619567-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-5 13:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
perfect131 发表于 2024-5-5 12:17
操控容易 关键直接嵌入接受浏览器对象 有难度
如果能获取已打开浏览器对象 ,那自动化就贼强了
纯vba cdp ...

您发的第一条链接就是我帖子里提的第三种方法,行不通,另外vba WebBrowser 嵌套貌似 excel access 的WebBrowser 只支持ie 悲催,这了用到头了2010版本不知道后来的版本 有没有更新

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-5 19:21 | 显示全部楼层
真实服了强制用ShellExecute(0, "open", "https://默认浏览器打开 由于 ShellExecute 不返回浏览器对象,因此你不能使用 VBA 来与浏览器进行交互!!

TA的精华主题

TA的得分主题

发表于 2024-5-5 19:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 perfect131 于 2024-5-5 19:34 编辑
freeuping 发表于 2024-5-5 19:21
真实服了强制用ShellExecute(0, "open", "https://默认浏览器打开 由于 ShellExecute 不返回浏览器对象,因 ...
这个跟用什么语言没太大关系 跟浏览器有关
看浏览器有没有 句柄返回浏览器对象的属性或方法  就像 ie有个IID_IWebBrowser2
其他浏览器自己看看
cdp方法需要你自定义端口 然后就可以操控已打开的浏览器 就是类似selenium

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-6 17:38 | 显示全部楼层
xmlhttp/winhttp方法容易被检测机器人
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 07:40 , Processed in 0.029576 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表