python进行windows系统UI自动化之【pyautoit】

news2024/9/21 22:37:22

python进行windows系统UI自动化之【pyautoit】

    • 一、AutoIT中文手册
      • 1.1、安装AutoIt
      • 1.2、使用Auto Window Info
    • 二、python引用
      • 2.1、安装
      • 2.2、引用
      • 2.3、使用
        • 2.3.1、窗口操作
        • 2.3.2、控件操作
        • 2.3.3、进程操作
        • 2.3.4、鼠标操作
        • 2.3.5、键盘操作
          • 2.3.5.1、Send 是非常有用的一个函数/命令,因为我们可用它来对窗口进行操作而无需使用鼠标。
            • 2.3.5.1.1、例如,先打开 文件夹选项窗口(位于控制面板),然后请尝试执行下面这些语句:
            • 2.3.5.1.2、组合 Alt 键使用可访问菜单项,请打开记事本窗口然后尝试执行下面这些语句:
            • 2.3.5.1.3、如果您对快捷键(Alt+F4、PrintScreen、Ctrl+C等等)的重要性还不太了解,请查看 Windows 的帮助信息(按下热键 Win+F1即可)以获得关于快捷键的完整列表。
    • 三、易报错点
      • 3.1 等待页面激活
      • 3.2点击
      • 3.1 打开文件
      • 四、项目所需,所封装的接口demo
    • 五、WEB UI自动化将AutoIT与Selenium结合
    • 六、 Windows PC自动化将AutoIT与Airtest结合

其实,用python进行windows端UI自动化的库有很多,比如pywinauto等,本文介绍一个使用autoit3来实现的 pyautoit 库。

pyautoit 是一个用python写的基于AutoItX3.dll的接口库,用来进行windows窗口的一系列操作,也支持鼠标键盘的操作。

AutoIt现在最新版是V3版本,这是一个类似BASIC脚本语言的免费软件,用于Windows GUI中进行自动化操作。利用模拟键盘按键,鼠标移动,窗口和控件的组合来实现自动化任务,而这是其他语言不可能做到和无可靠方法实现的(例如VBScript和SendKeds)

一、AutoIT中文手册

https://www.autoitx.com/doc/

1.1、安装AutoIt

链接: AutoIt Downloads - AutoIt
下载下图的安装包
在这里插入图片描述
解压后运行后第一个界面直接NEXT

在这里插入图片描述

1.2、使用Auto Window Info

控件control定位
打开Auto Window Info(x64)或Auto Window Info(x86)
在这里插入图片描述
类似于浏览器的F12,使用Finder Tool获取窗口的title等信息
在这里插入图片描述

点击上访的图标,进行拖拉,到想访问的位置,注意下图两个红框中的数值,上面的框表示页面的标题和类,下面的框表示控件的类和序号(一般连起来使用)
在这里插入图片描述

二、python引用

2.1、安装

pip install pyautoit

https://pypi.org/project/PyAutoIt/

2.2、引用

import autoit    # 注意:引用的模块名跟安装的模块名是不一样的

2.3、使用

 启动程序
autoit.run("notepad.exe")
run(filename[,work_dir[,show_flag]]): 运行指定程序
filename参数:设置运行的程序的路径和名称
work_dir参数:设置工作路径。默认为windows系统文件夹(C:\Windows)
show_flag参数:设置窗口显示的方式。默认为Properties.SW_SHOWNORMAL(窗口正常显示) 可选值:
○ Properties.SW_HIDE: 表示隐藏窗口
○ Properties.SW_MAXIMIZE: 表示最大化窗口
○ Properties.SW_MINIMIZE: 表示最小化窗口

run_wait(filename[,work_dir[,show_flag]]): 运行指定程序并暂停脚本执行,直到程序结束

2.3.1、窗口操作

