【python】windows客户端的ui自动化框架搭建及使用(winappdriver)

这篇具有很好参考价值的文章主要介绍了【python】windows客户端的ui自动化框架搭建及使用(winappdriver)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0.环境准备

  1. 安装jdk(8以上版本)及其环境配置
  2. 安装python3.10.4及其对应的三方包
  3. 安装winappdriver,下载地址:https://github.com/microsoft/WinAppDriver/releases/tag/v1.2.1
  4. windows开启开发者模式,本地开启服务:https://jingyan.baidu.com/article/91f5db1bfc57df5d7e05e31d.html

1.思路

整体思路:
1、封装appdriver服务、客户端启动关闭
2、封装鼠标基础行为 bat
3、封装元素定位基础行为 baseFunc
4、conftest中调用appdriver服务、客户端启动关闭,将driver暴露
5、调用文章来源地址https://www.toymoban.com/news/detail-515550.html

2.初试用

# -*- encoding: utf-8 -*-"
"""
@File: driver_win.py
@Author: cyl
@Desc: 对winappdriver服务、app的开启关闭进行封装
"""
import os
import time
import psutil
import platform
from selenium import webdriver
from settings import op_dir

WinAppDriver: str = "WinAppDriver.exe"
MyAppEXE: str = "xxx.exe"


# noinspection PyMethodMayBeStatic
class WinModelDriver:
    def __init__(self, host='localhost', port=4723) -> None:
        self.open_app_driver()
        # 配置信息
        self.desired_caps: dict = {
            'platform_fame': platform.system(),   # 平台名: 'Linux', 'Windows' or 'Java'
            'deviceName': 'WindowsPC',            # 系统
            'app': op_dir,                        # 应用程序绝对路径
            'pageLoadStrategy': 'none',           # 加载策略
            'disable-popup-blocking': True,       # 禁用弹窗
        }
        self.host = host
        self.port = port
        self.driver = None

    def open_app_driver(self) -> None:
   		"""启用winappdriver服务"""
        result = os.system(r'start "" /d "C:\Program Files (x86)\Windows Application Driver\"  "WinAppDriver.exe"')
        if result == 1:
            raise "开启服务失败, 确保启动WinAppDriver服务的地址正确!"

    # noinspection HttpUrlsUsage
    def open_platform(self) -> webdriver:
        """打开"""
        try:
            self.driver = webdriver.Remote('http://{}:{}'.format(self.host, self.port), self.desired_caps)
        except Exception as e:
            raise AssertionError(e)
        # self.driver.implicitly_wait(3)
        # self.driver.maximize_window()
        # print("全部元素-> ", self.driver.page_source)
        return self.driver

    def close_platform(self) -> None:
        """关闭"""
        self.driver.close()
        self.driver.quit()

        # 关闭所有客户端进程
        time.sleep(1.5)
        for proc in psutil.process_iter():
            p_info = proc.as_dict(attrs=['pid', 'name'])
            if p_info.get("name") == MyAppEXE:
                _kill = 'taskkill -f -pid %s' % p_info.get("pid")
                os.popen(_kill)
# -*- encoding: utf-8 -*-"
"""
@File: driver_impl.py.py
@Author: cyl
@Desc: 定义公共的driver实例
"""


class DriverImpl:
    def __init__(self):
        self.driver = None
        self.module = ""


# 公共的driver类实例
driverImpl: DriverImpl = DriverImpl()
# -*- encoding: utf-8 -*-
"""
@File: base.py
@Author: cyl
@Desc: 鼠标事件pyautogui库的一些基础行为
"""
import pyautogui
from typing import Any
from pyautogui import Point


