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

AShot库takeScreenshot方法截取特定元素报$未定义错误如何解决

问题产生原因

AShot库的整页截图逻辑和指定元素截图逻辑走的是两套坐标计算流程:

  • 整页截图时,AShot直接通过视口尺寸、页面滚动高度计算截图区域,不需要注入额外脚本操作页面DOM,因此可以正常运行
  • 针对指定元素截图时,AShot默认使用的坐标提供器会注入依赖jQuery的JavaScript脚本,用来获取元素的精确位置、尺寸、滚动偏移量,当截图目标页面没有加载jQuery、或者jQuery的$全局变量被覆盖/释放时,注入的脚本找不到$对象,就会抛出org.openqa.selenium.WebDriverException: unknown error: $ is not defined异常。
修复方案
  • 优先使用无jQuery依赖的坐标提供器(推荐)
    AShot自带了基于WebDriver原生API实现的坐标提供器WebDriverCoordsProvider,完全不依赖页面侧的jQuery环境,初始化AShot实例时手动指定该提供器即可解决问题,代码示例:
    import ru.yandex.qatools.ashot.AShot;
    import ru.yandex.qatools.ashot.Screenshot;
    import ru.yandex.qatools.ashot.coordinates.WebDriverCoordsProvider;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.By;
    
    // 业务代码
    WebElement element = driver.findElement(By.id("element"));
    // 整页截图逻辑不需要改动
    Screenshot shotFullscreen = new AShot().takeScreenshot(driver);
    // 元素截图指定坐标提供器
    Screenshot shot = new AShot()
            .coordsProvider(new WebDriverCoordsProvider())
            .takeScreenshot(driver, element);
    
  • 手动向页面注入jQuery
    如果需要保留默认坐标提供器的逻辑,可以在执行元素截图前,通过JS执行器手动向页面上下文注入jQuery脚本,保证全局$变量可用。注意尽量直接内嵌jQuery源码,不要依赖外部CDN地址,避免因为网络限制、CSP策略导致注入失败。
  • 检查自定义驱动的资源拦截规则
    排查AutoTestWebDriver的资源过滤配置,如果规则拦截了页面本身的jQuery脚本加载,调整规则放行对应资源,保证页面原生加载完成后window.jQuery和$全局变量正常存在即可。

内容的提问来源于stack exchange,提问作者user19324220

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:18:15