Appium Appium 测试 app 中流程,每次都要从 startActivity 开始?不能指定从任一 Activity 开始吗?

hunter · June 20, 2015 · Last by Eddy replied at November 29, 2023 · 3404 hits

因为 setup() 里写明 capabilities.setCapability("appActivity", ".StartActivity");
如果测试一个 app 里的几个流程,必须每次都从 login 登录开始吗(loginActivity)?也就是每个流程都要从 login 开始?

因为我试了下,在 setup 里启动 appActivity 设置成了 非 startactivity(如 mainActivity),然后手动登录到 mainActivity,再运行测试方法,会提示非法 token,这显然是没有获取到 session id。也就是必须要在登陆时同时取得服务器端传回来的 sessionid 进行会话才可以。

如果是这样,那么所有的流程测试都必须以 login 开始了,是这样吗?

共收到 19 条回复 时间 点赞
hunter #1 · June 20, 2015 Author

我能想到的解决办法是测试每个流程时,把 login 操作都写在 setup() 里,一个流程对应一个测试类(包括 1 个@Before 的 setup(),若干个@Test 测试方法以及 1 个@After 的 teardown())。如果是可以直接从任一个 activity 开始测试就方便多了,但怕是不行吧

自然是不行的,一个 APP 只有一个启动 activity,其他都不可以作为启动条件

hunter #3 · June 20, 2015 Author

#2 楼 @doctorq 谢谢回复,那显然每次都要从 startactivity 启动,然后测试过程也必定会按照 “login - 登陆后测试其他功能 - logout” 这样的测试过程来组织每一个 test case 了,不知道我理解的对吗?

@sainthunter 登录一次, 下次不用再登陆吧?

hunter #5 · June 20, 2015 Author

#4 楼 @jinjun0620 怎么会不用再登录呢?都已经 logout 了

@sainthunter 你想问的重点是什么? 是不想每个 case 跑 login, logout? 还是什么?

hunter #7 · June 20, 2015 Author

#6 楼 @jinjun0620 当然不想每个 case 都跑 login 和 logout,比如有一个朋友圈 activity,如果可以直接从这一页开始测试当然最方便;但是我之前回复里说了,1.好像不从 startactivity 开始就不能启动;2.不从 login 开始就没有 sessionid;这两点就使得我不能从任意 activity 开始测试,而是每测一个模块功能就必须从 login 开始测。

@sainthunter 不知道你用的是 testng
还是 junit. Testng 为例: 把 login 放@beforesuite, 把 logout 放@aftersuite里就可以不用每次都运行登陆及登出了。

hunter #9 · June 20, 2015 Author

#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。

hunter #12 · June 21, 2015 Author

#10 楼 @anikikun 谢谢回复。看来只能把 login 写到 Before 一劳永逸了

hunter #13 · June 21, 2015 Author

#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'

金圣勋 回复

有办法吗,我也遇到这个问题 ,每次执行时 app 都要重启

加上 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)
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up