PC端自動化測試(三)

編輯類控件的基本操作

通過記事本來進行測試

import pywinauto

app = pywinauto.Application().start("notepad.exe")
# 選擇主窗口
dlg = app["無標題 - 記事本"]
dlg.print_control_identifiers()

輸入內容

選擇編輯框並輸入Hello World!

dlg["Edit"].type_keys("Hello World!")

替換

  1. 通過菜單選擇替換

  2. 選擇替換窗口app["替換"]

  3. 選擇查找編輯框並輸入World

  4. 選擇替換爲編輯框並輸入Python

  5. 點擊全部替換按鈕

dlg.menu_select("編輯->替換(R)")
app["替換"].print_control_identifiers()
app["替換"]["Edit1"].type_keys("World")
app["替換"]["Edit2"].type_keys("Python") 
app["替換"]["Button3"].click()

鍵盤操作

鍵盤操作模塊:pywinauto.keyboard

send_keys方法

  • 按F5:send_key("{VK_F5}")

  • 按F5:send_key("{F5}")

  • 按回車:send_key("{VK_RETURN}")

  • 按字母A:send_key('A')

常用按鍵

  • ESC:VK_ESCAPE

  • TAB:VK_TAB

  • Shift:VK_SHIFT

  • Ctrl:VK_CONTROL

  • Alt:VK_MENU

  • 空格:VK_SPACK

  • 退格:VK_BACK

  • 左win:VK_LWIN

  • 右win:VK_RWIN

鍵盤修飾符

  • +:按Shift

  • ^:按Ctrl

  • %:按Alt

例如^s相當於輸入ctrl+s

鼠標操作

鼠標操作模塊:pywinauto.mouse

  • click:點擊

  • double_click:雙擊

  • right_clik:右擊

  • wheel_click:中間點擊

  • press:按下

  • repleace:釋放

  • move:移動

  • scrool:滾動

from pywinauto import mouse

# 鼠標單擊(默認左鍵)
mouse.click(coords=(580,52))

# 鼠標右鍵
mouse.right_click(coords=(1000,500))

# 鼠標雙擊
mouse.double_click(button="left",coords=(155,50))

# 點擊鼠標中鍵
mouse.wheel_click(coords=(1000,500))

# 按下鼠標
mouse.press(coords=(72,31))
# 釋放鼠標    
mouse.release(coords=(1000,500))

# 滑動鼠標滾輪
mouse.scroll(coords=(1000, 500), wheel_dist=1)

# 移動鼠標位置
mouse.move(coords=(0, 0))

for i in range(0, 1000, 50):
    mouse.move(coords=(i, i))

# 部分無法直接點擊的控件:獲取控件中心點位置,雙擊點擊
rect = db_name.rectangle().mid_point()
mouse.double_click(coords=(rect.x, rect.y))

查看系統提示

在時鐘附近有表示正在運行的應用程序的圖標,也就是「系統托盤」,也被稱爲「通知區域」。

可以通過啓動Explorer.exe應用程序,在任務欄用戶提示通知區域找到工具欄控件

from pywinauto import Application

app = Application("uia").connect(path="explorer")
icons = app['任務欄']['用戶提示通知區域']

結合Selenium實現文件上傳

import pywinauto
from pywinauto.keyboard import send_keys
from selenium import webdriver

url= "https://www.layui.com/demo/upload.html"
browser = webdriver.Chrome()
browser.get(url=url)
browser.find_element_by_xpath("//button[@id='test1']").click()

# 使用pywinauto來選擇文件
app = pywinauto.Desktop()
# 選擇文件上傳的窗口
dlg = app["打開"]
dlg.print_control_identifiers()

# 選擇文件地址輸入框
dlg["Toolbar3"].click()
send_keys("C:\images")
send_keys("{VK_RETURN}")

# 選中文件名輸入框
dlg["文件名(&N):Edit"].type_keys("9.png")

# 點擊打開
dlg["打開(&O)"].click()

連接Navicat並操作

import pywinauto
from pywinauto import mouse
from pywinauto.keyboard import send_keys


