pywinauto:Windows桌面应用自动化测试(四)

前言

上一篇文章地址:

pywinauto:Windows桌面应用自动化测试(三)_pc端桌面软件的自动化-CSDN博客

下一篇文章地址:

暂无

一、实战常用方法

1、应用启动或连接

使脚本与应用建立联系。

from pywinauto import Application

# 启动或连接应用,任选一个
app = Application(backend="【后端技术】").start("【程序路径】")  # 启动应用并连接
app = Application(backend="【可选win32、uia】").connect(title="【窗口名称】")  # 连接已启动的应用

窗口名称可以通过管理员身份打开inspect工具查看,为二级目录,如下展示:

2、窗口对象

我们要操作应用,实际就是要操作窗口,间接的操作应用,而不是直接操作应用,因此,连接好应用后,还要获取其窗口。

如上面的例子,我们获取窗口时需要这样操作:

from pywinauto import Application
ip_set_app = Application(backend='uia').connect(title='IP配置')  # 连接应用
ip_set_window = ip_set_app.window(title='IP配置')  # 获取应用窗口

应用窗口和子窗口连接是有区别的,以下面的元素为例:

在获取子窗口时,可以先获取上级窗口,再获取子窗口:

app = Application(backend='uia').connect(title='Form')  # 连接应用
dialog = self.app.window(title='Form')  # 获取窗口
dialog.child_window(title="Form")  # 获取子窗口

特别的,窗口里面的元素也可以使用child_window方法获取。

3、元素的获取方法

(1)通过name获取

如下,connect、window或child_window的可选参数title,他的值对应的就是name, 如果当前界面中name不重复,即可获取对应的元素。

app = Application(backend='uia').connect(title='Form')  # 连接应用
dialog = self.app.window(title='Form')  # 获取窗口
element = dialog.child_window(title="Form").child_window(title="取消")

(2)通过AutomationId获取

当元素没有name时,可以通过AutomationId进行获取,如图,操作方式为:

app = Application(backend='uia').connect(title='Form')
dialog = app.window(title='Form')
table = dialog.child_window(auto_id="MainForm.widget_client.viScanner.qt_tabwidget_stackedwidget.FormEquipmentlist.twDev")

 其中,child_window可选参数为auto_id,他的值为AutomationId,即可定为对应的元素。

(3)通过class_name获取元素

假设dialog是一个窗口对象,元素中有多个class_name为QComboBox,这种情况需要在class_name='QComboBox' 基础上增加 found_index=1 的参数,表明找第二个元素。

dialog.child_window(class_name='QComboBox', found_index=1)

 特别的,一个元素的定位可以使用多个元素获取方法更为精确的定位。

4、元素的操作

 (1)点击元素或移动鼠标到该元素上

当找到元素需要点击时,可以采用click_input方法。

app = Application(backend='uia').connect(title='Form')  # 连接应用
dialog = self.app.window(title='Form')  # 获取窗口
element = dialog.child_window(title="Form").child_window(title="取消")
element.click_input()

当找到一个元素,想要在该元素的中心位置进行点击或者他不是可点击对象又想去点击的时候,可以这样操作:

from pywinauto.mouse import click

def _element_num_of_copies(element, fraction):
        print(element.rectangle(), type(element.rectangle()))
        rectangle = element.rectangle()
        L, T, R, B = rectangle.left, rectangle.top, rectangle.right, rectangle.bottom
        width = R - L
        height = B - T
        x = int(L + width * fraction)
        y_center = int(T + height / 2)
        return (x, y_center)

rectangle = _element_num_of_copies(element, fraction)
click(coords=rectangle)

这里设计了一个函数,传入一个元素,通过rectangle方法获取该图像的桌面坐标系,进而得到中心点(fraction设置为1/2),使用鼠标的点击方法 click ,即可实现点击。

同样的,只是想鼠标移动到某个元素上,可以这样操作:

from pywinauto.mouse import move

click(coords=rectangle)  # 假设rectangle是一个坐标,如 (100, 200)

(2)模拟滚动滑轮

from pywinauto.mouse import scroll

scroll(coords=coords, wheel_dist=wheel_dist)  # coords表示基于某个坐标滚动,wheel_dist表示滚动次数
5、表格对象与滚动条的组合操作

表格对象通常会因为数据量过大而需要与滚动条一起操作,上面我们已经知道滑轮滚动方式,那么现在我们学习一下表格的操作。

以下是一个示例类中的某个函数对象,实现的是基于表格中的某个唯一元素进行查询,查到该结果后,基于该结果往前往后获取表格中的其他元素。特别的,有时候表格中还会有控件,此时控件将显示为空文本,甚至有多个控件,但均为一个表格元素的各个部分。

    def _find_device_position(self, wheel_dist, dev_ip, n):
        '''通过设备IP查找设备在表格中的位置'''
        # n : -1 为 类型, -2为名称 , 0 为 dev_ip , 1 为 状态,以此类推
        element = None
        # 直接查找
        print(datetime.now())
        for i in range(3):
            # 获取表格控件中所有行和列的数据
            cells = self.table.children(control_type="DataItem")
            print(cells)
            target_ip = dev_ip
            for j, cell in enumerate(cells):
                if target_ip in cell.window_text():
                    # 找到目标IP地址所在的行,继续查找该行的连接按钮
                    print(f"Found target IP '{target_ip}' in cells[{j}]: {cell.window_text()}")
                    # 假设连接按钮是该行的最后一个 DataItem
                    element = cells[j + n]
                    break
            if element != None:
                break
            # 滚动滑动条继续查找
            if i == 0:
                print("第一次滚动!")
                self.scroll_coords(-wheel_dist)
            elif i == 1:
                print("第二次滚动!")
                self.scroll_coords(wheel_dist)
        print(datetime.now())
        return element

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值