本帖最后由 繁星 于 2026-5-19 00:25 编辑
目前autoit有WebDriver来操作浏览器,但是弊端就是需要chromedriver.exe来充当翻译器,而且还得对应浏览器版本
我就想寻找一种更简单直接得办法,最后找到了原生CDP协议操作浏览器,于是封装了一个3M的动态库来支撑Au3实现,不再受限于版本
参考资料:
https://chromedevtools.github.io/devtools-protocol
https://github.com/ChromeDevTools/awesome-chrome-devtools
https://github.com/mattsse/chromiumoxide
https://github.com/puppeteer/puppeteer
重要:目前只适配了Chrome和edge浏览器,DLL使用x64位编译(不再考虑32位)
浏览器管理
_AUCDP_Start($sDllPath) 加载 DLL
_AUCDP_Navigate($sUrl, $sConfig) 启动浏览器并导航到 URL,若已启动则重置会话
_AUCDP_Shutdown() 关闭浏览器并释放 DLL
_AUCDP_BuildConfig(...) 构造配置 JSON(路径、无头模式、窗口大小、超时等)
标签页管理
_AUCDP_TabOpen($sUrl) 打开新标签页,返回新标签句柄(≥1),新标签自动成为活动标签
_AUCDP_TabSwitch($iHandle) 切换活动标签页到指定句柄,浏览器 UI 同步聚焦
_AUCDP_TabClose($iHandle) 关闭指定标签页,若关闭的是当前活动标签则自动切换
_AUCDP_TabCount() 获取当前打开的标签页总数
_AUCDP_TabCurrent() 获取当前活动标签的句柄(无活动标签返回 -1)
_AUCDP_TabList() 返回所有标签句柄的 JSON 数组字符串,如 "[1,2,5]"
_AUCDP_Goto($sUrl) 让当前活动标签在原标签内跳转到新 URL(不开新标签)
页面内容
_AUCDP_GetPageTitle() 获取当前页面标题
_AUCDP_GetPageContent() 获取当前页面完整 HTML
_AUCDP_SetContent($sHtml) 直接灌入 HTML(不通过网络),适合本地模板渲染、截图等
_AUCDP_Evaluate($sJs) 执行 JavaScript 并返回 JSON 结果
_AUCDP_WaitForNavigation() 等待当前页面导航完成(如点击链接后)
_AUCDP_WaitForCount() 等待选择器匹配的元素数量达到下限
_AUCDP_Reload() 刷新当前页面
_AUCDP_GetUrl() 获取当前页面 URL
元素交互
_AUCDP_Click($sSelector) 点击元素
_AUCDP_ClickCount($sSelector, $iCount) 带次数的点击(1 单击 / 2 双击 / 3 三击)
_AUCDP_DoubleClick($sSelector) 双击元素(ClickCount 的便捷封装)
_AUCDP_Hover($sSelector) 鼠标悬停在元素上(用于展开下拉菜单等)
_AUCDP_SetValue($sSelector, $sValue) 通过 JS 设置输入框值(自动触发 input 事件,支持中文)
_AUCDP_GetText($sSelector) 获取元素的 innerText
_AUCDP_GetInnerHtml($sSelector) 获取元素的 innerHTML
_AUCDP_GetOuterHtml($sSelector) 获取元素的 outerHTML(含自身标签)
_AUCDP_ElementExists($sSelector) 判断元素是否存在(1 存在 / 0 不存在)
_AUCDP_WaitForSelector($sSelector, $iTimeout, $iInterval) 等待选择器出现,代替 Sleep,超时返回 0
_AUCDP_Focus($sSelector) 聚焦元素
_AUCDP_ScrollTo($sSelector) 滚动到元素可见位置
_AUCDP_DownloadImage($sSelector, $sPath) 下载图片(含动态 GIF,通过 fetch 获取)
_AUCDP_BoundingBox($sSelector) 获取元素位置和尺寸,返回 JSON {"x","y","width","height"}
_AUCDP_GetProperty($sSelector, $sProp) 获取元素的 JS 属性(返回 JSON,如 input 改值后的当前 .value)
XPath 选择器
_AUCDP_XPathClick($sXPath) 用 XPath 找到第一个匹配元素并点击
_AUCDP_XPathGetText($sXPath) 获取 XPath 第一个匹配元素的 innerText
_AUCDP_XPathExists($sXPath) XPath 是否匹配到任何元素(1 是 / 0 否)
_AUCDP_XPathCount($sXPath) XPath 匹配的元素数量
键鼠模拟
_AUCDP_PressKey($sKey) 模拟按键(Tab / Enter / Space / Escape / 方向键等)
_AUCDP_InsertText($sText) 在当前焦点处插入文本(支持中文)
_AUCDP_MoveTo($x, $y) 移动鼠标到屏幕坐标
截图
_AUCDP_PageScreenshot($sPath) 可视区截图保存为 PNG
_AUCDP_PageScreenshotFull($sPath) 整页截图保存为 PNG(含滚动区域)
_AUCDP_ElementScreenshot($sSelector, $sPath) 对指定元素截图保存为 PNG
_AUCDP_SavePdf($sPath) 将当前页面保存为 PDF
Cookie 管理
_AUCDP_GetCookies() 获取所有 Cookie,返回 JSON 数组字符串
_AUCDP_SetCookies($sJson) 设置 Cookie(传入 JSON 数组)
_AUCDP_ClearCookies() 清除所有 Cookie
_AUCDP_DeleteCookie($sName, $sUrl) 删除指定名字的 Cookie($sUrl 留空则用当前页面 URL)
HTTP 认证
_AUCDP_Authenticate($sUser, $sPass) HTTP Basic 认证,处理弹"用户名/密码"对话框的站点(凭证对后续所有请求生效)
对话框处理
_AUCDP_WaitForDialog($iTimeout) 阻塞等待下一个 alert/confirm/prompt 出现,返回 JSON {"type","message","url","defaultPrompt"},超时返回空字符串
_AUCDP_HandleDialog($bAccept, $sPromptText) 响应当前打开的对话框(True 接受 / False 取消,prompt 输入文本仅 prompt 类型有效)
_AUCDP_SetNextDialog($iAccept, $sPromptText) 预注册"下次对话框出现时自动如何响应",只生效一次(1 接受 / 0 拒绝 / -1 清除)
文件上传与下载
_AUCDP_UploadFile($sSelector, $sFilePath) 给 <input type="file"> 直接塞文件路径,不弹真实文件对话框
_AUCDP_UploadFiles($sSelector, $sPathsJson) 多文件上传,传 JSON 数组如 '["C:\\a.png","C:\\b.png"]'
_AUCDP_SetDownloadPath($sDir) 设置浏览器下载目录,后续点击下载链接的文件自动保存到此目录(不弹"另存为")
反爬与会话伪装
_AUCDP_EnableStealth() 启用反爬隐身模式,隐藏 webdriver、伪装 plugins/languages 等
_AUCDP_SetUserAgent($sUserAgent) 设置自定义 User-Agent
_AUCDP_SetExtraHeaders($sHeadersJson) 设置额外 HTTP 请求头(JSON 对象,如 '{"Referer":"..."}')
设备/环境模拟
_AUCDP_EmulateDevice($iWidth, $iHeight, $fScale, $bMobile) 模拟设备尺寸、像素比、移动端(响应式测试)
_AUCDP_EmulateGeo($fLat, $fLon, $fAccuracy) 模拟地理位置,影响 navigator.geolocation
_AUCDP_EmulateTimezone($sTimezone) 模拟时区,如 "Asia/Shanghai"、"America/New_York"
_AUCDP_EmulateLocale($sLocale) 模拟语言环境,如 "zh-CN"、"en-US"
_AUCDP_EmulateDarkMode($bEnabled) 切换 prefers-color-scheme 暗色/亮色模式
_AUCDP_SetOffline($bOffline) 模拟网络离线
_AUCDP_SetCacheEnabled($bEnabled) 启用/禁用浏览器缓存
浏览器与页面信息
_AUCDP_BrowserVersionInfo() 返回浏览器版本 JSON(协议版本、产品、UA、JS 引擎版本)
_AUCDP_PageMetrics() 返回页面性能指标 JSON 数组(DOM 节点数、JS 堆大小、布局次数等)
日志记录
_AUCDP_EnableLogging() 打开 DLL 内部日志记录
_AUCDP_DisableLogging() 关闭 DLL 内部日志记录
辅助函数
_AUCDP_GetAttribute($sSelector, $sAttr) 获取元素的指定 HTML 属性值
_AUCDP_ElementCount($sSelector) 统计匹配 CSS 选择器的元素数量
_AUCDP_EvaluateOnNewDocument($sJs) 在页面加载前注入 JavaScript(如隐藏 webdriver 特征)
_AUCDP_GetLastError() 获取最后一次操作的错误信息
_AUCDP_Version() 返回 DLL 版本字符串
常用启动方式:
; 自动检测模式(查找顺序优先google然后edge都没找到报错)
_AUCDP_Navigate("https://autoitx.com/")
; 指定使用Chrome(传真实路径)
_AUCDP_Navigate("https://autoitx.com/", _AUCDP_BuildConfig("C:\Program Files\Google\Chrome\Application\chrome.exe"))
; 指定使用Edge(传真实路径)
_AUCDP_Navigate("https://autoitx.com/", _AUCDP_BuildConfig("C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"))
; 自定义其他参数(传真实路路径,是否使用无头模式,浏览器宽度,浏览器高度,CDP请求超时秒数, 浏览器启动并就绪超时秒数)
_AUCDP_Navigate("https://autoitx.com/", _AUCDP_BuildConfig("C:\Program Files\Google\Chrome\Application\chrome.exe", True, 1920, 1080, 10, 30))
用户数据默认储存位置:%Temp%目录下aucdp_chrome和aucdp_edge,按需清理
最小化演示Bing搜索:#AutoIt3Wrapper_UseX64=y
#include "aucdp_udf.au3"
; ---------- 1. 加载 DLL ----------
If Not _AUCDP_Start(@ScriptDir & "\aucdpx64.dll") Then
Switch @error
Case 1
MsgBox(16, "致命错误", "DLL 加载失败" & @CRLF)
Case 2
MsgBox(16, "致命错误", "找不到 DLL:" & @CRLF & @ScriptDir & "\aucdpx64.dll")
EndSwitch
Exit 1
EndIf
_AUCDP_EnableLogging(@ScriptDir & "\aucdpx64.log", 3) ;开启DLL日志
; ---------- 2. 启动浏览器并打开 Bing ----------
If Not _AUCDP_Navigate("https://cn.bing.com") Then _Fail("启动浏览器并导航")
; ---------- 3. 等待搜索框就绪、填入关键词 ----------
If Not _AUCDP_WaitForSelector("#sb_form_q", 10000) Then _Fail("等待搜索框出现")
If Not _AUCDP_SetValue("#sb_form_q", "AutoIt中文论坛") Then _Fail("填入搜索词")
; ---------- 4. 提交搜索(回车或点按钮二选一) ----------
;~ If Not _AUCDP_PressKey("Enter") Then _Fail("按回车")
If Not _AUCDP_Click("label[for='sb_form_go']") Then _Fail("点击搜索按钮")
; ---------- 5. 等待结果页加载() ----------
If Not _AUCDP_WaitForCount("li.b_algo h2 a", 3, 10000) Then _Fail("等待搜索结果加载完成")
; ---------- 6. 输出信息 + 整页截图 ----------
ConsoleWrite("DLL版本: " & _AUCDP_Version() & @CRLF & _
"URL:" & _AUCDP_GetUrl() & @CRLF & _
"标题:" & _AUCDP_GetPageTitle() & @CRLF & _
"HTML:" & _AUCDP_GetPageContent() & @CRLF)
Local $sShot = @ScriptDir & "\bing_result.png"
If Not _AUCDP_PageScreenshotFull($sShot) Then _Fail("整页截图")
; ---------- 7. 收尾 ----------
_AUCDP_Shutdown()
ShellExecute($sShot)
; ============================================================
; 通用失败处理:报具体步骤 + dll真实错误,然后退出
; ============================================================
Func _Fail($sStep)
Local $sErr = _AUCDP_GetLastError()
Local $sMsg = "[" & $sStep & "] 失败"
If $sErr <> "" Then $sMsg &= @CRLF & @CRLF & "DLL 错误信息:" & @CRLF & $sErr
MsgBox(16, "操作失败", $sMsg)
ConsoleWrite("! " & $sMsg & @CRLF)
_AUCDP_Shutdown()
Exit 1
EndFunc
历时一周迭代了3个大版本主要新增功能函数,和数个小版本修复BUG
udf库下载:
目前实验性的实现了一些功能,使用本论坛登录来演示下
测试环境Windows10(22H2)+Autoit3.3.18.0+Google Chrome148.0.7778.97正式版(64 位) +Microsoft Edge148.0.3967.54 (正式版本) (64 位)
有问题和错误跟帖反馈,考虑不周的地方再修复
|