测试基础 #Appium 新手常见问题 # 欢迎各位及时补充和持续更新,盖楼吧!

Archer · 2014年02月21日 · 最后由 mhsj183 回复于 2015年04月07日 · 3997 次阅读
本帖已被设为精华帖!

看见 TesterHome 中好多 Appium 的新手问题,在这里简单作一些归类和总结,包括一些务实的技巧和方法,希望对新人有帮助,上手 Appium 开始写代码的时候个人建议好好学习下 Selenium,熟练使用 Selenium 的 API 对你玩转 Appium 有相当大(质的飞跃)的帮助!

本帖可以持续补充和持续更新,旨在帮助新人扫除在折腾 Appium 的时候出现的各种常见入门问题。

友情提醒:
上手写脚本时,GitHub 上 Appium 源码里面的 SampleCode 中都是一些非常不错的入门例子。

玩转 Appium 可能需要了解的知识:

  1. Python/Java 等语言基础 (很重要,这是必备的) 2.安卓/IOS 应用的相关基础知识(包括 Activity 等的基本概念) ----------- Activity 的问题 TesterHome 里问的人有很多,见下文。 3.一些 SDK 包中常用的调试命令和技巧 (最起码能简单搭建起模拟器什么的,调试真机的时候,别忘了打开 USB 调试模式。) ......

Appium 新手常见问题

1.启动脚本的时候,提示 apk 包 Could not make a String,这是在释放 stings.json 的时候出现的错误,一般是由于 APK 包损坏导致的,确认一下你的 APK 包是否损坏,最实在的验证方法是直接将 APK 扔到手机里点一下,看看会不会提示解压 APK 包时发生错误。

2.Activity 错误中两类比较常见:

一类是包名或者 Activity 参数直接没有写对,会提示:不存在 Activity,建议在写脚本的时候在 Activity 中写上完整的名字,不要缩写,严谨一些不会错。完整包名类似 com.xxx.xxx.Activity。

另外一类是没有写对启动 Activity,虽然你写对了 Activity,但是你写的不是启动 Activity,会报一个"XXX Never XXX"的错误。

包名参数和 Activity 这两个参数可以在 AndroidManifest.xml 中清楚的看到

关于如何获取 AndroidManifest.xml,可以参考一下 apktool 的用法,使用起来非常简单

http://code.google.com/p/android-apktool/

包名在这里看:
<manifest android:versionCode="12" android:versionName="2.6.0.0.0" package="com.xxx.xxx"
一般位于 XML 定义的下一行

启动 Activity 在这里看,带有 LAUNCHER 关键字





那么,本例中就是 com.xxx.xxx.SplashActivity

3.关于如何定位元素的问题

如果作为 Appium 的玩家,你问出这样的问题,我认为你是 Selenium 的基础不牢靠。
id,classname,name,xpath,tagname......,其实很多元素定位的方法都跟 DOM 有关,如果对 Web 前端开发熟悉的童鞋上手这个不会有难度,当然了,对于 APP 来讲,你可以借助一些现成的工具进行嗅探

比如 uiautomatorviewer 不用单独下载,因为你在折腾 Appium 的时候你肯定会下载 SDK,很幸运,这玩意就是在 SDK 中自带的,所以如果你已经设置了环境变量的话,直接敲命令就可以启动他了。

4.关于如何等待一个元素的出现而不用一些笨拙粗暴的 time.sleep() 方法

我相信这是一个非常大众化的需求,我们需要等待某一个元素的出现以此来让我们的脚本进入到下一个 Step,这个等待方法最好能够设置超时时间,然后找到后迅速 callback。我们也很幸运!如果你仔细看 Selenium 的 API 你会发现这么一个东西:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0

ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
ff.quit()

原来,我们的 webdriver.support.ui 中有一个强大的 WebDriverWait 可以帮助我们完成这个事情。
他提供了一个极其实用的 until 方法,until 方法可以传入一个条件型的参数,这个条件型参数来自 selenium.webdriver.support 中的 expected_conditions,里面定义了一些call可调用的类,比如我们这里常用的
presence_of_element_located,意思就是等待某一元素出现(被定位到)

更多关于 API 上的惊喜可以猛戳这里:http://selenium-python.readthedocs.org/index.html

5.关于 Appium For Windows
不喜欢折腾的童鞋可以选择在 Windows 端快速入门 Appium,Appium For Windows 使用起来极其简单,下载完成后直接双击 Appium.exe,然后点击 LAUNCHER 即可。

6.想到了再写吧......

可能对你有帮助的一些在线 API 手册,这里我更多的是提供了 Python 的例子,其他同理。

Selenium Python Bindings http://selenium-python.readthedocs.org/index.html

Python 相关的一些知识

Python API / Nose / Unittest 官方例子中所用到的东西,很多新人看不懂 Setup 和 TearDown 是有原因的,(>_<)

共收到 12 条回复 时间 点赞

多谢总结. 写的很好

这样的一定要点赞

Archer #12 · 2014年02月24日 Author

#2 楼 @oscar 感谢支持~

谢谢分享,很受用

能不能加上安装时候出问题要怎么解决啊,这个才是最入门的啊

#5 楼 @yolanda 这个坛子里找找,我记得有人写过安装系列的教程了~

#4 楼 @cy_suncheng 文章最好支持 Fork......哈哈

学习学习啦!

学习了···

我想问下 appium+python 可以使用 unittest 框架吗?(个人觉得应该可以吧) 因为我想引出测试报告

感谢楼主!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册