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)