在做自动化的过程中,我们都会发现每次都要从头开始点,一直要点到最后,如果中间出现错误,就需要重现去点,这样很麻烦也很费时间,今天我们来认识一种非常简单的方法,想要测试那个页面,我们就直接跳转到哪个页面进行测试。
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就可以了。这里安静就不给大家演示了。
来源:oschina
链接:https://my.oschina.net/u/4383286/blog/3232801