Appium Appium 安卓环境的配置

恒温 · 2013年10月26日 · 最后由 zxning 回复于 2016年02月02日 · 5290 次阅读
本帖已被设为精华帖!

环境准备

为了避免走弯路,我们先要确保三点:

  • Android SDK API >= 17 (Additional features require 18)
  • 环境变量 ANDROID_HOME 并确保 $ANDROID_HOME/platform-tools$ANDROID_HOME/tools 包含在 PATH 里。比如:

    export ANDROID_HOME="/Applications/adt-bundle-mac-x86_64-20130729/sdk"
    export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools
    
  • 如果用实体机测试,请确保系统是 4.1 以上的。

否则的话,你会遇到诸如此类的问题:

2.x 的真机

info: "/Applications/adt-bundle-mac-x86_64-20130729/sdk/platform-tools/adb" -s S5830f63efdb6 shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap
info: [ADB STDOUT] uiautomator: permission denied

4.0.x 的真机

info: "/Applications/adt-bundle-mac-x86_64-20130729/sdk/platform-tools/adb" -s HT1B4V803001 shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap
info: [ADB STDOUT] /system/bin/sh: uiautomator: not found

如果使用的是 Appium.dmg 安装的 Appium,那要设置 custom android sdk, 如图

这样 Appium 启动的时候可以使用 adb android 等命令。

这三点都做到的情况下,我们要看下 devices 的情况,因为运行 appium 测试脚本前要确保,devices 连接上了。所以要做的是:启动模拟器或者连上手机

  • 模拟器

    Make sure that hw.battery=yes in your AVD's config.ini.
    比如我的 AVD 叫 appium, 所以我就要去编辑 $HOME/.android/avd/appium.avd/config.ini 文件确保 hw.battery=yes

  • 真机

    Mac 上只要连接上 USB 就可以了, 无需安装驱动。不过我遇到了一个问题,海信的手机没法识别出来。
    这需要在 $HOME/.android/adb_usb.ini 里添加 vender id。

    ➜  ~  cat .android/adb_usb.ini
    # ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
    # USE 'android update adb' TO GENERATE.
    # 1 USB VENDOR ID PER LINE.
    0x109b # 海信手机的 VENDOR ID + 0x
    

    如果你发现你手机无法识别,去 http://developer.android.com/tools/device.html 寻找 ID。

然后我们运行 adb devices -l,

➜  ~  adb devices -l
List of devices attached
emulator-5554          device product:sdk model:sdk device:generic
e912s                  device usb:24100000

P.S Appium 支不支持多个 device 还没有定论。可以参考 https://groups.google.com/forum/#! topic/appium-discuss/xKCt4HrerrU

我们关掉模拟器,因为模拟器实在太慢了。(在模拟器上运行过 sample code, 都是能正常运行的。)

写个脚本玩玩

其实 sample code 里面的代码已经非常丰富了。就照搬一个吧。


# -*- coding: utf-8 -*-
import os
import glob
import unittest
from selenium import webdriver


class TestMyGame(unittest.TestCase):

    def setUp(self):
        app = os.path.abspath(glob.glob(os.path.dirname(__file__)
                                        + './*.apk')[0])
        desired_caps = {
            'device': 'appium',
            'app': app,
            'app-package': 'com.example.android.contactmanager',
            'app-activity': '.ContactManager'
        }

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub',
                                       desired_caps)

    def test(self):
        driver = self.driver
        el = driver.find_element_by_name("Add Contact")
        el.click()
        textfields = driver.find_elements_by_tag_name("textfield")
        textfields[0].send_keys("My Name")
        textfields[2].send_keys("someone@somewhere.com")
        driver.find_element_by_name("Save").click()

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()


ContactManager 是 android sample 里面的代码。 大家在安装 adt tool 的时候,可以获取。
我把 build 出来的 apk 和下面这个脚本放在一个目录下,然后运行。