# noinspection PyMethodMayBeStatic,PyPep8Naming
class BaseAutoGui:
    """pyautogui基础封装"""

    def position(self) -> Point:
        return pyautogui.position()

    def size(self) -> tuple:
        """获取屏幕的分辨率(高度、宽度)"""
        wight, height = pyautogui.size()
        return wight, height

    def onScreen(self, x: Any, y: Any) -> bool:
        """判断坐标是否在屏幕上"""
        res: bool = pyautogui.onScreen(x, y)
        return res

    def keyboard_keys(self) -> list:
        """返回所有支持的按键名称"""
        return pyautogui.KEYBOARD_KEYS
    
	def click(
            self,
            x: int | float,
            y: int | float,
            duration: int | float = 0.2,
            _type: str = "single",
            **kwargs
    ):
        """点击
        Args:
            x (int | float): x轴坐标点
            y (int | float): y轴坐标点
            duration (int | float, optional): 周期
            _type (str, optional): single单击左键 right右键 double双击左键 three三击右键
        """
        match _type:
            case "single":
                pyautogui.click(x, y, duration=duration, **kwargs)
            case "right":
                pyautogui.click(button="right", **kwargs)
            case "double":
                pyautogui.click(clicks=2, **kwargs)
            case "three":
                pyautogui.click(button='right', clicks=2, interval=0.25, **kwargs)
            case _:
                pyautogui.click(x, y, duration=duration, **kwargs)
        return self

    def doubleClick(self, x: int | float, y: int | float, duration: int | float = 0.5, **kwargs):
        """双击"""
        pyautogui.doubleClick(x, y, duration=duration, **kwargs)
        return self

    def tripleClicks(self, x: int = 0, y: int = 0, **kwargs):
        """当前位置左击三下
        Args:
            x (int, optional): 指定位置x轴坐标点
            y (int, optional): 指定位置y轴坐标点
        """
        pyautogui.tripleClick(x=x, y=y, **kwargs)
        return self

    def press(self, keys: str):
        """按键
        Args:
            keys (str): 键名, eg: enter, esc, space
        """
        if keys in self.keyboard_keys():
            pyautogui.press(keys)
        else:
            raise "当前按键不在指定键程内!"
        return self

3.结合pytest

# -*- encoding: utf-8 -*-
"""
@File: conftest.py
@Author: cyl
@Desc: ...
"""
import pytest
from common.driver_impl import driverImpl
from common.driver_win import WinModelDriver, webdriver

@pytest.fixture(scope="function", autouse=True)
def driver():
	wl: WinModelDriver = WinModelDriver()
	test_driver: webdriver = wl.open_platform()
	driverImpl.driver = test_driver
	logger.info("app启动~~~!")
	yield test_driver
	
	wl.close_platform()
	driverImpl.driver = None
	logger.info("app关闭~~~!")
# -*- encoding: utf-8 -*-
"""
@File: base_func.py
@Author: cyl
@Desc: driver以及基础行为封装
"""
import time
import win32api
import win32con
from utils.my_types import T, List
from common.driver_impl import driverImpl
from common.m_eles import getModelElement
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec


# noinspection PyMethodMayBeStatic
class BaseModelFunc:
    """driver以及基础行为封装"""
    def element_wait(self, driver=None, by_type: str = "xpath", formula: str = "", timeout: int = 3) -> T:
        """
        显示等待, 默认xpath
        :param driver: Windows driver
        :param by_type: _id xpath name className linkTest tagName partialLinkText css
        :param formula: elements.key
        :param timeout: wait time setting, default 3s
        """
        # 获取xpath(根据自己实际业务封装,如果没有可以直接将xptah作为形参传入)
        xpath: str | int = getModelElement(formula)
        driver = driverImpl.driver if driver is None else ...
        handles: list = driver.window_handles
        if not handles:
            return
        if len(handles) >= 1:
            driver.switch_to.window(handles[0])
        match by_type:
            case "_id":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.ID, xpath)))
            case "xpath":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.XPATH, xpath)))
            case "name":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.NAME, xpath)))
            case "className":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.CLASS_NAME, xpath)))
            case "linkTest":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.LINK_TEXT, xpath)))
            case "tagName":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.TAG_NAME, xpath)))
            case "partialLinkText":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.PARTIAL_LINK_TEXT, xpath)))
            case "css":
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.CSS_SELECTOR, xpath)))
            case _:
                ele = WebDriverWait(driver, timeout, 0.5).until(ec.presence_of_element_located((By.XPATH, xpath)))
        driver.switch_to.window(handles[-1])
        return ele

baseFunc: BaseModelFunc = BaseModelFunc()        
# -*- encoding: utf-8 -*-
"""
@File: m_eles_setting.py
@Author: cyl
@Desc: 实际应用中的方法调用
"""
from settings import app_cof
from utils.base_gui import bat
from utils.base_func import baseFunc


