You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Puppeteer-Sharp中获取当前鼠标位置?适配Node.js代码失败求助

解决Puppeteer-Sharp中获取当前鼠标位置的问题

你遇到的问题核心在于全局变量未正确挂载,以及鼠标事件未触发时的默认值逻辑问题,下面是具体的分析和可行的解决方案:

问题根源拆解

你之前的代码里,mouseXmouseYonmousemove回调内的局部变量,并没有挂载到window全局对象上,所以后续通过window.offsetX访问时,这个变量根本不存在,转换成int类型就会默认返回0。另外,如果页面从未触发过mousemove事件(比如你没模拟鼠标移动),这些变量也不会被赋值,自然只能拿到初始的0值。

正确实现方案

1. 注入全局鼠标坐标监听代码

首先在页面中注入一段代码,把鼠标坐标挂载到window对象上,并监听mousemove事件实时更新坐标:

await page.EvaluateFunctionAsync(@"() => {
    // 初始化全局鼠标位置对象,避免未触发事件时返回undefined
    window.mousePosition = { 
        x: 0, 
        y: 0 
    };

    // 监听鼠标移动事件,实时更新全局坐标
    document.addEventListener('mousemove', (e) => {
        // 这里可以根据需求选择不同的坐标类型:
        // - e.clientX/e.clientY: 相对于浏览器视口左上角(不含滚动偏移)
        // - e.pageX/e.pageY: 相对于文档左上角(包含滚动偏移)
        // - e.offsetX/e.offsetY: 相对于触发事件的元素左上角
        window.mousePosition.x = e.clientX;
        window.mousePosition.y = e.clientY;
    });
}");

2. 获取当前鼠标坐标

之后需要获取坐标时,直接读取全局的mousePosition对象即可:

// 读取全局鼠标位置
var mousePos = await page.EvaluateExpressionAsync<dynamic>("window.mousePosition");
int x = mousePos.x;
int y = mousePos.y;

MessageBox.Show($"当前鼠标坐标:X={x}, Y={y}");

3. 处理未触发鼠标移动的场景

如果你的代码没有模拟鼠标移动操作,Puppeteer默认的鼠标位置是(0,0),这时候可以主动通过Mouse类模拟移动:

// 模拟鼠标移动到视口(150, 250)的位置
await page.Mouse.MoveAsync(150, 250);

// 之后再获取坐标就会得到更新后的值
var mousePos = await page.EvaluateExpressionAsync<dynamic>("window.mousePosition");

关键注意事项

  • 必须把坐标变量挂载到window上,否则页面上下文外的代码无法访问这些变量。
  • 根据业务需求选择合适的坐标类型(clientX/YpageX/YoffsetX/Y),避免拿到不符合预期的位置值。
  • 如果页面有动态加载内容,确保在页面加载完成后再注入监听代码,防止事件监听失效。

内容的提问来源于stack exchange,提问作者Мистер

火山引擎 最新活动