autoit.win_wait_active(title="无标题- 记事本", timeout=10)  # 等待窗口激活
autoit.win_exists("aaa")   # 判断窗口是否存在
autoit.win_get_handle("无标题- 记事本")  # 获取窗口句柄
autoit.win_activate("bbb")  # 激活窗口
autoit.win_close("[CLASS:Notepad]")  # 关闭窗口
此处,窗口标题的匹配模式也是可以自定义的,默认是1 -- 匹配开始部分,可以在脚本前面加上以下改为2--匹配子字符串:
autoit.opt("WinTitleMatchMode", 2)
autoit.win_active(title): 检查指定标题的窗口是否为激活状态返回值: ○  1表示窗口已激活 ○  0表示窗口未激活
autoit.win_close(title): 关闭指定标题的窗口
autoit.win_exists(title): 检查指定标题的窗口是否存在返回值:○ 1表示窗口已存在○ 0表示窗口未存在
autoit.win_get_pos(title): 获取指定标题的窗口的位置和尺寸(left, top, right, bottom) 返回值:[x, y, width, height]
autoit.win_get_process 获取指定窗口关联的进程ID(PID/-1)
autoit.win_get_text 获取指定窗口中的文本(文本/0)
autoit.win_kill(title): 强制关闭指定标题的窗口
autoit.win_move 移动指定的窗口或调整窗口的大小(PID/0) 参数(x, y, width, height)
autoit.win_set_state 显示,隐藏,最小化,最大化或还原一个窗口 参数(flag 1= 显示2 = 最小化/隐藏3 = 最大化4 = 还原)
autoit.win_waitwin_wait(title[, timeout]):  暂停脚本的执行直至指定窗口存在(出现)为止(1/0) 参数(timeout 单位为秒)在指定时间内等待指定标题的窗口打开  time_out参数:设置超时时间,单位为秒(s)。默认为0,表示一直等待
autoit.win_wait_active 暂停脚本的执行直至指定窗口被激活(成为活动状态)为止 参数(timeout 单位为秒)
autoit.win_wait_close(title[,timeout]): 暂停脚本的执行直至所指定窗口不再存在为止 参数(timeout 单位为秒)
autoit.win_wait_active(title[, timeout]):暂停脚本的执行直至指定窗口不是激活状态为止 参数(timeout 单位为秒)在指定时间内等待指定标题的窗口激活time_out参数与win_wait_active函数的timeout参数相同
autoit.control_click 向指定控件发送鼠标点击命令 参数(timeout control 控件)

2.3.2、控件操作

autoit.control_set_text("无标题", "Edit1", "12312313123")    # 输入文字
autoit. control_click(title, control[,button[, clicks[, x[, y]]]]): 对控件进行点击
	button参数:设置点击方式。默认为“left”,还可以设置为"right" or "middle" 
	clicks参数:设置点击次数。默认为1次
	x:   设置点击的水平位置。默认为center(中心)
	y:   设置点击的垂直位置。默认为center(中心)
autoit.control_get_text(title="title", control="controlid")   # 获取控件文本
autoit.control_command(title="title", control="controlid", command="command")
autoit.control_list_view(title="title", control="controlid", command="command")
autoit.control_tree_view(title="title", control="controlid", command="command")

2.3.3、进程操作

autoit.process.process_wait(process="process", timeout=10)
autoit.process.process_close("process")
autoit.process.process_exists("process")

2.3.4、鼠标操作

autoit.mouse_click(button='left', x=100, y=200, clicks=1, speed=-1)
	mouse_click([button[, x, y[, clicks[, speed]]]]): 点击鼠标
	button参数:设置点击方式。
	默认为“left”, 还可以设置为"right", "middle", "main", "menu", "primary", "secondary"
	x,y参数:鼠标移动的位置。不传参表示在鼠标当前位置点击
	clicks: 设置鼠标点击次数
	speed: 设置鼠标移动的速度。默认-1,速度范围为[1, 100]1最快,100最慢
autoit.mouse_move(x=200, y=300, speed=-1)
	mouse_move(x, y[, speed])
autoit.mouse_wheel(direction="down")

2.3.5、键盘操作

autoit.send("12312412")
autoit.send("+{F10}")  # 发送shift+F10(右键效果)
autoit.send("^a")   # 发送ctrl+a

win切换窗口(键盘按下alt,操作tab键)
操作步骤如下:
AutoITLibrary.send    {ALT DOWN}
AutoITLibrary.send    {tab}
AutoITLibrary.send    {tab}
AutoItLibrary.Send    {ALT UP}

