[如何在屏幕的特定位置搜索图像,以不超过'x'秒的持续时间进行搜索,直到找到图像?如果找不到该图像,则返回False;如果找到该图像,则返回找到的位置的坐标...也可以自动单击它。
当等待来自加载的网页的特定视觉响应时,此功能就是“完成”的触发器。我创建的自动化操作仅基于可视化操作来浏览网站,因此不应将libs用作请求或硒。 lib pyautogui是我发现的最好的工具,但是它的方法非常初级(仅关注基本知识),我无法创建更多实用的功能。
import logging
import pyautogui as pag
from PIL import Image
import time
def pag_suf(img, x, y, margin, clicks=0, duration=0, interval=0,
debug_msg='', time_limit=None, sample_dump=None):
"""
Pyautogui - Search Until Find
Searches the image indefinitely at a specific point on the screen
considering as the search area, the image size plus an expansion margin.
If found, you can click on the center of the image.
:param img: String. Fullpath image | List. List of Fullpath image
:param x: coordinate x
:param y: coordinate y
:param margin: Integer. expansion margin to expand the search area
:param clicks: Integer. number of clicks
:param duration: Float. duration of mouse movement
:param interval: Float. sleep time after click
:param time_limit: Integer. Time limit in seconds
:param debug_msg: String. Debug message to identify log
:param sample_dump: String. File name if image .bmp
:return: List. Coordinates of the center of the found image. |
False. If time_limit reached.
"""
is_string = type(img) == str
list_img = []
if is_string:
list_img.append(img)
else:
list_img = img
# Search for image at the indicated location with tolerance margins
retorno = None
logging.debug(f"{debug_msg}: Finding...")
first_loop = True
start_time = time.time()
while retorno is None:
# Scape in time_limit
if time_limit is not None:
elapsed_time = time.time() - start_time
if elapsed_time > time_limit:
return False
else:
pass
else:
pass
if first_loop is False:
time.sleep(0.5)
else:
first_loop = False
for img in list_img:
im = Image.open(img)
# Defining variables
img_width, img_height = im.size
coor_x = x - img_width / 2 - margin
coor_y = y - img_height / 2 - margin
region_x = img_width + margin * 2
region_y = img_height + margin * 2
# Save collected sample
screen_amostra = pag.screenshot(imageFilename=sample_dump,
region=(coor_x, coor_y,
region_x, region_y))
retorno = pag.locate(img, screen_amostra)
if retorno is not None:
# logging.debug(img)
break
logging.debug(f"{debug_msg}: Found.")
click_x = coor_x + retorno[0] + img_width / 2
click_y = coor_y + retorno[1] + img_height / 2
# Click on the center of the found location
if clicks != 0:
pag.click(click_x, click_y, clicks,
duration=duration, interval=interval)
click_arr = []
click_arr.append(click_x)
click_arr.append(click_y)
return click_arr