Jump to content

Como capturar e automatizar janelas de popup com PyAutoGUI no Python?


Gustavo Antunes

Postagens Recomendadas

Olá...

Gostaria de uma ajuda com um código que estou desenvolvendo, estou automatizando um programa de entrega de imposto de renda o IRPF 2024 esta tudo correndo bem apesar da minha inexperiência, porém cheguei a um beco no fim da entrega do contribuinte dependendo do preenchimento "que vem de uma planilha" podem ocorrer alguns eventos diferentes, mas todos ele são exibidos em uma janela de popup e dependendo da janela que abrir o bot tem que segui uma instrução diferente. Bem, a lógica das instruções eu já consegui desenvolver, porém, estou tendo problemas para capturar a janela de popup para poder fazer a instrução rodar corretamente. E estou usando a biblioteca pyautogui para tentar identificar a imagem que está na tela, mas não está funcionando. Alguém tem alguma dica para me ajudar?

  • Curtir 1
Link to comment
Compartilhe em outros sites

  • 4 weeks later...
  • Pessoal da TecnoSpeed

Olá @Gustavo Antunes.

Pelo que usei do pyautogui para coisas simples, é muito complexo você precisar "identificar" informações de uma página WEB com ele... 

Existem algumas abordagens, mas precisa existir um padrão nessas janelas de popup... 

Caso todas as interações que precisa realizar sejam em uma aplicação WEB (Navegador) tenta estudar a possibilidade de usar um Selenium... é mais prático de automatizar ações em aplicações WEB pois você consegue interagir e identificar informações através do HTML. 

Porém se mesmo assim preferir fazer via pyautogui comenta aqui como exatamente aparecem esses popups e a forma que está tentando identificar as informações dele.

Informações como print do popup (Caso possível) são sempre bem vindas.

  • Curtir 2
Link to comment
Compartilhe em outros sites

  • 2 weeks later...

Olá amigo Dev, Boa tarde!!

Então uma dica que posso dar para tentar ajudar é usar a Lib "Keyboard" para simular algumas teclas, por exemplo se na janela de pop up responder aos comandos de teclado como uma seta para baixo um Tab, espaço etc.. você pode usar ela para manipular o teclado da maneira que deseja.

Exemplo que me ajudou para manipular caixas de Alert:

image.png

image.png

OBS: Assim como o @Thanael disse anteriormente, quando puder e tiver um tempinho de uma olhada no Selenium, se comporta muito melhor para automações em WEB. Espero ter ajudado.🙂 

  • Curtir 2
Link to comment
Compartilhe em outros sites

Em 20/05/2024 at 08:25, Thanael disse:

Olá @Gustavo Antunes.

Pelo que usei do pyautogui para coisas simples, é muito complexo você precisar "identificar" informações de uma página WEB com ele... 

Existem algumas abordagens, mas precisa existir um padrão nessas janelas de popup... 

Caso todas as interações que precisa realizar sejam em uma aplicação WEB (Navegador) tenta estudar a possibilidade de usar um Selenium... é mais prático de automatizar ações em aplicações WEB pois você consegue interagir e identificar informações através do HTML. 

Porém se mesmo assim preferir fazer via pyautogui comenta aqui como exatamente aparecem esses popups e a forma que está tentando identificar as informações dele.

Informações como print do popup (Caso possível) são sempre bem vindas.

Thanael, eu acho que não expliquei direito a automação e em cima de um programa (IRPF2024, fornecido pela receita federal) e não na web. Desculpa!

Link to comment
Compartilhe em outros sites

Vou deixar algumas funções que você pode utilizar de imagens pelo pyautogui.

Exemplo de como chamar as funções:

_click_img('salvar.png', conf=0.9) - Clicka na imagem assim que ela aparecer

_wait_img('salvar.png', conf=0.9) - Aguarda até a imagem aparecer
while not _find_img('selecione_arquivo.png', conf=0.9): - Enquanto não achar a imagem faz uma ação.
	time.sleep(1)
_click_position_img('conjunto_dados.png', '+', pixels_y=32, conf=0.9) - Clicka em algum ponto da tela se baseando em uma imagem, Ex: você quer clickar em algo que aparece do lado de uma imagem porem não sabe oque é ou muda constantemente, porém a imagem é fixa então eu coloquei para clickar 32 pixel acima da imagem.

Segue abaixo agora as funções

# Procura pela imagem img que atenda ao nível de correspondência conf
# Retorna uma tupla com os valores (x, y, altura, largura) caso ache a img
# Retorna None caso não ache a img
def find_img(img, pasta='imgs', conf=1):
    try:
        path = os.path.join(pasta, img)
        if conf != 1:
            return a.locateOnScreen(path, confidence=conf)
        else:
            return a.locateOnScreen(path)
    except:
        return False
_find_img = find_img
# Espera pela imagem 'img' que atenda ao nível de correspondência 'conf'
# Até que o 'timeout' seja excedido ou indefinidamente para 'timeout' negativo
# Retorna uma tupla com os valores (x, y, altura, largura) caso ache a img
# Retorna None caso não ache a imagem ou exceda o 'timeout'
def wait_img(img, pasta='imgs', conf=1.0, delay=1, timeout=20, debug=False):
    if debug:
        print('\tEsperando', img)

    aux = 0
    while True:
        box = find_img(img, pasta, conf=conf)
        if box:
            return box
        sleep(delay)

        if timeout < 0:
            continue
        if timeout == aux:
            break
        aux += 1

    return None
_wait_img = wait_img
# Procura e clica 'clicks' vezes com o botão 'button' na imagem 'img'
# que atenda ao nível de correspondência conf
# Retorna True caso ache a img
# Retorna False caso não ache a imagem ou exceda o 'timeout'
def click_img(img, pasta='imgs', conf=1.0, delay=1, timeout=20, button='left', clicks=1):
    img = os.path.join(pasta, img)
    try:
        for i in range(timeout):
            box = a.locateCenterOnScreen(img, confidence=conf)
            if box:
                a.click(a.locateCenterOnScreen(img, confidence=conf), button=button, clicks=clicks)
                return True
            sleep(delay)
        else:
            return False
    except:
        return False
_click_img = click_img
def click_position_img(img, operacao, pixels_x=0, pixels_y=0, pasta='imgs', conf=1.0, clicks=1):
    try:
        if img.endswith('.png'):
            img = os.path.join(pasta, img)
            a.moveTo(a.locateCenterOnScreen(img, confidence=conf))
            local_mouse = a.position()
        else:
            local_mouse = img

        if operacao == '+':
            a.click(int(local_mouse[0] + int(pixels_x)), int(local_mouse[1] + int(pixels_y)), clicks=clicks)
            return True
        if operacao == '-':
            a.click(int(local_mouse[0] - int(pixels_x)), int(local_mouse[1] - int(pixels_y)), clicks=clicks)
            return True
        if operacao == '+x-y':
            a.click(int(local_mouse[0] + int(pixels_x)), int(local_mouse[1] - int(pixels_y)), clicks=clicks)
            return True
        if operacao == '-x+y':
            a.click(int(local_mouse[0] - int(pixels_x)), int(local_mouse[1] + int(pixels_y)), clicks=clicks)
            return True
    except:
        return False
_click_position_img = click_position_img

 

  • Curtir 1
Link to comment
Compartilhe em outros sites

  • Casa do Desenvolvedor mudou o título para Como capturar e automatizar janelas de popup com PyAutoGUI no Python?
  • 4 weeks later...

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...