通过Puppeteer在Discord发送消息(无需Bot、应用)的问题求助
你提到的Slate编辑器的状态和DOM是双向绑定的,只有通过原生输入行为触发它监听的输入事件,才会同步内部的内容状态,单纯修改DOM节点的文本内容不会被编辑器识别,这就是你之前修改innerText甚至span内容都无法触发发送的核心原因。
方案1:模拟真实键盘输入(最稳定)
该方案完全模拟普通用户的输入行为,会触发编辑器监听的所有输入事件,兼容性最好:
const selector = 'div[contenteditable=true]:nth-child(2)'; await page.goto('https://discord.com/channels/2358929835296835/39057203957203'); await page.waitForSelector(selector); // 点击触发聚焦,比单纯调用focus方法更贴近真实操作,避免聚焦失效 await page.click(selector); // 模拟键盘输入内容,可通过delay参数调整输入速度 await page.keyboard.type('Hello, world!', { delay: 30 }); // 触发回车发送 await page.keyboard.press('Enter');
方案2:模拟粘贴输入(适合长文本场景)
如果需要输入大量文本,不想等待键盘输入的耗时,可以通过剪贴板粘贴的方式实现,同样会触发编辑器的输入事件:
const selector = 'div[contenteditable=true]:nth-child(2)'; await page.goto('https://discord.com/channels/2358929835296835/39057203957203'); await page.waitForSelector(selector); await page.click(selector); // 将待输入内容写入剪贴板 await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello, world!'); // 模拟Ctrl+V粘贴(如果目标运行环境是MacOS,将Control替换为Meta即可) await page.keyboard.down('Control'); await page.keyboard.press('KeyV'); await page.keyboard.up('Control'); await page.keyboard.press('Enter');
补充兼容处理
如果执行上述方案后仍无法触发发送,可以在输入完成后主动派发一次input事件,强制同步编辑器状态:
await page.$eval(selector, el => { el.dispatchEvent(new Event('input', { bubbles: true })); });
内容的提问来源于stack exchange,提问作者mlg
相关产品推荐
相关产品推荐

