Appium系列分享
Appium自动化(七)通过脚本自动化获取apk的包名和对应启动activity
Appium自动化(八)通过脚本自动化获取设备deviceName和platformVersion
Appium自动化(十二)Appium+unittest组织测试用例
Appium系列(十七)将Appium服务端口号通过参数传递给测试用例
Appium系列(二十一)优化待测apk的传入和desired_caps内容优化
Appium系列(二十一)操作IOS设备利器——tidevice
Appium系列(二十二)基于tidevice封装IOS的adb命令
前言
在前面的分享中,我们已经对于IOS设备的操作做了一些简单的封装,接下来我们看下,我们如何去改造我们现有的支持IOS设备呢。
正文
那么我们在改造的时候,应该如何来判断是什么设备呢,应该有一个配置来区分是IOS还是Android设备执行。我们来做一个配置来控制,应该放在config.py
test_phone_type="IOS"#Android修改下即可
接下来我们来看代码那里需要改造
我们想到的应该是启动的时候,是否需要加些判断呢,我们去看下,我们在run.py发现呢,这里的run方法在获取设备的时候需要做些判断,我们先在这里做改造。
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方法。这里也需要改造,我们简单改造下
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
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的支持。改造后如下
'''
@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的改造,但是现在的代码看起来还是很乱的,接下来,我们会对上面的代码做下简单的优化。