Appium Appium 安卓环境的配置

恒温 · October 26, 2013 · Last by zxning replied at February 02, 2016 · 4503 hits
本帖已被设为精华帖!

环境准备

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

  • 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 条回复 时间 点赞

有必要顶下我的这篇文档

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

windows平台的呢

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

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

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

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

9Floor has been deleted

#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 · August 04, 2014 作者

#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 · August 04, 2014 作者

#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 · August 04, 2014 作者

#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 · August 04, 2014 作者

#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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up