因为 setup() 里写明 capabilities.setCapability("appActivity", ".StartActivity");
如果测试一个 app 里的几个流程,必须每次都从 login 登录开始吗(loginActivity)?也就是每个流程都要从 login 开始?
因为我试了下,在 setup 里启动 appActivity 设置成了 非 startactivity(如 mainActivity),然后手动登录到 mainActivity,再运行测试方法,会提示非法 token,这显然是没有获取到 session id。也就是必须要在登陆时同时取得服务器端传回来的 sessionid 进行会话才可以。
如果是这样,那么所有的流程测试都必须以 login 开始了,是这样吗?
自然是不行的,一个 APP 只有一个启动 activity,其他都不可以作为启动条件
@sainthunter 登录一次, 下次不用再登陆吧?
#4 楼 @jinjun0620 怎么会不用再登录呢?都已经 logout 了
@sainthunter 你想问的重点是什么? 是不想每个 case 跑 login, logout? 还是什么?
#6 楼 @jinjun0620 当然不想每个 case 都跑 login 和 logout,比如有一个朋友圈 activity,如果可以直接从这一页开始测试当然最方便;但是我之前回复里说了,1.好像不从 startactivity 开始就不能启动;2.不从 login 开始就没有 sessionid;这两点就使得我不能从任意 activity 开始测试,而是每测一个模块功能就必须从 login 开始测。
@sainthunter 不知道你用的是 testng
还是 junit. Testng 为例: 把 login 放@beforesuite, 把 logout 放@aftersuite里就可以不用每次都运行登陆及登出了。
#8 楼 @jinjun0620 谢回复,这也是我在第一个回复里写的做法。但是这样还是等于每次测试都要从 login 跑起,只是 login 部分不用每次都写。我提这个问题的实质是想问,有没有不用从 login 登录,直接测试 app 里任何一个 activity 的方法。
#9 楼 @sainthunter 想法很好,但是不行的。
activity 的启动多有依赖 intent 里的参数,单独启动问题多多。
建议还是走 before after 的形式。
大部分 app ,比如 qq :
1、安装后首次启动,需要登录
2、登录后,退出(结束进程),再打开不需要登录
3、登录后,注销账户后退出,再打开需要登录
4、登录后,退出,清除数据(或卸载),再打开需要登录
符合这几条的 app ,如果测试过程是:
1、第一条用例开始时登录过。
2、第五条用例结束时注销。
3、二、三、四条用例,没有注销、没有清除数据(或卸载)的操作。
那二、三、四条用例不用从登录开始。
一个 app,在 AndroidManifest.xml 里,只能注册一个主 activity ,其他 app (比如桌面)打开它会进入这个 activity 。Appium 的 Capability 也是设定这个。
非主 activity,如果注册了 intent 或 android:exported=“true" ,也可以被其他 app 调用,比如调用相机拍照,比如用 Appium 的 driver.startActivity。
#11 楼 @sanlengjingvv 谢谢回复的如此详细。那么假如测试二、三、四条用例,保持 app 登录在 mainactivity 的情况下,如何测试?我试了把 before 里初始化的东西改成从 mainactivity 启动,然后运行,会报错。也就是说二、三、四只能和一五结合起来测试,没法单独直接测试。
appium 怎么判断元素能不能点击啊?
有个疑问,能不能先手动移动到 app 的某个 activity 页面,然后启动 appium 捕获当前 activity 页面继续执行脚本?这个功能在调试脚本时很有用,无需从头开始执行。目前 driver.startActivity 只能重新打开 app,有没有办法实现以上想法?
#15 楼 @jinshengxun 你现在解决了么,我现在也遇到了这个问题
我也是遇到了。要跳转到指定 Activity,调用 startActivity,报错 AttributeError: 'WebDriver' object has no attribute 'startActivity'
加上 desired_caps['noReset'] = 'True'
1 from appium import webdriver
2 from time import sleep
3 from appium.webdriver.common.touch_action import TouchAction
4 desired_caps = {}
5 desired_caps['platformName'] = 'Android'
6 desired_caps['platformVersion'] = '9.0'
7 desired_caps['deviceName'] = 'xxxxx'
8 desired_caps['appPackage'] = 'com.xxxx'
9 desired_caps['appActivity'] = '.MainActivity'
10 desired_caps['noReset'] = 'True'
11
12 driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
13 sleep(5)