前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium系列(二十三)改造框架代码适配IOS自动化

Appium系列(二十三)改造框架代码适配IOS自动化

作者头像
雷子
发布2021-04-15 15:54:31
5960
发布2021-04-15 15:54:31
举报

Appium系列分享

Appium自动化(一)常用的API接口

Appium自动化(二)常用的API接口

Appium自动化(三)常用的API接口

Appium自动化(四)常用的API接口

Appium自动化(五)常用的API接口

Appium自动化(六)Appium启动app

Appium自动化(七)通过脚本自动化获取apk的包名和对应启动activity

Appium自动化(八)通过脚本自动化获取设备deviceName和platformVersion

Appium自动化(九)如何处理多设备的启动参数

Appium自动化(十)如何控制多设备并行执行测试用例

Appium自动化(十一)实现一个简单的登陆功能

Appium自动化(十二)Appium+unittest组织测试用例

Appium自动化(十三)引入ddt管理测试用例数据

Appium自动化(十四)引入分层化思想优化代码

Appium系列(十五)继续利用分层化思想优化代码

Appium系列(十六)如何维护用例中定位元素

Appium系列(十七)将Appium服务端口号通过参数传递给测试用例

Appium系列(十八)多设备并行执行测试用例

Appium系列(十九)解决多机并行中的问题

Appium系列(二十)分析现有不足,打造牛逼测试框架

Appium系列(二十一)优化待测apk的传入和desired_caps内容优化

Appium系列(二十一)操作IOS设备利器——tidevice

Appium系列(二十二)基于tidevice封装IOS的adb命令

前言

在前面的分享中,我们已经对于IOS设备的操作做了一些简单的封装,接下来我们看下,我们如何去改造我们现有的支持IOS设备呢。

正文

那么我们在改造的时候,应该如何来判断是什么设备呢,应该有一个配置来区分是IOS还是Android设备执行。我们来做一个配置来控制,应该放在config.py

代码语言:javascript
复制
test_phone_type="IOS"#Android修改下即可

接下来我们来看代码那里需要改造

我们想到的应该是启动的时候,是否需要加些判断呢,我们去看下,我们在run.py发现呢,这里的run方法在获取设备的时候需要做些判断,我们先在这里做改造。

代码语言:javascript
复制
from config import test_phone_type
from common.iosadbtool import *
改造后:
def run():
    if test_phone_type=="Android":
        devices=get_devices()
    elif test_phone_type=="IOS":
        devices=getdeviceslist()
    else:
        devices=[]

    port_list = []
    if len(devices) > 0:
        for dev in devices:
            app = {}
            app["devices"] = dev
            port = str(random.randint(5641, 5646))
            app["port"] = port
            port_list.append(port)
            l_devices.append(app)
        start(port_list)
        runnerPool(l_devices)
        try:
            stop_server(port_list)
        except Exception as e:
            print("关闭服务失败,原因:%s" % e)
    else:
        print('请链接测试设备')

接下来呢,我们再看下,在start方法中没有使用

那么我们接下来看看runnerPool方法。这里也需要改造,我们简单改造下

代码语言:javascript
复制
from common.iosadbtool import getplatfoemversion as getiosplatform
def runnerPool(getDevices):
    '''
       根据链接的设备生成不同的dict
       然后放到设备的list里面
       设备list的长度产生进程池大小
    '''

    devices_Pool = []
    if test_phone_type=="Android":
        for i in range(0, len(getDevices)):
            _pool = []
            _initApp = {}
            device=getDevices[i]
            apkname=get_apkname(apk_path)
            desired_caps = {
                'platformName': 'Android',
                'deviceName':device['devices'] ,  # adb  deivces
                'platformVersion': getPlatForm(getDevices[i]['devices']),  # 从设置中可以获取
                'appPackage': apkname ,  # 包名
                'udid': getDevices[i]['devices'],
                'appActivity': get_apk_lautc(apk_path),  # apk的launcherActivity
                # 'skipServerInstallation': True
            }
            _initApp['deviceName']=device['devices']
            _initApp["port"] = device["port"]
            _initApp['appPackage']=apkname
            _initApp['desired_caps']=desired_caps
            _pool.append(_initApp)
            devices_Pool.append(_initApp)
    elif test_phone_type=="IOS":
        for i in range(0, len(getDevices)):
            _pool = []
            _initApp = {}
            device=getDevices[i]
            desired_caps = {
                'platformName': 'IOS',
                'deviceName':device['devices'] ,  # adb  deivces
                'platformVersion': getiosplatform(getDevices[i]['devices']),  # 从设置中可以获取
                'appPackage': "待做" ,  # 包名
                'udid': getDevices[i]['devices'],
                'appActivity':"待做",  # apk的launcherActivity
                # 'skipServerInstallation': True
            }
            _initApp['deviceName']=device['devices']
            _initApp["port"] = device["port"]
            _initApp['appPackage']="待做"
            _initApp['desired_caps']=desired_caps
            _pool.append(_initApp)
            devices_Pool.append(_initApp)

    pool = Pool(len(devices_Pool))
    pool.map_async(runnerCaseApp,devices_Pool)
    pool.close()
    pool.join()