# noinspection PyMethodMayBeStatic
class ModuleElesSetting:
    """设置"""
    def apply_and_determine(
            self,
            x_point: tuple = (1763, 852),
            y_point: tuple = (1627, 855),
            is_point: bool = app_cof.isPoint):
        """
        设置-应用并确定
        :param x_point: 应用
        :param y_point: 确认
        :param is_point: 是否使用坐标点
        """
        if is_point:
            bat.click(*x_point).click(*y_point)
        else:
            baseFunc.element_wait(formula="SETUP_APPLICATION").click()
            baseFunc.element_wait(formula="POLYLINE_OK").click()

到了这里,关于【python】windows客户端的ui自动化框架搭建及使用(winappdriver)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Selenium搭建UI自动化测试框架

    自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。 在开始搭建UI自动化测试框架之前,需要先安装Python和Selenium。可以从Python官网下载Python安装

    2023年04月27日
    浏览(59)
  • python appium UI 自动化测试框架讨论

    目录 前言: 框架共性总结 Auto_Analysis 权限弹窗识别 前言:  Python Appium UI自动化测试框架是一种用于测试移动应用程序的工具,它结合了Python编程语言和Appium测试框架的功能。 框架共性总结 1 自动找设备 连接设备 2 自动启 appium server 3 用例框架 unittest pytest 4 用例组织 yml 读

    2024年02月16日
    浏览(59)
  • webUI自动化之基本框架搭建(python + selenium + unittest)_python ui自动框架

    3 from selenium.webdriver.common.by import By 4 5 driver = webdriver.Chrome() 6 driver.get(r’https://xxx’) # 打开浏览器并访问该链接,这里的链接不便展示哈 7 driver.maximize_window() 8 9 # 定位元素并操作 10 driver.find_element(By.NAME, ‘username’).send_keys(‘luoyang’) 11 driver.find_element(By.NAME, ‘password’).send

    2024年04月17日
    浏览(53)
  • python进行windows系统UI自动化之【pyautoit】

    其实,用python进行windows端UI自动化的库有很多,比如pywinauto等,本文介绍一个使用autoit3来实现的 pyautoit 库。 pyautoit 是一个用python写的基于AutoItX3.dll的接口库,用来进行windows窗口的一系列操作,也支持鼠标键盘的操作。 AutoIt现在最新版是V3版本,这是一个类似BASIC脚本语言的

    2024年02月08日
    浏览(40)
  • 基于Python+Pytest+Playwright+BDD的UI自动化测试框架

    本框架是基于Python+Pytest+Playwright+BDD的UI自动化测试框架。 测试社区地址: https://www.gitlink.org.cn/zone/tester 入群二维码:https://www.gitlink.org.cn/floraachy/apiautotest/issues/1 对于框架任何问题,欢迎联系我! 支持通过命令行指定浏览器,选择需要运行的浏览器。 支持通过命令行指定运行

    2024年02月07日
    浏览(56)
  • UI自动化概念+Web自动化测试框架

    1.UI自动化测试概念:我们先明确什么是UI UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 2.为什么对UI采用自动化

    2024年02月06日
    浏览(78)
  • UI自动化概念 + Web自动化测试框架介绍

    UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 从不同的阶段或层次来说,自动化测试可以分为单元测试、接口

    2024年02月08日
    浏览(70)
  • Ui自动化概念+Web自动化测试框架介绍

    目录 UI 1.UI自动化测试概念:我们先明确什么是UI 2.为什么对UI采用自动化测试? 3.什么项目适合做UI自动化测试? 4.UI自动化测试介入时机 5.UI自动化测试所属分类 Web自动化测试框架介绍 2.Selenium框架介绍及特点: Web自动化测试环境搭建 2.元素定位(一) idclassname,tagname定位 link text与

    2023年04月21日
    浏览(54)
  • 【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

    本文大纲截图: UnitTest框架: PyTest框架: 框架: 框架英文单词 framework,为解决一类事情的功能的集合。需要按照框架的规定(套路)去书写代码。 概念:UnitTest是python自带的一个单元测试框架,用它来做单元测试 自带的框架:不需要单独按照,只要安装了 python就可以用

    2023年04月09日
    浏览(58)
  • selenium-基于UI的自动化测试框架

      自动化测试是指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果,将人为驱动的测试行为转化为机器执行的过程   自动化测试包括UI自动化、接口自动化、单元测试自动化。按照这个金字塔模型来进行自动化测试

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包