我在使用pyautogui在模拟鼠标移动和键盘交互的时候,一旦鼠标移动,可能就会发生这个异常:
pyautogui.FailSafeException: PyAutoGUI fail-safe triggered from mouse
moving to a corner of the screen. To disable this fail-safe, set
pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.
解决方法:
1. 禁用故障保护:
import pyautogui
pyautogui.FAILSAFE = False
这样设置后,即使鼠标移动到屏幕角落,也不会触发 FailSafeException
异常。
不过,禁用故障保护(FAIL-SAFE)可能会导致意外的行为,因为在启用故障保护时,如果将鼠标移动到屏幕左上角,将触发 pyautogui.FailSafeException
异常以停止程序。禁用故障保护后,程序将不会停止,而是继续执行。因此,建议在使用 pyautogui
时小心谨慎。
除了禁用故障保护机制,还有其他几种方法可以避免 pyautogui.FailSafeException
:
2. 增加暂停时间:
在每次调用 pyautogui
的函数后设置一个暂停时间,这样可以给用户一个反应的机会,避免鼠标快速移动到屏幕角落触发故障保护。可以通过设置 pyautogui.PAUSE
变量来实现:
pyautogui.PAUSE = 2.5
这样每次执行 pyautogui
的操作后,程序会自动暂停2.5秒。
3. 获取屏幕和鼠标位置信息:
在执行鼠标移动操作之前,可以先获取当前屏幕的分辨率和鼠标的位置,以确保鼠标移动的坐标在屏幕范围内,避免移动到屏幕角落:
width, height = pyautogui.size()
currentMouseX, currentMouseY = pyautogui.position()
通过这些信息,可以更安全地控制鼠标的移动。
4. 使用相对移动:
使用 pyautogui.moveRel()
函数进行相对移动,而不是绝对移动。这样可以从当前位置移动鼠标,减少直接移动到屏幕角落的风险:
pyautogui.moveRel(30, -50, duration=0.5)
这个函数会将鼠标从当前位置向右移动30像素,向下移动-50像素。
5. 检查坐标是否在屏幕上:
在移动鼠标之前,可以使用 pyautogui.onScreen(x, y)
函数检查目标坐标是否在屏幕上,如果不在,可以调整坐标或取消操作:
if pyautogui.onScreen(x, y):
pyautogui.moveTo(x, y)
else:
print("坐标超出屏幕范围")
这样可以避免将鼠标移动到屏幕外的区域。
通过上述步骤,我们可以解决因触发故障保护而导致的 pyautogui.FailSafeException
异常问题。
不过,pyautogui确实是很好的模拟交互的包,但是因为动用了屏幕位置和鼠标,就影响到使用。
所以如果可以用其他方法。例如find_element的方法这种的话,那就还是建议用这种