移动测试开发 鸿蒙应用自动化测试实践
Appium 是移动端自动化测试非常有力的工具,那么对于在鸿蒙设备上自动化测试鸿蒙应用的支持情况如何呢?让我们一起实践看看吧。本文适用于有基础的 appium 安卓自动化测试经验的读者。
appium 连接
首先在连接的初始化设置上,与 Android 对比有少许区别,下图这样配置可以成功连接操作鸿蒙设备和鸿蒙应用。
class BaseTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.desired_caps = initDevices()
uninstallApp(cls.desired_caps['udid'], cls.PACKAGE_NAME)
installApp(cls.desired_caps['udid'], cls.apk_path)
cls.desired_caps['appPackage'] = cls.PACKAGE_NAME
cls.desired_caps['platformName'] = 'Android'
cls.desired_caps['noReset'] = True
cls.desired_caps['appActivity'] = 'MainAbilityShellActivity' #dumpsys activity | grep -i run |grep 360
cls.desired_caps['newCommandTimeout'] = "2000"
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', cls.desired_caps)
cls.driver.implicitly_wait(10)
PACKAGE_NAME:填写被测应用项目 config.json 下的 bundleName
apk_path:被测鸿蒙应用安装文件 xxx.hap 的路径。注意填写在这里只是记录路径,appium 不支持安装.hap 包
platformName:可以继续填写 Andorid
appActivity:即启动打开的页面,可以通过 dumpsys activity 获取
安装和卸载.hap 包
在鸿蒙设备上安装或卸载鸿蒙应用的.hap 包,则需要用到 hdc 命令。
HDC(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,pc 端开发机使用命令行工具 hdc_std(为方便起见,下文统称 hdc),该工具支持部署在 Windows/Linux/Mac 等系统与 OpenHarmony\HarmonyOS 设备(或模拟器)进行连接调试通信。
如果你熟悉 Android 开发,那么一定对 adb 不会陌生。有关 hdc 的内容,详见:https://developer.huawei.com/consumer/cn/forum/topic/0201763247640210925?fid=0103702273237520029
hdc 支持的命令有:
HarmonyOSSDK 的 toolchains 文件夹下 有一个 hdc.exe,把它的路径加入到系统环境变量 PATH 中,就可以在任意位置调用它了。这里我们在自动化测试脚本中利用它来安装和卸载鸿蒙的.hap 文件。
def installApp(serialNum, packageName):
try:
if "Success" in subprocess.check_output("hdc -t {} app install {}"
.format(serialNum, packageName),shell=True):
print(u"安装成功")
return True
else:
print(u"安装失败")
return False
except:
print(u"安装失败")
return False
def uninstallApp(serialNum, packageName):
try:
if "Success" in subprocess.check_output("hdc -t {} app uninstall {}"
.format(serialNum, packageName)):
print(u"卸载成功")
return True
else:
print(u"未安装该应用")
except:
pass
关于如何打包一个签名的可安装到真机的.hap 包,可参考
https://baijiahao.baidu.com/s?id=1718025528193522223&wfr=spider&for=pc
元素定位
1.通过 id 定位。注意对于 Android 应用我们之前是这样使用:
self.driver.find_element_by_id(BaseTests.PACKAGE_NAME + ":id/"+id).click()
而对于鸿蒙应用,则需要这样使用,参数直接填写 id 即可:
self.driver.find_element_by_id(id).click() #单击按键
self.driver.find_element_by_id("Id_text_field").send_keys("hello123") #输入框输入
- 通过 Name 定位 appium 版本在 1.5 以后就不再支持 ByName 的定位,在之后的版本如何支持 ByName 定位,适用于安卓,同样适用于鸿蒙。在使用 appium1.5 之后的版本时,当我们直接使用 ByName 方式去查找控件时,一定出现这个错误:
org.openqa.selenium.InvalidSelectorException: Locator Strategy 'name' is not supported for this session
通过修改 appium 源码解决问题,修改方法如下:
在本地找到 Appium 路径下的 driver.js 文件,在下图这行代码加上 “name” 属性,修改后保存,重新启动 appium 服务即可。
this.locatorStrategies = ['xpath', 'id', 'class name', 'accessibility id', '-android uiautomator','name'];
这样就可以通过 name 定位鸿蒙 app 的元素了:
self.driver.find_element_by_name("Flush").click()
获取日志
HiLog 是 OpenHarmony 日志系统,提供给系统框架、服务、以及应用打印日志,记录用户操作、系统运行状态等。在测试 Android 设备时,我们可以通过 driver.get_log(“logcat”) 获取 logcat 日志。如果直接传入参数 “hilog” 显然是不能捕获鸿蒙的 hilog 日志的,因为 appium 不支持,会出现如下错误:
需要使用 hdc hilog 命令获取日志,可参考:
order = 'hdc hilog'
pi = subprocess.Popen(order, shell=True, stdout=subprocess.PIPE)
for i in iter(pi.stdout.readline, 'b'):
print(i)
其它常用操作,如
self.driver.close_app()
self.driver.launch_app()
self.driver.hide_keyboard()
self.driver.background_app(5)
等,可正常使用。
所以对于应用 appium 测试鸿蒙设备上的鸿蒙应用,能用之前 Android 使用的方法的,则继续使用,能用 adb 完成的也可继续用 adb 实现。
不能实现的操作,则需要我们根据鸿蒙的特性和提供的相应开发工具去解决。
兼容性测试
现在部分真机平台还不支持上传和安装.hap 包,或者支持的话需要添加真机设备 uid 至证书才能安装。
可以选择在这个官方地址https://cn.devecostudio.huawei.com/console/testservice/remote
进行真机租用,不需要修改证书和添加 uid,直接上传我们的.hap 包即可安装,非常方便。可满足初步的兼容性测试需求。
以上是在鸿蒙应用自动化测试方面的初步实践,欢迎大家留言讨论。
参考文献:
https://developer.huawei.com/consumer/cn/forum/topic/0201763247640210925?fid=0103702273237520029
https://developer.harmonyos.com/
https://os.51cto.com/article/681159.html