IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 2022-01-11 python+pytest+appnium编写UI自动化测试用例 -> 正文阅读

[开发测试]2022-01-11 python+pytest+appnium编写UI自动化测试用例

前提:已部署appnium客户端并启动服务
模拟场景:

  1. 进入app首页切换题库
  2. 进入我的页面识别用户名并断言
######定义一个Driver类,用来连接手机
class Driver:

    driver: WebDriver

    def start_android(self):
        desire_caps = {
            'platformName': 'Android',  # 手机型号
            'platformVersion': '10',  # 手机版本
            'deviceName': 'XXXXXXXXXXx',  # 设备名
            'appPackage': 'XXXXXXXXXXXX',  # 被测app名
            'appActivity': 'XXXXXXXXXXXXX',  # 启动AppActivity名
            'noReset': True,  # 不要重置app
            'automationName': 'uiautomator2',
        }
        # 启动app
        driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desire_caps)
        print("app启动成功...")
        driver.implicitly_wait(10)
        return driver

########封装元素定位方法
class BasePage:
    # 初始化
    def __init__(self,driver:WebDriver):
        self.driver = driver

    # 元素等待
    def wait(self,time):
        self.driver.implicitly_wait(time)

    # 查找元素
    def get_element(self,*locator):
        return self.driver.find_element(*locator)

    # 文本输入
    def send_keys(self,*locator,text):
        print('正在输入文本...')
        self.wait(3)
        self.get_element(*locator).click()
        self.get_elemenet(*locator).send_keys(text)
      

    # 元素点击
    def click_element(self,*locator):
        self.wait(3)
        self.get_element(*locator).click()
        

    # 获取元素属性attribute
    def get_element_attribute(self,attribute_name,*locator):
        return self.get_element(*locator).get_attribute(attribute_name)
        
    # 通过元素坐标识别控件并点击
    def tap_element(self,locator):
        self.driver.tap([[0,0],locator],500)

########封装需要被测的首页
class HomePage(King):
    # 首页
    change_subject1 = (By.XPATH, 'XXXXXXXXXX[@content-desc="综合笔试"]')  # 切换题库
    radio_button_me = (By.ID, 'XXXXXXXXXX:id/radio_button_me')  # 我的tab

    # 切换题库
    def change_subject(self):
        self.get_element(*self.change_subject1).click()
        return ChangeSubjectPage(self.driver)

    def to_mine(self):
        self.get_element(*self.radio_button_me).click()
        return MinePage(self.driver)

快速获得手机屏幕坐标的方法:
开启系统设置-开发者选项-指针设置

########封装需要被测的切换题库页面
class ChangeSubjectPage(BasePage):
    licedsed = (By.XPATH,'XXXXXXXXXX/android.widget.LinearLayout') # 执考题库
    tap_tv_next = [900, 2000] # 下一步/确定(坐标)
    rb_first = (By.ID,'XXXXXXXXXX:id/rb_first') # 第一次考试
    
    def to_comprehensive(self):
        self.click_element(*self.licedsed)
        self.tap_element(self.tap_tv_next)
        return ChangeSubjectPage(self.driver)


    def choose_first(self):
        self.get_element(*self.rb_first).click()
        self.tap_element(self.tap_tv_next)

###封装需要被测的我的和个人信息页面
class MinePage(BasePage):
    head = (By.ID,'XXXXXXXXXX:id/img_profile_head') # 用户头像
    
    def to_personal(self):
        self.click_element(*self.head)
        return PersonalPage(self.driver)

class PersonalPage(BasePage):
    # 个人信息页面
    name = (By.XPATH,'XXXXXXXXXX="昵称 请选择昵称"]/android.view.View[2]') # 昵称
    dt_back = (By.ID,'XXXXXXXXXX:id/dt_back')

    def get_name(self):
        return self.get_element_attribute('text',*self.name)
    def to_back(self):
        self.click_element(*self.dt_back)
        return MinePage(self.driver)
######测试切换题库的测试用例
class TestDemo:

    def setup_class(self):
        self.driver= Driver().start_android()
        self.homePage = HomePage(self.driver)


    # 测试切换题库
    def test_changesub(self):
        # 切换题库至执考综合笔试后回到首页
        self.homePage.change_subject().to_comprehensive().choose_first()

######### 测试验证用户名的测试用例
class TestDemo:

    def setup_class(self):
        self.driver = Driver().start_android()
        self.homePage = HomePage(self.driver)

    def test_personal(self):
        # 验证用户名
        person = self.homePage.to_mine().to_personal()
        assert person.get_name() == 'XXXXXXXXXX'
        person.to_back()

封装日志类,将日志以report方式输出

import logging

from config.pathName import PathName

pathName = PathName()
def logger():
    '''
    Logger 记录器,用于设置日志采集。
    Handler 处理器,将日志记录发送至合适的路径。
    Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
    Formatter 格式化器,指明了最终输出中日志的格式。
    '''

    # 创建一个日志记录器
    logger = logging.getLogger()
    # 每次调用后清除生成的handler,解决日志重复问题
    logger.handlers.clear()
    # 设置日志记录器的日志级别(此级别为日志记录器能记录到的最低级别)
    logger.setLevel(logging.INFO)

    # 创建日志处理器handler,用于写入日志文件
    logfile = pathName.get_file_path('log','log.txt')
    fh = logging.FileHandler(logfile,mode='a',encoding='utf-8')
    # 设置保存至文件的日志等级
    fh.setLevel(logging.INFO)

    # 定义handler的输出格式
    # asctime:日志的时间
    # filename:当前执行程序的名称
    # funcName:日志的当前函数
    # lineno:日志的当前行号
    # levelname:日志的级别
    # message:日志信息
    format = logging.Formatter(
        f"%(asctime)s | %(levelname)s | %(filename)s - %(funcName)s - [line:%(lineno)d]:   %(message)s"
    )
    # 设置写入文件的handler的日志格式
    fh.setFormatter(format)

    # 将handler添加只日志记录器logger里
    logger.addHandler(fh)

    # 创建一个handler用于控制台输出日志
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(format)
    logger.addHandler(ch)
    return logger


####获取需要输入日志的路径
class Path:
    """获取文件路径"""

    def get_file_path(self, path, file=None):
        """获取当前项目的路径"""
        if file is  None:
            path = os.path.join(os.path.dirname(os.path.dirname(__file__)), f"{path}")
        else:
            path = os.path.join(os.path.dirname(os.path.dirname(__file__)), f"{path}/{file}")
        # print(path)
        return path
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:17:03  更:2022-01-14 02:18:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:27:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码