class NavicatTest:

    def __init__(self, path=None, precess=None):
        # 初始化一個應用程序對象
        if path:
            self.app = pywinauto.Application(backend="uia").start(path)
        else:
            self.app = pywinauto.Application(backend="uia").connect(process=precess)
        # 選擇主窗口
        self.dlg = self.app["Navicat for MySQL"]

    def new_connect(self, title, host, port, user, password):
        """
            新建連接
        """
        # 選擇菜單欄
        menu = self.dlg["Menu"]
        # 點擊文件
        menu.child_window(title="文件", control_type="MenuItem").click_input()
        # 點擊新建連接
        menu.item_by_path("文件->新建連接...").click_input()
        # 選擇新建連接窗口
        new_dlg = self.app["新建連接"]
        # 連接名稱輸入框
        new_dlg["常規"].Edit5.type_keys(title)
        # ip輸入框
        new_dlg["常規"].Edit1.type_keys(host)
        # 端口輸入框
        new_dlg["常規"].Edit4.type_keys(port)
        # 用戶名輸入框
        new_dlg["常規"].Edit3.type_keys(user)
        # 密碼輸入框
        new_dlg["常規"].Edit2.type_keys(password)
        # 點擊確定按鈕
        new_dlg["確定"].click()

    def open_connect(self, title):
        """
        打開連接或者數據庫
        :param title: 連接名或者數據庫名
        :return:
        """
        # 獲取控制座標中心點,進行點擊,打開連接
        db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
        rect = db_name.rectangle().mid_point()
        print(rect.x, rect.y)
        mouse.double_click(coords=(rect.x, rect.y))

    def del_connect(self, title):
        """刪除連接"""
        # 獲取控件中心點位置
        db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
        rect = db_name.rectangle().mid_point()
        # 鼠標在控件中心點,右擊
        mouse.right_click(coords=(rect.x, rect.y))
        # 刪除連接
        self.app["上下文"]["MenuItem5"].click_input()
        # 選擇刪除窗口
        self.app["確認刪除"]["刪除"].click()

    def close_coonnect(self, title):
        """
        關閉連接或者數據庫
        :param title: 連接名或者數據庫名
        :return:
        """
        # 獲取控件中心點位置
        db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
        rect = db_name.rectangle().mid_point()
        # 鼠標在控件中心點,右擊
        mouse.right_click(coords=(rect.x, rect.y))
        # 刪除連接
        self.app["上下文"]["MenuItem2"].click_input()

    def del_database(self, database):
        db_name = self.dlg["TTreeView"].child_window(title=database, control_type="TreeItem")
        rect = db_name.rectangle().mid_point()
        mouse.right_click(coords=(rect.x, rect.y))
        self.app["上下文"]["MenuItem4"].click_input()
        # 選擇刪除窗口
        self.app["確認刪除"]["刪除"].click()

    def new_database(self, title, database, charset="utf8 -- UTF-8 Unicode"):
        """新建數據庫"""
        db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
        rect = db_name.rectangle().mid_point()
        mouse.right_click(coords=(rect.x, rect.y))

        dlg = self.app["上下文"]
        # 點擊新建連接
        dlg.MenuItem8.click_input()
        # 獲取新建連接的窗口
        # self.app["新建數據庫"].print_control_identifiers()
        # 數據數據庫名
        self.app["新建數據庫"]["常規"].Edit3.type_keys(database)
        self.app["新建數據庫"]["常規"].Edit2.type_keys(charset)
        # 鍵盤回車鍵,點擊確定
        send_keys("{VK_RETURN}")

    def new_find_dlg(self):
        """新建查詢窗口"""
        find = self.dlg["TTreeView"].child_window(title="查詢", control_type="TreeItem")
        # 獲取查詢的左邊
        rect = find.rectangle().mid_point()
        # 鼠標右擊
        mouse.right_click(coords=(rect.x, rect.y))
        # 選擇出現的小窗口
        dlg = self.app["上下文"]
        # 點擊新建連接
        dlg.MenuItem1.click_input()

    def find_sql(self, database, title, sql):
        """查詢sql"""
        title = "無標題 @{} ({}) - 查詢".format(database, title)
        find_dlg = self.app[title]
        find_dlg["TabControl"].print_control_identifiers()
        # 獲取編輯框
        edit = find_dlg["TabControl"].Pane4
        # 獲取編輯窗口控件位置
        rect = edit.rectangle().mid_point()
        mouse.click(coords=(rect.x, rect.y))
        sql = "^a{}".format(sql.replace(" ", "{VK_SPACE}")) + ";"
        send_keys(sql)
        # 使用運行快捷鍵
        send_keys("^r")


if __name__ == '__main__':
    nav = NavicatTest(precess=1320)

    # 新建連接
    nav.new_connect(title="python666", host="localhost", port=3306, user="root", password="mysql")

    # 打開連接
    nav.open_connect("win")

    # 關閉連接
    nav.close_coonnect("test")

    # 打開數據庫
    nav.open_connect("test")

    # 新建查詢窗口
    nav.new_find_dlg()

    # 查詢數據
    sql = "SELECT * FROM students"
    nav.find_sql("test", "win", sql)

    # # 刪除連接
    nav.del_connect("localhost_3306")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章