其它键盘操作,请参考:
键盘输入
    [Arguments]    ${keys}  ${flag}=0
    [Documentation]  模拟键盘输入,需要两个参数:
    ...  第一个参数: 需要输入的键盘按键
    ...  第二个参数: 标记变量,可选值,默认为0,
    ...               0:  代表第一个参数${keys}中的!+^#代表特殊按键
    ...               1:  代表第一个参数${keys}中的所有字符都是普通字符串
    ...  举例:
    ...  ^a^c^v!{F4}      代表:Ctrl+a Ctrl+c Ctrl+v Alt+F4
    ...  关于特殊按键的说明:
    ...      如果${flag}为0,则:
    ...     !  代表ALT按键
    ...     +  代表SHIFT按键
    ...     ^  代表CTRL按键
    ...     #  代表WIN按键
    ...  比如:!+a  代表:ALT+SHIFT+a
    ...  其他特殊按键:
    ...  ${flags}为0的时候,还支持下述特殊按键:
    ...     输入  最终的键盘按键
    ...     {!}                     !
    ...     {#}                     #
    ...     {+}                     +
    ...     {^}                     ^
    ...     {{}                     {
    ...     {}}                     }
    ...     {SPACE}                 SPACE
    ...     {ENTER}                 ENTER key on the main keyboard
    ...     {ALT}                   ALT
    ...     {BACKSPACE} or {BS}     BACKSPACE
    ...     {DELETE} or {DEL}       DELETE
    ...     {UP}                    Cursor up
    ...     {DOWN}                  Cursor down
    ...     {LEFT}                  Cursor left
    ...     {RIGHT}                 Cursor right
    ...     {HOME}                  HOME
    ...     {END}                   END
    ...     {ESCAPE} or {ESC}       ESCAPE
    ...     {INSERT} or {INS}       INS
    ...     {PGUP}                  PageUp
    ...     {PGDN}                  PageDown
    ...     {F1} - {F12}            Function keys
    ...     {TAB}                   TAB
    ...     {PRINTSCREEN}           Print Screen key
    ...     {LWIN}                  Left Windows key
    ...     {RWIN}                  Right Windows key
    ...     {NUMLOCK on}            NUMLOCK (on/off/toggle)
    ...     {CAPSLOCK off}          CAPSLOCK (on/off/toggle)
    ...     {SCROLLLOCK toggle}     SCROLLLOCK (on/off/toggle)
    ...     {BREAK}                 for Ctrl+Break processing
    ...     {PAUSE}                  PAUSE
    ...     {NUMPAD0} - {NUMPAD9}    Numpad digits
    ...     {NUMPADMULT}             Numpad Multiply
    ...     {NUMPADADD}              Numpad Add
    ...     {NUMPADSUB}              Numpad Subtract
    ...     {NUMPADDIV}              Numpad Divide
    ...     {NUMPADDOT}              Numpad period
    ...     {NUMPADENTER}            Enter key on the numpad
    ...     {APPSKEY}                Windows App key
    ...     {LALT}                   Left ALT key
    ...     {RALT}                   Right ALT key
    ...     {LCTRL}                  Left CTRL key
    ...     {RCTRL}                  Right CTRL key
    ...     {LSHIFT}                 Left Shift key
    ...     {RSHIFT}                 Right Shift key
    ...     {ALTDOWN}                Holds the ALT key down until {ALTUP} is sent
    ...     {SHIFTDOWN}              Holds the SHIFT key down until {SHIFTUP} is sent
    ...     {CTRLDOWN}               Holds the CTRL key down until {CTRLUP} is sent
    ...     {LWINDOWN}               Holds the left Windows key down until {LWINUP} is sent
    ...     {RWINDOWN}               Holds the right Windows key down until {RWINUP} is sent
    ...     {ASC nnnn}               Send the ALT+nnnn key combination
    AutoItLibrary.Send  ${keys}  ${flag}

键盘输入Alt+F4
    AutoItLibrary.Send  !{F4}

键盘输入Ctrl+Space
    AutoItLibrary.Send  ^{SPACE}

键盘输入Ctrl+a
    AutoItLibrary.Send  ^a

键盘输入Ctrl+c
    AutoItLibrary.Send  ^c

键盘输入Ctrl+v
    AutoItLibrary.Send  ^v

键盘输入Ctrl+s
    AutoItLibrary.Send  ^s

键盘输入Ctrl+p
    AutoItLibrary.Send  ^p

键盘输入Ctrl+Home
    AutoItLibrary.Send  ^{HOME}

键盘输入Ctrl+End
    AutoItLibrary.Send  ^{END}

键盘输入Win+d
    键盘输入  {LWINDOWN}d{LWINUP}

键盘输入Win+r
    键盘输入  {LWINDOWN}r{LWINUP}

AutoIt 可发送所有的 ASCII 码及扩展 ASCII 码字符(0-255),若要发送 UNICODE 编码的字符则必须使用“ASC”选项加上您要发送的字符代码(见下面的 {ASC})。

Send("#r");开始运行
Send("^!+{F6}") ;发送CTRL+ALT+F6组合键

如果要发送 ASCII 字符 A 则参考下例(相当于 ALT+065,按住ALT键并在数字键盘上顺序按下065)

Send("{ASC 065}")

(在使用两位数的 ASCII 码时必须在前面加一个 0,否则将使用 437号代码页)

如果要发送 UNICODE 字符则输入该字符代码,例如下例将发送一个中文字符

Send("{ASC 2709}")

可参考下例重复发送某按键:

Send("{DEL 4}") ;连续4次按下 DEL 键
Send("{S 30}") ;发送30个字符“S”
Send("+{TAB 4}) ;连续4次按下 SHIFT+TAB

如果要按住(保持按下状态)某个按键(通常用于游戏中)

Send("{a down}") ;按住按键 A
Send("{a up}") ;松开按键 A

如果要用变量来指定重复发送的次数,参考下例:

$n = 4
Send("+{TAB " & $n & "}")

如果要用变量来指定要重复发送的 ASCII 字符(比如 A),参考下例:

$x = Chr(65)
Send("{" & $x & " 4}")

大多数笔记本电脑的键盘上都会有一个特殊的 Fn 键,此键无法被模拟。

注意,若把标志参数的值设为1则“按键”参数将被原样发送。如果某些文本是从变量里拷贝而来,而您又希望完全按原样发送这些文本的话,就应该使用这一设置。
2.3.5.1、Send 是非常有用的一个函数/命令,因为我们可用它来对窗口进行操作而无需使用鼠标。
2.3.5.1.1、例如,先打开 文件夹选项窗口(位于控制面板),然后请尝试执行下面这些语句:
Send("{TAB}")	切换到(焦点切换)下一个控件(按钮、复选框等)
Send("+{TAB}")	切换到上一个控件
Send("^{TAB}")	切换到下一个窗口标签
Send("^+{TAB}")	切换到上一个窗口标签
Send("{SPACE}")	可用来切换复选框的选中状态或点击某个按钮
Send("{+}")	通常用来选中某个复选框(如果它“确实是”复选框的话)
Send("{-}")	通常用来取消选中某个复选框
Send("{NumPadMult}")	完全展开 SysTreeView32 控件内显示的文件夹
2.3.5.1.2、组合 Alt 键使用可访问菜单项,请打开记事本窗口然后尝试执行下面这些语句:
Send("!f")	发送 Alt+f,这是打开记事本的文件菜单的快捷键,您还可以试试其它的!
Send("{DOWN}")	移动焦点到下一个菜单项
Send("{UP}")	移动焦点到上一个菜单项
Send("{LEFT}")	切换到左边的菜单或收缩子菜单
Send("{RIGHT}")	切换到右边的菜单或展开子菜单
2.3.5.1.3、如果您对快捷键(Alt+F4、PrintScreen、Ctrl+C等等)的重要性还不太了解,请查看 Windows 的帮助信息(按下热键 Win+F1即可)以获得关于快捷键的完整列表。
Send 命令(无标志参数)	键击结果
{!}	!
{#}	#
{+}	+
{^}	^
{{}	{
{}}	}
{SPACE}	空格
{ENTER}	主键盘区的 回车键
{ALT}	ALT
{BACKSPACE} 或 {BS}	退格
{DELETE} 或 {DEL}	删除(DELETE)
{UP}	向上箭头
{DOWN}	向下箭头
{LEFT}	向左箭头
{RIGHT}	向右箭头
{HOME}	HOME
{END}	END
{ESCAPE} 或 {ESC}	ESC键
{INSERT} 或 {INS}	INS(Insert)
{PGUP}	PGUP(PageUp)
{PGDN}	PGDN(PageDown)
{F1} - {F12}	功能键
{TAB}	TAB
{PRINTSCREEN}	PRINTSCREEN
{LWIN}	左徽标键
{RWIN}	右徽标键
{NUMLOCK}	NUMLOCK
{CTRLBREAK}	Ctrl+Break
{PAUSE}	PAUSE
{CAPSLOCK}	CAPSLOCK
{NUMPAD0} - {NUMPAD9}	数字键盘上的 数字键
{NUMPADMULT}	数字键盘上的 乘号
{NUMPADADD}	数字键盘上的 加号
{NUMPADSUB}	数字键盘上的 减号
{NUMPADDIV}	数字键盘上的 除号
{NUMPADDOT}	数字键盘上的 点号
{NUMPADENTER}	数字键盘上的 回车键
{APPSKEY}	Windows 应用程序键
{LALT}	左 ALT 键
{RALT}	右 ALT 键
{LCTRL}	左 CTRL 键
{RCTRL}	右 CTRL 键
{LSHIFT}	左 Shift 键
{RSHIFT}	右 Shift 键
{SLEEP}	系统休眠(SLEEP)键
{ALTDOWN}	按住 ALT 键直到发送 {ALTUP} 为止
{SHIFTDOWN}	按住 SHIFT 键直到发送 {SHIFTUP} 为止
{CTRLDOWN}	按住 CTRL 键直到发送 {CTRLUP} 为止
{LWINDOWN}	按住左徽标键直到发送 {LWINUP} 为止
{RWINDOWN}	按住右徽标键直到发送 {RWINUP} 为止
{ASC nnnn}	发送 ALT+nnnn 组合键
 	 
{BROWSER_BACK}	仅支持2000/XP:按下浏览器中的“后退”按钮
{BROWSER_FORWARD}	仅支持2000/XP:按下浏览器中的“前进”按钮
{BROWSER_REFRESH}	仅支持2000/XP:按下浏览器中的“刷新”按钮
{BROWSER_STOP}	仅支持2000/XP:按下浏览器中的“停止”按钮
{BROWSER_SEARCH}	仅支持2000/XP:按下浏览器中的“搜索”按钮
{BROWSER_FAVORITES}	仅支持2000/XP:按下浏览器中的“收藏夹”按钮
{BROWSER_HOME}	仅支持2000/XP:运行浏览器并转到主页
{VOLUME_MUTE}	仅支持2000/XP:切换系统静音状态
{VOLUME_DOWN}	仅支持2000/XP:减小系统音量
{VOLUME_UP}	仅支持2000/XP:增大系统音量
{MEDIA_NEXT}	仅支持2000/XP:在播放器中选择播放下一个轨道(影音媒体)
{MEDIA_PREV}	仅支持2000/XP:在播放器中选择播放上一个轨道
{MEDIA_STOP}	仅支持2000/XP:使播放器停止播放
{MEDIA_PLAY_PAUSE}	仅支持2000/XP:使播放器播放/暂停
{LAUNCH_MAIL}	仅支持2000/XP:运行邮件客户端程序
{LAUNCH_MEDIA}	仅支持2000/XP:运行播放器(Media player)
{LAUNCH_APP1}	仅支持2000/XP:运行用户程序1(我的电脑)
{LAUNCH_APP2}	仅支持2000/XP:运行用户程序2(计算器)

三、易报错点

3.1 等待页面激活

autoit.win_wait_active("[CLASS:Notepad]", 3)#等待3秒
#常用于切换页面后,最好加上,不然容易报错window/control cannot find

3.2点击

#用标题或者类名表示当前页面,一般两个方法通用
#如果报错window/control cannot find,可以尝试换一种方法表示
autoit.control_click("[CLASS:Notepad]", "Button2")
autoit.control_click("*无标题 - 记事本", "Button2")

3.1 打开文件

一般以我们平时操作,会从下图上方的地址栏进行操作,这里注意可以直接从下方的文件名处,输入对应的绝对地址,如:F:\程序设计书籍\《啊哈!算法》.pdf
在这里插入图片描述

autoit.control_set_text("Open File", "Edit1",file_path)  # 输入文件地址

四、项目所需,所封装的接口demo

import autoit


class MyPyAutoIt(object):
    @staticmethod
    def open_exe(title, exe_path, timeout=30):
        '''
        打开软件并等待加载完成,窗口最大化
        :return:
        '''
        try:
            autoit.run(exe_path)
            autoit.win_wait_active(title, timeout)
            autoit.win_set_state(title, flag=autoit.autoit.Properties.SW_MAXIMIZE)
        except Exception as e:
            print(e)
            print('软件打开失败')
            exit(1)

    @staticmethod
    def send_keys(title, control, text):
        '''
        指定输入框输入文本
        :param title: 主窗口标题
        :param control:  对应的控件的ClassnameNN
        :param text: 要输入的文本
        :return:
        '''
        autoit.control_click(title, control)
        time.sleep(0.1)

        # 复制
        pyperclip.copy(text)
        # ctrl + v
        autoit.send('{CTRLDOWN}')
        autoit.send('{v down}')
        autoit.send('{v up}')
        autoit.send('{CTRLUP}')

    @staticmethod
    def control_click(title, control):
        '''
        点击该打开软件的某个控件
        :param title: 主窗口标题
        :param control: 对应的控件的ClassnameNN
        :return: 返回点击控件后的界面的text control对
        '''
        autoit.control_click(title, control)
        if title == 'xxxxxx':
            time.sleep(2)

        return MyPyAutoIt.get_dic(title)

    @staticmethod
    def control_click_no_wait(title, control):
        '''
        点击该打开软件的某个控件
        :param title: 主窗口标题
        :param control: 对应的控件的ClassnameNN
        :return: 返回点击控件后的界面的text control对
        '''
        autoit.control_click(title, control)

    @staticmethod
    def close_notice_window(title='提示', control=None, timeout=10):
        '''
        点击该打开软件的提示窗口的某个控件
        :param title: 提示窗口标题
        :param control: 对应的控件的ClassnameNN
        :param timeout: 超时时间
        :return:
        '''
        def close_inform():
            autoit.send('{TAB}')
            autoit.send('{TAB}')
            autoit.send('{SPACE}')
            autoit.send('{TAB}')
            autoit.send('{SPACE}')

            autoit.send('{TAB}')
            autoit.send('{TAB}')
            autoit.send('{SPACE}')
            autoit.send('{TAB}')
            autoit.send('{SPACE}')

            autoit.send('{SPACE}')
            autoit.send('{SPACE}')

        try:
            if title == '提示':
                autoit.win_wait_active(title, timeout)
                autoit.control_click(title, control)
            elif title == '告知书':
                autoit.win_wait(title, timeout)
                autoit.mouse_click(x=800, y=400)  # 点击告知书提示框使其被选中
                close_inform()

                autoit.send('{SPACE}')
                autoit.send('{SPACE}')

        except Exception as e:
            print('{}窗口关闭失败, msg : {}'.format(title, str(e)))

    @staticmethod
    def ca_login(title='FormAccountPassword', psw_input_control=None, login_control=None, timeout=10):
        '''
        增值税 一般纳税人
        进入该表时要用CA密码验证
        :param title:
        :param psw_input_control:
        :param login_control:
        :param timeout:
        :return:
        '''
        autoit.win_wait_active(title, timeout)

        MyPyAutoIt.send_keys(title, psw_input_control, 'xxxxxx')
        MyPyAutoIt.control_click(title, login_control)

    @staticmethod
    def get_username(title, username_list):
        '''
        获得账号名和对应的control组成的dict
        :param title:
        :param username_list: 账号(公司全称)构成的list
        :return:dict, key为公司全称, value为对应的control
        '''
        dic = {}

        for key, value in MyPyAutoIt.get_dic(title).items():
            if key in username_list:
                dic[key] = value

        return dic

    @staticmethod
    def get_dic(title):
        '''
        :param title:
        :param control :要获取的控件的Class
        :return: 由text和对应的control组成的字典, key:text, value:control
        '''
        static_control = 'WindowsForms10.STATIC.app.0.33c0d9d'
        button_control = 'WindowsForms10.BUTTON.app.0.33c0d9d'
        edit_control = 'WindowsForms10.EDIT.app.0.33c0d9d'

        def get_d(control_str, n=500):
            d = {}
            for s in (control_str + str(i) for i in range(1, n)):
                try:
                    key = autoit.control_get_text(title, s)
                    if key == '':
                        continue
                    elif key in d.keys():
                        if isinstance(d[key], list):
                            d[key] = d[key].append(s)
                        else:
                            d[key] = [d[key], s]
                    else:
                        d[key] = s
                except autoit.autoit.AutoItError:
                    continue
            return d

        return dict(get_d(static_control), **get_d(button_control), **get_d(edit_control))

    @staticmethod
    def get_text_control(title):
        '''
        获取该界面中的text和其对应的control
        :param title: 窗口标题
        :return: 由text和对应的control组成的字典, key:text, value:control
        '''
        return MyPyAutoIt.get_dic(title)

    @staticmethod
    def switch_account(title, username, username_list):
        '''
        切换账号
        :param title: 主窗口标题
        :param username_list: 公司全称列表
        :param username: 要切换的公司全称
        :return:
        '''
        dic = MyPyAutoIt.get_username(title, username_list)
        return MyPyAutoIt.control_click(title, dic[username])

    @staticmethod
    def get_check_result(title, timeout=2):
        '''
        获取审核结果
        :param title:
        :param timeout:
        :return:返回审核结果
        '''
        autoit.win_wait_active(title, timeout)
        return autoit.win_get_text(title)

    @staticmethod
    def exit_table(title, control='WindowsForms10.BUTTON.app.0.33c0d9d1', timeout=5):
        '''
        返回上一级,返回税表的上一级(提示要保存表格数据时,默认不保存)
        :param title:
        :param control:
        :param timeout:
        :return:
        '''
        MyPyAutoIt.control_click(title, control)
        try:
            autoit.win_wait_active('提示', timeout)
            MyPyAutoIt.control_click('提示', 'Button2')
        except autoit.autoit.AutoItError:
            pass

    @staticmethod
    def get_text_by_control(title, control):
        '''
        根据给定的control 获取对应的text
        :param title:
        :param control:
        :return: ctrl对应的text
        '''
        return autoit.control_get_text(title, control)

@staticmethod
    def screen_capture(title, control, text=''):
        '''
        对相应的控件截图
        :param title:
        :param control:
        :param text:
        :return:
        '''
        left, top, right, bottom = autoit.control_get_pos(title, control, text)
        img = ImageGrab.grab((left, top, right, bottom))
        img.show()

五、WEB UI自动化将AutoIT与Selenium结合

# Writer:Taka
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
import os
from tools.Hightlightelement import heighLightElement
 
 
driver = webdriver.Chrome()
driver.get("https://sahitest.com/demo/php/fileUpload.htm")
sleep(2)
ele = driver.find_element_by_id('file')
heighLightElement(driver,ele)
ActionChains(driver).click(ele).perform()
sleep(2)
os.system(r'D:\PYFILE\PycharmProjects\UI_automation\tools\test.exe')
sleep(3)
driver.quit()

六、 Windows PC自动化将AutoIT与Airtest结合

''后续介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Segment Any Medical-Model (SAMM)在3D slicer上部署

参考: GitHub - bingogome/samm: A 3D Slicer integration to Metas SAM. https://www.cnblogs.com/odesey/p/17322413.html 一、下载代码仓库和权重文件 https://github.com/facebookresearch/segment-anything.git https://github.com/bingogome/samm.git htt…

举例说明Chatgpt模型训练的过程

Chatbot GPT模型训练过程详解 在人工智能领域,聊天机器人是一种模拟人类对话行为的计算机程序。近年来,随着深度学习和自然语言处理技术的飞速发展,聊天机器人越来越流行。本文将详细阐述GPT(Generative Pre-trained Transformer&…

软考A计划-系统集成项目管理工程师-项目整体管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

chatgpt赋能python:如何将Python改成中文

如何将Python改成中文 Python是一种广泛使用的编程语言,但默认情况下是英文界面。对于非英语母语国家的程序员来说,使用Python的过程中可能会遇到许多不方便之处,因此将Python改成中文是很有必要的。本文将介绍如何将Python改成中文&#xf…

Loadrunner进行http接口压力测试

使用Loadrunner进行http接口压力测试 业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回。 使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: 一.安装Loadrunner 本次测试过程…

excel数据的编排与整理——表格结构的整理(三)

excel数据的编排与整理——表格结构的整理(三) 1 提取不重复的数据 1.1 题目内容 1.2 在D2单元格输入公式并回车 1.3 填充数据到末尾 1.4 填充后的效果 1.5 点击筛选 1.6 筛选出D列为1的数据 1.7 筛选后的效果 1.8 把A列显示数据复制到C列(复制出来可能只显示第一个) 1.9 再次…

Angular实现一个简单的带tabs选项卡切换的首页导航功能

Angular版本:16.1.1 项目结构: angular.json配置: {"$schema": "./node_modules/angular/cli/lib/config/schema.json","version": 1,"newProjectRoot": "projects","projects"…

自定义双亲委派-JVM(三)

上篇文章说了java类加载源码,双亲委派的加载。 JVM类加载&双亲委派-JVM(二) 自定义类加载器 全盘负责委托机制 “全盘委托”指当一个classLoader装载一个类时,除非显示的使用另外一个classLoader加载,否则该类…

如何使用命令提示符重新启动Windows 资源管理器?

电脑资源管理器出现问题,导致电脑黑屏,如何使用命令提示符重新启动Windows 资源管理器呢?出现这个问题的时候,不要慌,按照下面的操作步骤,大概率是可以复原的,当然你觉得这样比较麻烦&#xff0…

C语言offsetof宏的使用与模拟实现

⭐️ 往期文章 ✨链接1:C语言文件打开关闭详解、文件顺序读写详解。 ✨链接2:C语言文件随机读写详解(fseek、ftell、rewind)。 ✨链接3:C语言scanf/fscanf/sscnaf和printf/fprintf/sprintf的区别。 ✨链接4:C语言打开文件一次既可…

论文不详细解读(二)——SimCLR系列

1. SimCLR v1 论文名称: A Simple Framework for Contrastive Learning of Visual Representations 开源地址:https://github.com/google-research/simclr 大佬论文解读:https://zhuanlan.zhihu.com/p/378953015 highlight:更多…

机器学习10:正则化-Regularization

目录 1.什么是正则化? 2.简化正则化:Lambda 3.两个练习 3.1 问题一 3.2 问题二 4.参考文献 1.什么是正则化? 考虑以下泛化曲线,它显示了训练集和验证集相对于训练迭代次数的损失。 图 1. 训练集和验证集的损失 图 1 显示了…

Docker数据卷与容器的挂载

什么是Docker数据卷: 数据卷(Volumes)是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。简单来说数据卷本质其实是…

面试之谈谈你对SpringMVC的理解:

1.把传统的MVC架构里面的Controller控制器进行了拆分。分成了前端控制器的DispatcherServlteth和后端控制器的Controoler. 2.吧Model模型拆分成了业务层Service和数据访问层Repository 3.在试图层,可以支持不同的试图,比图Freemakr,volocity,JSP等等。 所…

【多维Dij+DP】牛客小白月赛75 D

D-矩阵_牛客小白月赛75 (nowcoder.com) 题意: 思路: 首先,对于这种类似于多维BFS的东西,我们一定需要判断是否必要加上新的一维,即我们需要判断新的一维对决策有没有影响 在这道题中,如果把某一个位置取…

MySql脚本 asc 排序字段空值条目靠后的写法

场景: mysql中如果使用正序 asc 排序,那么默认是把排序字段值为空的条目数据,优先排到前面,这明显不符合需求,解决如下 一、重现问题 -- 按排序号-正序 select shop_id,sort_num,update_time from t_shop_trend_conte…

详解c++---哈希闭散列

目录标题 一道题了解哈希哈希的实现原理方法一方法二 准备工作insertfind函数erase函数检测代码 一道题了解哈希 点击此处来尝试做这道题 首先题目告诉我们这个字符串中只含有小写的英文字母而小写的英文字母只有26个,所以我们可以创建一个大小为26的字符数组用来记…

【python爬虫应用03】csdn个人所有文章质量分查询

🛠️ 环境准备 在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库: 操作系统:Windows编程语言:Python 3编辑器:VSCode(可选) 安装所需的库: reque…

2023年最新IDEA中 Java程序 | Java+Kotlin混合开发的程序如何打包成jar包和exe文件(gradle版本)

文章内容: 一. JAVA | JAVA和Kotlin混开开发的程序打包成jar方法 1.1 方法一 :IDEA中手动打包 1.2 方法二 :build.gradle中配置后编译时打包 二. JAVA | JAVA和Kotlin混合开发的程序打包成exe的方法 一. JAVA | JAVA和Kotlin混开开发的程序…

Javalin:一个轻量的 Web Framework

说起 Java 语言下的 Web 框架那就非 Spring Framework 不可了,但是今天在和别人在聊天的过程中发现了一个新奇的项目 Javalin。Javalin 是一个轻量的 Web 框架。支持 WebSocket, HTTP2 和异步请求。简单的看了一下官方的说明文档,确实非常轻量&#xff0…