环境:
appium 版本:1.2.1
系统 :android 4.4.2
设备 :Android Emulator(Intel HAXM)
背景:
------之前一直采用 robotium 对公司的产品进行 UI 的自动化测试。发觉 robotium 真心不错,测试应用和被测应用作为同一个进程的两个不同线程,测试线程能够访问被测应用的属性并进行设置,如 setText 等。做了以下工作:
------a) 我在 solo 类的基础上进行了简单的封装,采用面向对象的思想,加入操作后截图和延时等待的机制
------b) 结合 jenkins 进行用例的管理以及 junit 报告的展示,通过 bat 脚本进行控制,对失败用例进行重跑 (网易公司的 Orange 框架也实现了这个功能:http://qa.blog.163.com/blog/static/19014700220126254558638/)
:main
set className=%1
set functionName=%2
set /a b=b+1
echo %b%
adb shell am instrument -e class %className%#%functionName% -w packageName/com.zutubi.android.junitreport.JUnitReportTestRunner
adb pull /data/data/com.eg.android.packageName/files/junit-report.xml ./%functionName%.xml
findstr "AssertionFailedError" %functionName%.xml > nul && echo "try it again" || set b=0
if %b%==0 (
echo "testcase is ok"
goto :eof
) else (
if %b%==3 (
goto :eof
) else (
goto :main
)
)
-----但 robotium 的硬伤在于不能跨进程测试,而且如果没有被测试应用的签名,可能会有些用例(涉及到签名校验)无法验证。
-----随着公司对产品安全性要求的提高,产品在签名这一块有了更多的校验,这样会导致更多的用例无法校验。因此考虑其它的测试框架
appium 的学习
----a) Appium 是基于 UIAutomator 框架实现的
----b) Appium 测试进程与目标应用进程是分开的
----c) 对 webview 的测试
final Set<String> contextNames = driver.getContextHandles();
for (final String contextName : contextNames) {
System.out.println(contextName);
}
driver.context("WEBVIEW");
----d) 判断页面元素是否存在
public boolean elementExist(final By Locator) {
try {
driver.findElement(Locator);
return true;
} catch (final org.openqa.selenium.NoSuchElementException ex) {
return false;
}
}
----e) 滑动手势
final TouchAction gesture = new TouchAction(driver).press(startX, stratY)
.moveTo(startX, stratY + height)
.moveTo(startX, stratY + height + height)
.moveTo(startX + width, stratY + height + height).release();
gesture.perform();
待完成的问题 (路过的大侠,请指教一下)
1、应用的遍历测试。难点在于有些点击操作不会发生跳转,有些会,还没搞明白,要怎么处理
2、设置 DesiredCapabilities 时,如果有 apps,会识情况重装应用(即使已经安装好了),到底什么情况会重装应用,还没搞明白
3、设置 DesiredCapabilities 时,如果没有 apps,从日志来看,也不会清理目标机器上目标应用的运行环境,因为没有看到 pm clear