You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让AutoHotkey V2脚本等待网页通过Ajax更新后再执行操作?

如何让AutoHotkey V2脚本等待网页通过Ajax更新后再执行操作?

看起来你现在用固定的Sleep来等待Ajax加载,但这种方法在加载时间不稳定时既浪费时间又容易出错——完全懂这种痛点!下面给你几个更可靠的方案,从简单到接近你长期目标的都有:

方案1:等待目标DOM元素出现(推荐,更稳定)

既然你提到想等class="cite-header"的div出现,那直接检测这个元素是最靠谱的,比像素坐标稳定得多,也正好是你长期目标的简化版。AutoHotkey V2可以通过COM接口和浏览器交互,下面是针对Chrome/Edge的实现:

前提准备

Chrome/Edge需要在启动时启用自动化接口:右键浏览器快捷方式→属性→目标栏,在末尾加上 --enable-automation(注意前面有空格),然后重启浏览器。

修改后的脚本

#SingleInstance Force

^`::
{
    KeyWait "Control"
    Send "{home}+{click 1855, 509}"
    
    ; 等待class="cite-header"的元素出现,超时10秒(可根据需求调整)
    if (WaitForElement("cite-header", 10000)) {
        ; 元素加载完成后执行后续操作
        MouseClickDrag "left", 1705, 367, 1710, 402
        Sleep(100) ; 短等待确保文本选中完成
        MouseClickDrag "left", 1660, 569, 451, 504
        Sleep(100)
        Send "{ctrl down}c{ctrl up}{f1}"
    } else {
        MsgBox("超时警告:目标元素未出现,脚本终止")
    }
    return
}

; 自定义函数:等待指定类名的DOM元素出现
WaitForElement(className, timeout := 10000) {
    startTime := A_TickCount
    while (A_TickCount - startTime < timeout) {
        try {
            ; 获取当前活动浏览器标签页的文档对象
            browser := ComObjActive("ChromeTab.ChromeFrame") ; Edge替换为MicrosoftEdgeTab.EdgeFrame
            doc := browser.Document
            ; 检查是否存在目标类名的元素
            elements := doc.getElementsByClassName(className)
            if (elements.length > 0) {
                return true
            }
        } catch {
            ; 如果获取失败(比如浏览器没激活),继续循环等待
        }
        Sleep(100) ; 每100毫秒检查一次,避免占用过多资源
    }
    return false
}

这个方法的好处是完全不受像素偏移影响,只要页面元素的类名不变,脚本就能稳定工作,也为你后续直接抓取div内容打下基础。

方案2:等待像素颜色变化(适合不想改浏览器设置的情况)

如果你暂时不想调整浏览器启动参数,可以用像素变化来判断页面是否更新——选一个Ajax加载后一定会变色的像素点即可:

修改后的脚本

#SingleInstance Force

^`::
{
    KeyWait "Control"
    Send "{home}+{click 1855, 509}"
    
    ; 先记录目标区域的初始像素颜色(这里选你要选中的文本区域的一个点)
    PixelGetColor(&initialColor, 1705, 367)
    ; 等待这个像素颜色变化,超时10秒
    if (WaitForPixelChange(1705, 367, initialColor, 10000)) {
        MouseClickDrag "left", 1705, 367, 1710, 402
        Sleep(100)
        MouseClickDrag "left", 1660, 569, 451, 504
        Sleep(100)
        Send "{ctrl down}c{ctrl up}{f1}"
    } else {
        MsgBox("超时警告:页面未更新,脚本终止")
    }
    return
}

; 自定义函数:等待指定坐标的像素颜色变化
WaitForPixelChange(x, y, initialColor := "", timeout := 10000) {
    startTime := A_TickCount
    if (initialColor = "") {
        PixelGetColor(&initialColor, x, y)
    }
    while (A_TickCount - startTime < timeout) {
        PixelGetColor(&currentColor, x, y)
        if (currentColor != initialColor) {
            return true
        }
        Sleep(100)
    }
    return false
}

注意:这个方法可能会因为页面的微小变化(比如鼠标 hover 高亮)误判,所以最好选一个Ajax加载后颜色必然改变的稳定像素点。

小提示

如果后续想直接抓取div里的内容,不用鼠标拖拽,其实可以在WaitForElement函数里拿到元素后,直接用element.innerText获取文本,再复制到剪贴板,比如:

element := doc.getElementsByClassName("cite-header")[0]
Clipboard := element.innerText

这样就完全摆脱鼠标操作的依赖,稳定性会大幅提升~

备注:内容来源于stack exchange,提问作者Wolfpack'08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:17:42