Python中selenium自动化测试网页时,为何必须晃动鼠标才能避免超时?

环境:wind10,chrome65/redhat7.4,chrome65

远程操作,vnc 或者远程桌面做自动化测试的时候,总是需要晃动下鼠标,不然程序就会超时报出异常,这个要怎么破?以前有人说是远程的问题,觉得 selenium 不至于啊,应该考虑到了这个远程的问题啊

请教大家这个怎么破解呢?


Python中selenium自动化测试网页时,为何必须晃动鼠标才能避免超时?
14 回复

远端的 windows 有休眠机制吧,selenium 是应用层的又决定不了系统层的事


我明白你的问题。你在用Selenium做自动化测试时,发现有时候脚本会卡住或者超时,但手动晃动一下鼠标,脚本又能继续跑了,对吧?

这其实是个挺经典的坑,根源在于浏览器的“节流”或“节能”机制。很多现代浏览器(比如Chrome)为了省电,当它检测到一段时间没有用户交互(比如鼠标移动、键盘输入)时,会主动降低后台标签页的JavaScript执行速度或定时器的精度,甚至暂停一些非必要的渲染任务。Selenium驱动的浏览器,如果没有模拟出“用户活动”,就会被浏览器判定为“非活动页面”,从而被限流。

你的脚本可能卡在某个需要页面完全加载或等待JavaScript执行完成的操作上(比如 WebDriverWait)。因为浏览器被“节流”了,页面加载或JS执行变得极慢甚至停滞,导致Selenium的等待条件一直无法满足,最终超时。你一动鼠标,相当于向浏览器发送了“用户活动”信号,它立刻解除限制,一切就恢复正常了。

根本的解决办法不是去晃动鼠标,而是通过启动选项告诉浏览器:“别给我节流,我是自动化测试”。

这里给你一个完整的、可运行的Chrome示例。关键就是添加 --disable-background-timer-throttling--disable-renderer-backgrounding 这两个参数。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 1. 设置Chrome选项,禁用后台节流
chrome_options = Options()
chrome_options.add_argument("--disable-background-timer-throttling")
chrome_options.add_argument("--disable-renderer-backgrounding")
# 可选:为了更稳定的自动化环境,通常还会加上下面这两个
chrome_options.add_argument("--disable-backgrounding-occluded-windows")
chrome_options.add_argument("--disable-popup-blocking")
# 如果不需要GUI界面,可以无头运行
# chrome_options.add_argument("--headless")

# 2. 使用这些选项启动浏览器
driver = webdriver.Chrome(options=chrome_options)

try:
    # 3. 你的测试脚本
    driver.get("https://www.example.com")
    
    # 使用显式等待,而不是死等
    wait = WebDriverWait(driver, 10)
    # 假设等待某个元素出现
    element = wait.until(
        EC.presence_of_element_located((By.TAG_NAME, "h1"))
    )
    print(f"页面标题元素找到: {element.text}")
    
    # ... 这里执行你的其他测试操作 ...
    
finally:
    # 4. 记得关闭浏览器
    driver.quit()

总结一下: 别用晃动鼠标这种歪招,正确的姿势是通过浏览器启动参数禁用后台优化。

一句话建议: 在启动浏览器时添加 --disable-background-timer-throttling 参数即可。

试试禁用远程系统休眠。

已经取消了 windows 休眠,rhel7 的屏保,可是还是会发生超时,一个现象就是晃动鼠标,就会运行加速一下。

没用过,测 chrome 推荐用官方的 puppeteer

问题是 firefox,chrome 都会发生这种事情,需要晃动鼠标刺激一下,要不就超时了。

现在在 windows 下用鼠标精灵来定时刺激;
rhel 没想到什么方法来做。

那你就用 autogui 晃一下鼠标

有没有根治的方法呢

不就是 session 过期的问题吗
看下 driver 里面有没有设置超时的

有啊,设置了超时啊,webdriverwait 都有设置啊,可是总觉得不是 session 过期,为什么鼠标刺激一下,就能加快测试呢

好像是有这个问题,我用 Linux 的 Selenium Grid Docker

docker 上也会这样?觉得好多人没有遇到这个问题,难道大家都是看着程序自己运行?不做别的?

话说有解决方案吗?插入一段 autogui 代码?

回到顶部