zoukankan      html  css  js  c++  java
  • Appium+python自动化(三十九)-Appium自动化测试框架综合实践

    Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

     

    简介

      前边一直在分享testng的相关文章,看了点赞量和阅读数不是很高,宏哥猜测估计是大家确实是用不到或者不喜欢吧!不过宏哥经过一段时间的准备,appium的自动化测试框架完善的差不多了,那么接下来宏哥继续给小伙伴和童鞋们分享有关Appium自动化测试框架综合实践。想必小伙伴们有点等不及了吧!

    driver配置封装

    kyb_caps.yaml 配置表

    主要是一些配置信息的封装。

     参考代码

    platformName: Android
    #模拟器
    platformVersion: 5.1.1
    deviceName: 127.0.0.1:62025
    
    #mx4真机
    #platformVersion: 5.1
    #udid: 750BBKL22GDN
    #deviceName: MX4
    
    appname: kaoyan3.1.0.apk
    noReset: False
    unicodeKeyboard: True
    resetKeyboard: True
    
    appPackage: com.tal.kaoyan
    appActivity: com.tal.kaoyan.ui.activity.SplashActivity
    ip: 127.0.0.1
    port: 4723

    desired_caps.py

    主要是用来读取配置文件的信息的封装。

     参考代码

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.注释:包括记录创建时间,创建人,项目名称。
    '''
    Created on 2019-11-14
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自动化测试框架综合实践 - 代码实现
    '''
    # 3.导入模块
    from appium import webdriver
    import yaml
    import logging
    import logging.config
    import os
    
    CON_LOG='../config/log.conf'
    logging.config.fileConfig(CON_LOG)
    logging=logging.getLogger()
    
    def appium_desired():
        with open('../config/kyb_caps.yaml','r',encoding='utf-8') as file:
            data=yaml.load(file)
    
        desired_caps={}
        desired_caps['platformName']=data['platformName']
        desired_caps['platformVersion']=data['platformVersion']
        desired_caps['deviceName']=data['deviceName']
    
        base_dir = os.path.dirname(os.path.dirname(__file__))
        app_path = os.path.join(base_dir, 'app', data['appname'])
        desired_caps['app']=app_path
    
        desired_caps['appPackage']=data['appPackage']
        desired_caps['appActivity']=data['appActivity']
        desired_caps['noReset']=data['noReset']
    
    
        desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
        desired_caps['resetKeyboard']=data['resetKeyboard']
    
        logging.info('start app...')
        driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
        driver.implicitly_wait(8)
        return driver
    
    if __name__ == '__main__':
        appium_desired()
    
        # with open('../config/kyb_caps.yaml', 'r', encoding='utf-8') as file:
        #     data = yaml.load(file)
        #
        # base_dir=os.path.dirname(os.path.dirname(__file__))
        # print(os.path.dirname(__file__))
        # print(base_dir)
        #
        # app_path=os.path.join(base_dir,'app',data['appname'])
        # print(app_path)

    相对路径符号含义

    1. “.”表示当前目录
    2. “..” 表示当前目录的上一级目录。
    3. “./”表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
    4. “../”表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。

    基类封装

    baseView.py

    主要是一些元素定位方法的封装。

     参考代码

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.注释:包括记录创建时间,创建人,项目名称。
    '''
    Created on 2019-11-14
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自动化测试框架综合实践 - 代码实现
    '''
    # 3.导入模块
    class BaseView(object):
        def __init__(self,driver):
            self.driver=driver
    
        def find_element(self,*loc):
            return self.driver.find_element(*loc)
    
        def find_elements(self,*loc):
            return self.driver.find_elements(*loc)
    
        def get_window_size(self):
            return self.driver.get_window_size()
    
        def swipe(self,start_x, start_y, end_x, end_y, duration):
            return self.driver.swipe(start_x, start_y, end_x, end_y, duration)

    common公共模块封装

    公共方法封装 : common_fun.py

    主要是一些公共方法的封装。

    参考代码

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.注释:包括记录创建时间,创建人,项目名称。
    '''
    Created on 2019-11-13
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自动化测试框架综合实践 - 代码实现
    '''
    # 3.导入模块
    from kyb_testProject.baseView.baseView import BaseView
    from kyb_testProject.common.desired_caps import appium_desired
    from selenium.common.exceptions import NoSuchElementException
    import logging
    from selenium.webdriver.common.by import By
    import time,os
    import csv
    
    class Common(BaseView):
        cancelBtn=(By.ID,'android:id/button2')
        skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip')
        wemedia_cacel=(By.ID,'com.tal.kaoyan:id/view_wemedia_cacel')
    
    
        def check_cancelBtn(self):
            logging.info('==========check_cancelBtn=========')
            try:
                cancelBtn = self.driver.find_element(*self.cancelBtn)
            except NoSuchElementException:
                logging.info('no cancelBtn')
            else:
                cancelBtn.click()
    
        def check_skipBtn(self):
            logging.info('=========check skipBtn=============')
    
            try:
                skipBtn = self.driver.find_element(*self.skipBtn)
            except NoSuchElementException:
                logging.info('no skipBtn')
            else:
                skipBtn.click()
    
        def get_size(self):
            x = self.driver.get_window_size()['width']
            y = self.driver.get_window_size()['height']
            return x, y
    
        def swipeLeft(self):
            logging.info('swipeLeft')
            l = self.get_size()
            x1 = int(l[0] * 0.9)
            y1 = int(l[1] * 0.5)
            x2 = int(l[0] * 0.1)
            self.swipe(x1, y1, x2, y1, 1000)
    
        def getTime(self):
            self.now=time.strftime("%Y-%m-%d %H_%M_%S")
            return self.now
    
        def getScreenShot(self,module):
            time=self.getTime()
            image_file=os.path.dirname(os.path.dirname(__file__))+'/screenshots/%s_%s.png' %(module,time)
    
            logging.info('get %s screenshot' %module)
            self.driver.get_screenshot_as_file(image_file)
    
        def check_market_ad(self):
            logging.info('====check_market_ad====')
            try:
                element=self.driver.find_element(*self.wemedia_cacel)
            except NoSuchElementException:
                pass
            else:
                logging.info('close market ad')
                element.click()
    
        def get_csv_data(self,csv_file,line):
            logging.info('=====get_csv_data======')
            with open(csv_file,'r',encoding='utf-8-sig') as file:
                reader=csv.reader(file)
                for index,row in enumerate(reader,1):
                    if index==line:
                        return row
    
    if __name__ == '__main__':
        # driver=appium_desired()
        # com=Common(driver)
        # com.check_cancelBtn()
        # # com.check_skipBtn()
        # com.swipeLeft()
        # com.getScreenShot('startApp')
    
        list = ["这", "是", "一个", "测试", "数据"]
        # for i in range(len(list)):
            # print(i, list[i])
    
        list1 = ["这", "是", "一个", "测试", "数据"]
        # for index, item in enumerate(list1):
        #     print(index, item)

    小结

         好了,今天的分享就到这里。感谢您耐心的阅读!

  • 相关阅读:
    基于Springboot+Junit+Mockito做单元测试
    HeidiSQL工具导出导入MySQL数据
    各类开发生产环境缩写
    数据库连接工具HeidiSql介绍(支持MySQL,MariaDB,Microsoft SQL或PostgreSQL)
    中国战争片新的里程碑
    WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)
    自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)
    编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)
    Delphi 7验证XML合法性(利用DTD、XSD)
    C# 7.0
  • 原文地址:https://www.cnblogs.com/think90/p/11857252.html
Copyright © 2011-2022 走看看