Windows GUI自动化 Pywinauto(五) 处理弹窗、错误处理与多窗口切换

liftword1个月前 (03-26)技术文章6

引言

如何在自动化桌面应用程序时处理弹窗、进行错误处理和切换多个窗口。

1. 处理弹窗(对话框)

弹窗通常会在应用程序执行某些操作时弹出,要求用户做出某种选择或输入数据。在自动化过程中,处理弹窗是非常重要的一部分。

1.1 查找弹窗

我们可以通过 窗口标题窗口类名 来查找弹窗。例如,当我们启动一个应用程序时,它可能会弹出一个“确认”或“警告”对话框。我们可以用类似的方式定位到这个弹窗。

from pywinauto import Application

# 启动记事本并弹出保存提示
app = Application().start("notepad.exe")
notepad_window = app.window(title="Untitled - Notepad")

# 在记事本中输入内容
notepad_window.Edit.type_keys("This is an automated note", with_spaces=True)

# 模拟点击"关闭"按钮,此时会弹出保存提示
notepad_window.close()

# 处理弹窗
save_as_window = app.window(title="Notepad", control_type="Window")
save_as_window.wait('visible')

# 点击弹窗中的“否”按钮
save_as_window.child_window(title="Don't Save", control_type="Button").click_input()

1.2 弹窗控件

弹窗中通常有多个控件,如按钮、文本框、标签等。你可以通过 child_window() 方法进一步定位到具体的控件,如“是”、“否”按钮。

# 查找并点击“是”按钮
save_as_window.child_window(title="Yes", control_type="Button").click_input()

1.3 等待弹窗消失

我们有时需要在弹窗显示后等待其消失,以便执行后续操作。wait('visible') 和 wait_not('visible') 方法可以用来等待弹窗的出现或消失。

# 等待弹窗出现
save_as_window.wait('visible')

# 等待弹窗消失
save_as_window.wait_not('visible')

2. 错误处理

错误处理是非常重要的一环。我们需要预见到各种可能的错误并做出相应的处理,以确保脚本的健壮性。

2.1 使用异常处理

Python 提供了 try、except 和 finally 语句来捕获和处理错误。通过这些语句,可以捕获潜在的异常并采取相应的措施。

from pywinauto import Application
from pywinauto.keyboard import send_keys

try:
    app = Application().start("notepad.exe")
    notepad_window = app.window(title="Untitled - Notepad")
    notepad_window.wait('visible')

    # 输入内容
    notepad_window.Edit.type_keys("Automated content.")

    # 模拟一个不合法的操作
    notepad_window.MenuSelect("File->NonExistentOption")
    
except Exception as e:
    print(f"An error occurred: {e}")

finally:
    print("Cleaning up resources.")

2.2 捕获特定的异常

可以根据不同的错误类型采取不同的措施。例如,当窗口没有响应时,可以捕获 ElementNotFoundError,并执行重试操作。

from pywinauto import ElementNotFoundError

try:
    # 尝试查找一个不存在的控件
    nonexistent_window = app.window(title="Nonexistent Window")
except ElementNotFoundError:
    print("The specified window was not found. Retrying...")
    # 进行重试操作
    app = Application().start("notepad.exe")

2.3 重新尝试操作

对于可能出现临时性错误的操作,可以通过捕获异常并重新执行操作来实现 重试机制

import time

for i in range(3):  # 重试三次
    try:
        app = Application().start("notepad.exe")
        notepad_window = app.window(title="Untitled - Notepad")
        notepad_window.wait('visible')
        break  # 成功则跳出循环
    except Exception as e:
        print(f"Attempt {i + 1} failed: {e}")
        time.sleep(2)  # 等待 2 秒后重试

3. 多窗口切换

需要自动化多个窗口或多个应用程序时,多窗口切换 是一个常见的任务。在 Pywinauto 中,可以通过 window() 和 child_window() 方法来获取和切换窗口。

3.1 查找并切换窗口

如果程序打开了多个窗口,可以使用 window() 方法来查找窗口,然后切换到所需的窗口。

# 启动多个应用程序窗口
app = Application().start("notepad.exe")
app2 = Application().start("mspmsn.exe")  # 假设启动了一个 MSN 应用

# 获取记事本和 MSN 窗口
notepad_window = app.window(title="Untitled - Notepad")
msn_window = app2.window(title="MSN Messenger")

# 切换回记事本
notepad_window.set_focus()

3.2 切换到已打开的对话框

当多个窗口或对话框同时打开时,可以根据窗口的标题或类名来切换到特定的窗口。

# 切换到打开的“另存为”对话框窗口
save_as_window = app.window(title="Save As")
save_as_window.set_focus()

# 切换回记事本窗口
notepad_window.set_focus()

3.3 获取所有打开的窗口

获取应用程序中所有已打开的窗口,进而选择进行切换。

# 获取所有窗口的句柄
windows = app.windows()

# 遍历窗口列表
for window in windows:
    print(f"Window Title: {window.window_text()}")

结语:

上述代码学习了 处理弹窗错误处理多窗口切换 的技巧。具体包括:

  • 如何查找并操作弹窗中的控件。
  • 使用异常处理来捕获和应对自动化过程中的错误。
  • 多窗口切换的方法,支持多个应用程序窗口的操作。



相关文章

.htaccess设置301跳转及常用技巧整理

在虚拟主机环境中,基本上都是Apache环境。Apache的伪静态的设置,都是在网站根目录设置.htaccess文件,在.htaccess文件中无论是伪静态,还是301跳转,甚至是防盗链和禁止某个IP...

干货|Python大佬手把手带你破解哔哩哔哩网滑动验证(上篇)

/1 前言/ 有爬虫经验的各位小伙伴都知道,正常我们需要登录才能获取信息的网站,是比较难爬的。原因就是在于,现在各大网站为了反爬,与爬虫机制斗智斗勇,一般的都加入了图片验证码、滑动验证码之类的干扰,让...

Python合集之Python跳转语句(一)

在上一节的合集中,我们了解了Python循环嵌套语句的相关知识,本节我们将进一步了解一下Python跳转语句中的break的相关知识。 当循环条件一直满足时,程序会一直执行下去,如果希望在中间离开循环...

python笔记八:跳转语句continue

跳转语句:break continue'''cbreak 跳出循环。continue语句:不满足条件跳过(跳回循环体)'''#例:求1---100以内不是5的倍数的和# sum_namber=0# f...

「好课堂在线」pygame事件处理游戏界面进行全屏切换

作者:好课堂数学编程陈老师 我们在第一个程序里使用了如下的语句screen = pygame.display.set_mode((800, 800), 0, 32)也讲述了各个参数的意思,当我们把第二...