在使用模拟器的时候,除了慢,工作的非常好。但是在海信的真机上就悲剧了。 因为在聚焦输入框的时候,弹出了搜狐输入法,干扰了 send_key 方法。github 上有 issue 记录,可惜没有好的解决方法。(https://github.com/appium/appium/issues/173

至此,整个安卓的流程都跑过来了。总的来说, Appium 目前还不是很成熟。不过应该是未来的方向。学起来总归是好的!


以上所有步骤,都在 mac 10.9 xcode 5.0.1 上运行通过。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 35 条回复 时间 点赞
恒温 #37 · 2013年12月18日 Author

有必要顶下我的这篇文档

这个已经被好多人当作范文学习了,我当初就是参照的这个~

windows 平台的呢

求指教:“我把 build 出来的 apk 和下面这个脚本放在一个目录下,然后运行。”,具体执行运行的命令和步骤是?刚接触 appium,一头雾水。

appium 中是怎么进行 assert 验证的?

#6 楼 @mandy_hit assert 是你的验证框架做的啊,和 appium 无关。

#5 楼 @mandy_hit android apk 的 build 可以参考 android 的发布。只要开发的签名就可以了。这是 python 脚本, python 的运行请参考 python 文档。

9楼 已删除

#8 楼 @lihuazhang 楼主你好,我想问一下为什么 apk 会找不到呢,我的项目里面添加进去了呀,运行报错后,文件夹里面的 apk 就真的会没有了,不知道是什么原因呀,求解救。

#7 楼 @lihuazhang 验证框架?比如有?Robotium 中包含了 assert 的 api 接口。appium 中使用什么进行验证呢?
求指导~

#11 楼 @mandy_hit appium 不提供 验证框架。 就像 webdriver 一样, 你需要用 xUnit

怎么收藏啊

#12 楼 @lihuazhang 现在还要求〉api17 吗?

#8 楼 @lihuazhang android 真机测试的时候 desired capabilityis 该如何设置呢? 具体的 app 这个参数如何设置?

恒温 #16 · 2014年08月04日 Author

#14 楼 @meiyu 现在不需要了。

Requirements
iOS

Mac OSX 10.7+
XCode 4.5+ w/ Command Line Tools

Android

Mac OSX 10.7+ or Windows 7+ or Linux
Android SDK ≥ 16 (SDK < 16 in Selendroid mode)

如果 sdk 小于 16, 就会用 Selendroid 模式。

恒温 #17 · 2014年08月04日 Author

#15 楼 @hobbs There's nothing extra to know about testing real Android devices: it works exactly the same as testing on emulators. Make sure that your device can connect to ADB and has Developer Mode enabled.

#17 楼 @lihuazhang

我设置的参数是这样的 但是每次运行 就会重新去连接设备,导致设备出现如下错误,不知道你遇到过这种问题没?(python)写的

#17 楼 @lihuazhang 补充一下 不是设备错误,是代码运行错误 具体是 setup 函数错误,文字太小 错误名称为 “WebDriverException: Message: u'A new session could not be created. (Original error: Command failed: protocol failure\r\n)' ”

恒温 #20 · 2014年08月04日 Author

#19 楼 @hobbs 贴你服务端的日志。能否别截图?

#20 楼 @lihuazhang 服务端的错误就是 protocol failure 不过我现在已经调通了 具体原理我不太清楚;我就说说我是怎么调通的:1.我在启动 appium 的时候加了个 --no-reset 参数; 2.我将 setup 函数中的 appPackage 参数和 appActivity 参数注释掉了,然后把 app 参数加上了,指定了一个 apk。 我猜测原来错误应该是我的 appActivity 参数的问题,因为我在模拟器中运行同样的代码的时候,模拟器报的错是: ” Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity“,供大家参考

恒温 #22 · 2014年08月04日 Author

#21 楼 @hobbs --no-reset 的意思就是不再重装应用。 launchable activity 的意思是说你给的 appActivity 不是 launcher

#22 楼 @lihuazhang 恩,了解,我在我们 testerhome 上的《appium 简明教程(3)》上看到,--no-reset 和--full-reset 参数是必须要带一个的;然后 appActivity 是不是只能找开发要?我反编译了开发包还是不知道哪个才是启动 Activity 因为太多了,不知道是哪一个

#23 楼 @hobbs appactivity 可以通过 hierachy viewer 监控,在程序运行时首次出现的 activity,或用反编译器解析出 manifest.xml,看 action.MAIN 标签对应的 activity

#21 楼 @hobbs 请问,之前的错误:” Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity“ ,你后来设置的 app 是哪里的.apk 文件呢,是模拟器里的吗,还是本地的呢,模拟器里的话路径怎么看呢?
我用模拟器,也遇到同样问题,请教

#25 楼 @711child 1.apk 路径是本地的。。。。在我的 E 盘中;2.我发现还有一种方法可以知道 appactivity,就是用 monkey 做测试的时候,可以从 monkey 的日志中得到。3.关于真机测试 protocol failure 的问题,我去网上查了一下,说是 USB 接口供电不足的问题,我换个线换个接口还真好了,具体原理不清楚,如果遇到这个问题,大家可以试一下

#26 楼 @hobbs 路径是本地的话,模拟器或者真机上也要安装 app 的吧

#27 楼 @711child 这,你可以试一下啊,不装的时候看会不会自动装,装了的话看是不是装的指定的包

#28 楼 @hobbs 好的,谢谢~

#18 楼 @hobbs 请问你的真机的 deviceName 是如何获取的?

#30 楼 @711child 手机连上 pc 在 cmd 命令行里边敲 adb devices 命令 前提你把 android sdk 的 platform-tools 目录加入到环境变量中了,如果没加,在 cmd 中进入该目录后 敲 adb devices

#31 楼 @hobbs 找到了,谢谢~ 貌似不改名字,仍然用 “Android Emulator” 也可以连接真机的,嘿嘿

怎么取消自动重启模拟器?开个模拟器太慢了

怎么设置使待测 APk 有访问网络的权限呢

还是走了弯路?Docker 可以直接支持这个环境的 Load 吗?让学习该工具的人,可以省去很多搭建的 effort,更多地关注工具本身的使用

#23 楼 @hobbs activity 可以通过命令去看 adb shell dumpsys activity activities

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