PyAutoGUI - 结果只会被解析一次
PyAutoGUI - result will only get parsed once
我正在尝试使一件简单的事情自动化。
弹出一个弹出窗口,我的脚本找到它并单击我截图的按钮 (erteilen.png)。
半秒后,同样的弹出窗口再次弹出,但我的脚本不会注意到它。
这是我的代码:
import pyautogui as pg
while True:
window = pg.locateOnScreen("erteilen.png", minSearchTime=3, confidence=0.9)
try:
print(window)
pg.click(x=window.left+int(window.width/2), y=window.top+int(window.height/2), clicks=3)
except Exception as e:
print("Error:", e)
break
它将点击找到的 window,然后再次打开相同的 window,但脚本不会再次定位它。
当我单击命令 window 时,pyautogui 似乎会刷新它的屏幕,然后找到 window.
我如何告诉 PyAutoGUI 'refresh' 它自己看到了什么,以便它获得更新的信息并找到新的 windows?
没有 Pyautogui 使用的可以“刷新”屏幕的功能。它获取屏幕副本并在每次 pg.locateOnScreen
调用时对其进行分析。您可以确认,该脚本正在根据所使用的资源进行工作。当脚本运行时,您可以看到 CPU 负载很高。
我试图在 Windows 10 和 Linux 上重现您的问题。 Pyautogui 在 Linux 上比在 Windows 上工作更可靠。对于相同的搜索按钮,我必须在 Windows 上将置信度降低到 0.6 才能使相同的事情起作用。在 Linux 置信度 0.9 上工作得很好。
首先,阻止一切可靠工作的是您的代码本身。当minSearchTime
过期时,locateOnScreen
方法returnsNone
。那导致你的脚本崩溃。
您可以通过在 locateOnScreen
方法调用中添加 grayscale=True
来提高性能。
如果在屏幕上找不到图像,pg.locateOnScreen
也可以提高 ImageNotFoundException
。
一些浏览器可能包含一些防止机器人的策略。例如,我无法关闭 Brave 浏览器生成的弹出窗口。
为了克服这个问题,您应该在图像中找到的按钮和鼠标点击之间引入随机超时。另外,你总是点击同一个地方。你应该稍微随机化一下鼠标位置。
我整理了代码片段,它在 Windows 和 Linux 环境中可靠地工作,每 3 秒关闭生成的 alert
消息。
import random
from time import sleep
import pyautogui as pg
from pyautogui import ImageNotFoundException
offset = 3
while True:
# Locate button on screen in grayscale mode
try:
window = pg.locateOnScreen("search.png", minSearchTime=3, confidence=0.9, grayscale=True)
except ImageNotFoundException as e:
# Thrown by pg.locateOnScreen
# Continue searching
continue
if window is None:
# Button was not found in the screen
# Continue searching
continue
# Random sleep from 100 ms to 1 second
sleep(random.randint(1, 10) / 10)
# Random mouse position within button
rand_x_pos = random.randint(int(window.left) + offset, window.left + int(window.width) - offset)
rand_y_pos = random.randint(int(window.top) + offset, window.top + int(window.height) - offset)
# Click on the button
pg.click(x=rand_x_pos, y=rand_y_pos, clicks=3)
这是javascript生成警报消息:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<script type="text/javascript">
setInterval(function() {
alert("Message to alert every 3 seconds");
}, 3000);
</script>
</body>
</html>
这是 search.png
图片,是 Brave 浏览器中使用的 OK
按钮。
如果调用 except 块,您将退出程序。您可能想使用 continue
语句来代替
如果出现错误,您的代码应该不会中断,您应该替换您的代码:
import pyautogui as pg
while True:
window = pg.locateOnScreen("erteilen.png", minSearchTime=3, confidence=0.9)
try:
print(window)
pg.click(x=window.left+int(window.width/2), y=window.top+int(window.height/2), clicks=3)
except Exception as e:
print("Error:", e)
我正在尝试使一件简单的事情自动化。 弹出一个弹出窗口,我的脚本找到它并单击我截图的按钮 (erteilen.png)。 半秒后,同样的弹出窗口再次弹出,但我的脚本不会注意到它。
这是我的代码:
import pyautogui as pg
while True:
window = pg.locateOnScreen("erteilen.png", minSearchTime=3, confidence=0.9)
try:
print(window)
pg.click(x=window.left+int(window.width/2), y=window.top+int(window.height/2), clicks=3)
except Exception as e:
print("Error:", e)
break
它将点击找到的 window,然后再次打开相同的 window,但脚本不会再次定位它。 当我单击命令 window 时,pyautogui 似乎会刷新它的屏幕,然后找到 window.
我如何告诉 PyAutoGUI 'refresh' 它自己看到了什么,以便它获得更新的信息并找到新的 windows?
没有 Pyautogui 使用的可以“刷新”屏幕的功能。它获取屏幕副本并在每次 pg.locateOnScreen
调用时对其进行分析。您可以确认,该脚本正在根据所使用的资源进行工作。当脚本运行时,您可以看到 CPU 负载很高。
我试图在 Windows 10 和 Linux 上重现您的问题。 Pyautogui 在 Linux 上比在 Windows 上工作更可靠。对于相同的搜索按钮,我必须在 Windows 上将置信度降低到 0.6 才能使相同的事情起作用。在 Linux 置信度 0.9 上工作得很好。
首先,阻止一切可靠工作的是您的代码本身。当
minSearchTime
过期时,locateOnScreen
方法returnsNone
。那导致你的脚本崩溃。您可以通过在
locateOnScreen
方法调用中添加grayscale=True
来提高性能。如果在屏幕上找不到图像,
pg.locateOnScreen
也可以提高ImageNotFoundException
。一些浏览器可能包含一些防止机器人的策略。例如,我无法关闭 Brave 浏览器生成的弹出窗口。
为了克服这个问题,您应该在图像中找到的按钮和鼠标点击之间引入随机超时。另外,你总是点击同一个地方。你应该稍微随机化一下鼠标位置。
我整理了代码片段,它在 Windows 和 Linux 环境中可靠地工作,每 3 秒关闭生成的 alert
消息。
import random
from time import sleep
import pyautogui as pg
from pyautogui import ImageNotFoundException
offset = 3
while True:
# Locate button on screen in grayscale mode
try:
window = pg.locateOnScreen("search.png", minSearchTime=3, confidence=0.9, grayscale=True)
except ImageNotFoundException as e:
# Thrown by pg.locateOnScreen
# Continue searching
continue
if window is None:
# Button was not found in the screen
# Continue searching
continue
# Random sleep from 100 ms to 1 second
sleep(random.randint(1, 10) / 10)
# Random mouse position within button
rand_x_pos = random.randint(int(window.left) + offset, window.left + int(window.width) - offset)
rand_y_pos = random.randint(int(window.top) + offset, window.top + int(window.height) - offset)
# Click on the button
pg.click(x=rand_x_pos, y=rand_y_pos, clicks=3)
这是javascript生成警报消息:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<script type="text/javascript">
setInterval(function() {
alert("Message to alert every 3 seconds");
}, 3000);
</script>
</body>
</html>
这是 search.png
图片,是 Brave 浏览器中使用的 OK
按钮。
如果调用 except 块,您将退出程序。您可能想使用 continue
语句来代替
如果出现错误,您的代码应该不会中断,您应该替换您的代码:
import pyautogui as pg
while True:
window = pg.locateOnScreen("erteilen.png", minSearchTime=3, confidence=0.9)
try:
print(window)
pg.click(x=window.left+int(window.width/2), y=window.top+int(window.height/2), clicks=3)
except Exception as e:
print("Error:", e)