目前我们已经对runnerPool改造,接下来,我们看runnerCaseApp

代码语言:javascript
复制
def runnerCaseApp(devices):
    '''利用unittest的testsuite来组织测试用例'''
    test_suit = unittest.TestSuite()
    test_suit.addTest(Parmer.parametrize(testcase_klass=testCase, parame=devices))  # 扩展的其他的测试用例均这样添加
    unittest.TextTestRunner(verbosity=1).run(test_suit)

我们看下里面的测试用例,目前这个方法没有需要改造的。测试用例中需要改造。

增加iosapp的支持。改造后如下

代码语言:javascript
复制
'''
  @Description      
  @auther         leizi
'''
from time import  sleep
from common.adbtool import *
from ddt import ddt,file_data
from appium import  webdriver
from common.pyyaml import  getyaml
from common.parame import Parmer
from selenium.common.exceptions import NoSuchElementException
from config import apk_path,login_element
element=getyaml(login_element)

from  config import test_phone_type
from common.iosadbtool import isinstallapk as iosisinstall
from common.iosadbtool import installapk as installios
@ddt
class testCase(Parmer):
    def setUp(self) -> None:
        is_first_install = False
        # 1.判断是否安装app
        if test_phone_type=="Android":
            is_install = isinstallapk(self.parme['appPackage'], self.parme['deviceName'])
            if is_install is False:
                # 2.如果没有安装,则安装
                installapk(apk_path, self.parme['deviceName'])
                is_first_install = True
        elif test_phone_type=="IOS":
            is_install = iosisinstall(self.parme['appPackage'], self.parme['deviceName'])
            if is_install is False:
                # 2.如果没有安装,则安装
                installios(apk_path, self.parme['deviceName'])
                is_first_install = True
        desired_caps=self.parme['desired_caps']
        self.driver = webdriver.Remote('http://0.0.0.0:%s/wd/hub'%str(self.parme['port']), desired_caps)
        sleep(10)
        # 启动同意用户协议
        agree=element['agreeelement']
        self.driver.find_element_by_id(agree).click()
        if is_first_install:
            # 首次安装需要加载文件
            sleep(50)
        sleep(11)
        self.driver.find_element_by_id(element['opearelement']).click()
        sleep(5)
        try:
            self.driver.find_element_by_xpath(element['logintextclik']).click()
        except NoSuchElementException as e:
            print(e)

    def tearDown(self) -> None:
        self.driver.quit()
        sleep(20)
    @file_data("../data/casedata/logincase.yaml")
    def testlogin(self,user,user_password,msg):
        sleep(10)
        username = self.driver.find_element_by_id(element['usernameedit'])
        username.clear()
        username.send_keys(user)
        password = self.driver.find_element_by_id(element['passwordedit'])
        password.clear()
        password.send_keys(user_password)
        login = self.driver.find_element_by_id(element['loginbtn'])
        login.click()
        try:
            self.driver.find_element_by_id(element['assertelement'])
            self.assertTrue(False,msg=msg)
        except:
            self.assertTrue(True,msg=msg)

这样我们就简单的完成来对IOS的改造,但是现在的代码看起来还是很乱的,接下来,我们会对上面的代码做下简单的优化。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档