Bootstrap

【Puppeteer】‘left‘ is already pressed, ‘${button}‘ is already pressed 的解决办法

解决过程如下

这是我原来的代码,不管我怎么修改,都一直会出现 'left' is already pressed 这个错误

找了很多资料 搜了 很多网站都 找不到解决办法

async function dragAndDrop(page, canvasSelector, startX, startY, endX, endY) {
    const startCoordinates = await getAbsoluteCoordinates(page, canvasSelector, startX, startY);
    const endCoordinates = await getAbsoluteCoordinates(page, canvasSelector, endX, endY);

    // 移动到起始点并按下鼠标
    await page.mouse.move(startCoordinates.x, startCoordinates.y);
    await page.mouse.down();

    // 拖动到目标点
    await page.mouse.move(endCoordinates.x, endCoordinates.y);

    // 松开鼠标按钮
    await page.mouse.up();
}

后来跟 GPT 问答了10个来回,终于得到了 AI 的灵感提示,找到了解决办法

async function dragAndDrop(page, canvasSelector, startX, startY, endX, endY) {
    // 获取起始和结束点的绝对坐标
    const startCoordinates = await getAbsoluteCoordinates(page, canvasSelector, startX, startY);
    const endCoordinates = await getAbsoluteCoordinates(page, canvasSelector, endX, endY);

    // 移动到起始位置
    await page.mouse.move(startCoordinates.x, startCoordinates.y);
    await new Promise(resolve => setTimeout(resolve, 100)); // 等待 100 毫秒

    // 确保鼠标按钮未被按下,尝试释放按钮
    try {
        await page.mouse.up();
    } catch (e) { } // 捕获并忽略可能的错误(例如:按钮未按下的错误)

    // 按下鼠标按钮
    await page.mouse.down();
    await new Promise(resolve => setTimeout(resolve, 100)); // 等待 100 毫秒

    // 拖动到目标点
    await page.mouse.move(endCoordinates.x, endCoordinates.y);
    await new Promise(resolve => setTimeout(resolve, 100)); // 等待 100 毫秒

    // 松开鼠标按钮
    // await page.mouse.up();
    // 确保鼠标按钮未被按下,尝试释放按钮
    try {
        await page.mouse.up();
    } catch (e) { } // 'left' is already pressed 由于这个错误 一直出现,所以 逼不得已出此下策 做的兼容 // 捕获并忽略可能的错误(例如:按钮未按下的错误)
}

总结: 解决办法

 try {
        await page.mouse.up();
    } catch (e) { } // 捕获并忽略可能的错误(例如:按钮未按下的错误)
;