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
相关产品推荐
相关产品推荐

