如何提升Python Selenium鼠标点击速度?有没有性能更优的同类替代库?
核心原因分析
原生Selenium的element.click()是同步阻塞调用,每次执行都会向浏览器驱动发送指令,等待驱动执行完成并返回结果,全程需要经过「Python进程→浏览器驱动→浏览器内核」的多进程通信,再叠加你180ms左右的网络延迟,自然会出现每秒点击次数和1000/180计算结果吻合的情况。
而空格键输入更快是因为send_keys的事件触发机制不需要等待点击事件的完整冒泡确认,通信开销更低。
你之前测试的JS点击失效不是代码写错了,是绝大多数点击测速站点监听的是mousedown/mouseup事件而非click事件(click是mousedown+mouseup完成后才触发的合成事件),直接调用click()方法不会触发站点的计数逻辑。
优化方案
1. 修复并优先使用JS触发事件
不需要每次在Python端循环发送点击指令,直接在浏览器端注入JS执行点击逻辑,完全规避Python和浏览器之间的通信开销,速度提升最明显:
# 替换你当前mode=0下的循环点击逻辑 Firefox.execute_script(""" const button = document.getElementById('clickarena'); const end = Date.now() + 30 * 1000; const clickLoop = () => { if (Date.now() > end) return; // 触发站点监听的mousedown、mouseup事件 button.dispatchEvent(new MouseEvent('mousedown', {bubbles: true})); button.dispatchEvent(new MouseEvent('mouseup', {bubbles: true})); requestAnimationFrame(clickLoop); }; clickLoop(); """) # 直接等待30秒即可,不需要在Python端循环发指令 time.sleep(30)
2. 调整浏览器启动参数降低额外开销
启动Firefox时禁用不必要的资源加载、开启无头模式,减少渲染开销:
from selenium.webdriver.firefox.options import Options options = Options() options.add_argument('--headless') # 无头模式,不渲染UI options.add_argument('--disable-images') # 禁用图片加载 options.page_load_strategy = 'eager' # 只等DOM加载完成就返回,不等图片、字体等资源 Firefox = webdriver.Firefox(options=options)
3. 优化现有Selenium代码的冗余操作
- 所有元素定位只执行一次,缓存到变量复用,不要在循环里重复执行
find_element - 删掉没必要的
time.sleep,用显式等待替代,减少无效等待时间
替代工具推荐
如果还是达不到性能要求,推荐使用Playwright,它是微软推出的自动化测试工具,和Selenium用法高度相似,基于Chrome DevTools Protocol直接和浏览器内核通信,没有Selenium的中间层开销,异步版本的执行速度比Selenium高3~10倍,原生支持多浏览器、自动等待等特性,不需要手动处理很多兼容性问题。
如果需要更高的点击频率,还可以直接用Playwright的异步API批量发送事件指令,或者和上面一样注入JS在浏览器端执行逻辑。
内容的提问来源于stack exchange,提问作者Ξένη Γήινος

