在做自动化的过程中,我们都会发现每次都要从头开始点,一直要点到最后,如果中间出现错误,就需要重现去点,这样很麻烦也很费时间,今天我们来认识一种非常简单的方法,想要测试那个页面,我们就直接跳转到哪个页面进行测试。
Activity
Activity是Android系统中的四大组件之一,可以用于显示View。几乎所有的Activity都是对于用户进行交互的,如果还不懂的话,页面,我们所看到的app中的页面就属于一个Activity。其中Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器。
言归正传,我们继续说我们的想要每次都启动到我们想要的页面,既然前面也说了,每个页面都表示一个Activity,那么我么可以通过Activity的方式来进入
获取Activity的方法
通过adb方式获取Activity
# 通过adb方式获取Activity # 方法一: adb shell dumpsys activity top | findstr ACTIVITY # 方法二: adb shell dumpsys activity | findstr "mFocusedActivity" # 方法三: adb shell dumpsys activity activities
通过代码方式获取Activity
在代码中我们可以通过 driver.current_activity 方法获取
# coding:utf-8 from appium import webdriver import time desired_caps = { 'platformName': 'Android', # 测试版本 'deviceName': 'emulator-5554', # 设备名 'platformVersion': '5.1.1', # 系统版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.taobao.tao.welcome.Welcome", # 启动launch Activity "noReset": True, # 不清空数据 "unicodeKeyboard": True, # 使用Unicode编码方式发送字符串 "resetKeyboard": True, # 键盘隐藏起来 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) time.sleep(10) text = 'text("注册/登录")' driver.find_element_by_android_uiautomator(text).click() time.sleep(2) # 获取页面activity a = driver.current_activity print(a) ----------------结果----------------------- com.ali.user.mobile.login.ui.UserLoginActivity
通过Activity启动app对应页面
前面已经了解到了如何获取Activity的方法了,接下来我们就要继续通过Activity直接进入到app对应页面中
方法一:
直接在desired_caps的配置文件中把appActivity中改成对应的Activity,直接运行代码
# coding:utf-8 from appium import webdriver desired_caps = { 'platformName': 'Android', # 测试版本 'deviceName': 'emulator-5554', # 设备名 'platformVersion': '5.1.1', # 系统版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.ali.user.mobile.login.ui.UserLoginActivity", # 启动launch Activity "noReset": True, # 不清空数据 "unicodeKeyboard": True, # 使用Unicode编码方式发送字符串 "resetKeyboard": True, # 键盘隐藏起来 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
方法二:
启动完App后通过 start_activity 方法直接跳转到对应app
源码:
class Activities(webdriver.Remote): def start_activity(self, app_package, app_activity, **opts): """在测试期间打开任意活动。如果活动属于 另一个应用程序,启动该应用程序并打开活动。 这是一个android专用的方法。 参数: - app_package -包含要启动的活动的包。 - app_activity -要启动的活动。 - app_wait_package -启动此包后开始自动化(可选)。 - app_wait_activity -启动该活动后开始自动化(可选)。 - intent_action -启动意图(可选)。 - intent_category -意图类别开始(可选)。 - intent_flags -发送到意图的标志(可选)。 - optional_intent_arguments - intent的可选参数(可选) - dont_stop_app_on_reset -应用程序应该在重置时停止(可选)? """ data = { 'appPackage': app_package, 'appActivity': app_activity } arguments = { 'app_wait_package': 'appWaitPackage', 'app_wait_activity': 'appWaitActivity', 'intent_action': 'intentAction', 'intent_category': 'intentCategory', 'intent_flags': 'intentFlags', 'optional_intent_arguments': 'optionalIntentArguments', 'dont_stop_app_on_reset': 'dontStopAppOnReset' } for key, value in arguments.items(): if key in opts: data[value] = opts[key] self.execute(Command.START_ACTIVITY, data) return self
通过源码可以看出来,需要两个参数,一个是包名,一个是activity
# coding:utf-8 from appium import webdriver import time desired_caps = { 'platformName': 'Android', # 测试版本 'deviceName': 'emulator-5554', # 设备名 'platformVersion': '5.1.1', # 系统版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.taobao.tao.welcome.Welcome", # 启动launch Activity "noReset": True, # 不清空数据 "unicodeKeyboard": True, # 使用Unicode编码方式发送字符串 "resetKeyboard": True, # 键盘隐藏起来 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) time.sleep(10)
# 通过start_activity跳转 driver.start_activity('com.taobao.taobao','com.ali.user.mobile.login.ui.UserLoginActivity')
当然了start_activity不仅可以打开内部的app,如果我们想要调用其他的app也可以打开,直接输入包名和activity就可以了。这里安静就不给大家演示了。